期中总结

一:常用命令及工具

文件和目录
cd /home 进入 '/ home' 目录'
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd 进入个人的主目录
cd ~user1 进入个人的主目录
cd - 返回上次所在的目录
pwd 显示工作路径
ls 查看目录中的文件
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
ls *[0-9]* 显示包含数字的文件名和目录名
tree 显示文件和目录由根目录开始的树形结构(1)
lstree 显示文件和目录由根目录开始的树形结构(2)
mkdir dir1 创建一个叫做 'dir1' 的目录'
mkdir dir1 dir2 同时创建两个目录
mkdir -p /tmp/dir1/dir2 创建一个目录树
rm -f file1 删除一个叫做 'file1' 的文件'
rmdir dir1 删除一个叫做 'dir1' 的目录'
rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容
rm -rf dir1 dir2 同时删除两个目录及它们的内容
mv dir1 new_dir 重命名/移动 一个目录
cp file1 file2 复制一个文件
cp dir/* . 复制一个目录下的所有文件到当前工作目录
cp -a /tmp/dir1 . 复制一个目录到当前工作目录
cp -a dir1 dir2 复制一个目录
ln -s file1 lnk1 创建一个指向文件或目录的软链接
ln file1 lnk1 创建一个指向文件或目录的物理链接
touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm)
file file1 outputs the mime type of the file as text
iconv -l 列出已知的编码
iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding.
find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick)



文件搜索
find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录
find / -user user1 搜索属于用户 'user1' 的文件和目录
find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件
find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件
find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限
find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备
locate \*.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令
whereis halt 显示一个二进制文件、源码或man的位置
which halt 显示一个二进制文件或可执行文件的完整路径

 

vim

vim是一个很好的编辑工具

 

gcc

  • GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。

GCC编译代码的过程如下:

gcc1

我们可以把编译过程分成四步,以编译hello.c生成可执行文件hello为例,如下图:

gcc2

  • 预处理:gcc –E hello.c –o hello.i;gcc –E调用cpp
  • 编 译:gcc –S hello.i –o hello.s;gcc –S调用ccl
  • 汇 编:gcc –c hello.s –o hello.o;gcc -c 调用as
  • 链 接:gcc hello.o –o hello ;gcc -o 调用ld

gdb

建议使用CGDB,比GDB好用,熟悉VC的调试方式,可以使用DDD。 注意使用GCC编译时要加“-g”参数。 参考gdb参考卡GDB最基本的命令有:

  • gdb programm(启动GDB)
  • b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
  • run 开始运行程序
  • bt 打印函数调用堆栈
  • p 查看变量值
  • c 从当前断点继续运行到下一个断点
  • n 单步运行
  • s 单步运行
  • quit 退出GDB

问题:GDB的n(next)命令让GDB执行下一行,然后暂停。 s(step)命令的作用与此类似,只是在函数调用时step命令会进入函数,那么实际使用中应该优先选用哪个?为什么?

其他几个我认为应该掌握的调试命令有:

  • display 跟踪变量值的改变
  • until 跳出循环
  • finish 跳出函数
  • help 帮助

Make和Makefile

这是实现自动化编译的好方法。

Makefile的一般写法:

一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:

  • 需要由make工具创建的目标体,通常是可执行文件和目标文件,也可以是要执行的动作,如‘clean’;

  • 要创建的目标体所依赖的文件,通常是编译目标文件所需要的其他文件。

  • 创建每个目标体时需要运行的命令,这一行必须以制表符TAB开头

 

静态库

这类库的名字一般是libxxx.a,xxx为库的名字。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

动态库

这类库的名字一般是libxxx.M.N.so,同样的xxx为库的名字,M是库的主版本号,N是库的副版本号。当然也可以不要版本号,但名字必须有。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

 

二:章节总结

第一章 计算机系统漫游

第一章的内容主要是带领我们初步认识Linux的一些基础知识

 

第二章 信息的表示和处理

 

(一)、三种重要的数字表示

 

无符号数:编码基于传统的二进制表示法(大于或者等于零的数字)。

 

补码:编码是表示有符号整数的最常见方式(为正或者为负的数字)。

 

浮点数:编码是表示实数的科学记数法的以二为基数的版本。

 

 

(二)、信息存储

 

计算机最小的可寻址的存储器单位——字节

 

一个字节的值域:00H-FFH

 

一、十六进制表示法

 

1. C表示法

 

0x0X开头的数字常量为十六进制

 

2. 进制转换

 

常用进制:二进制(B),十进制(D),八进制(O或者Q),十六进制(H)

二、字

 

字长决定虚拟地址空间的最大大小。

 

字长为w,虚拟地址的范围为1-(2^w-1)

 

三、数据大小

 

在不同字长的计算机中,相同的数据类型所占用的字节数并不相同,

 

gcc -m32 可以在64位机上生成32位的代码

 

 

四、寻址和字节顺序

 

1.小端法和大端法

 

  • 小端法:最低有效字节在前面——“高对高,低对低”
  • 大端法:最高有效字节在前面

    2.强制类型转换

  • typedef:命名数据类型
  • sizeof():返回类型的字节数(好处?便于移植——32位和64位的区别)

 

 

 

五、表示字符串

 

c语言中字符串被编码成为一个null(值为0)字符结尾的字符数组

 

命令man ascii:得到ASCII字符码表

 

 

 

六、表示代码

 

二进制代码在不同的操作系统上有不同的编码规则。所以二进制代码是不兼容的

 

 

 

七、布尔代数

 

1.最简单布尔代数:与& 或| 非~ 异或^(结果为0或1)

 

2.扩展的布尔运算:位向量的运算(结果仍是位向量)

 

 

 

 

八、位级运算

 

1.将位向量按位进行逻辑运算,结果仍是位向量

 

2.掩码运算

 

掩码:用来选择性的屏蔽信号,是一个位模式,表示从一个字中选出的位的集合。

 

 

 

第三章 程序的机器级表示

 

X86 寻址方式经历三代:
1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
2 8086的分段模式
3 IA32的带保护模式的平坦模式

 

 

 

机器级代码

 

计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节。

 

对于机器级编程来说,其中两种抽象尤为重要:

 

1、指令集体系结构(Instruction set architecture ISA)

 

它定义了处理器状态、指令的格式,以及每条指令对状态的影响。

 

IA32将程序的行为描述成好像每条指令时按顺序执行的,一条指令结束后,下一条再开始。(实际上处理器并发地执行许多指令,但是可以采取措施保证整体行为与ISA指定的顺序执行完全一致)

 

 

 

2、机器级程序使用的存储器地址是虚拟地址

 

提供的存储器模型看上去是一个非常大的字节数组。存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来。

 

 

 

程序存储器(program memory)包含:程序的可执行机器代码、操作系统需要的一些信息、栈、堆。程序存储器用虚拟地址来寻址(此虚拟地址不是机器级虚拟地址)。操作系统负责管理虚拟地址空间(程序级虚拟地址),将虚拟地址翻译成实际处理器存储器中的物理地址(机器级虚拟地址)。

 

 

在命令行上使用-S选项,就能得到C语言编译器产生的汇编代码。同时,使得GCC运行编译器,产生一个汇编文件code.s

 

汇编代码包含各种声明,如果我们使用"-c"命令行选项,GCC会编译并汇编该代码。产生二进制的code.o文件。二进制文件可以用od 命令查看,也可以用gdb的x命令查看。 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看。

 

 od code.o | more
 od code.o > code.txt

 

 

 

数据格式

 

16位的机器体系结构,Intel用术语"字(word)"表示16位数据类型。32位机器体系结构是从16位扩展过来,因此称32位数为“双字(double words)”,称64位数为“四字(quad words)”。大部分指令都是针对字节和双字操作的。

 

 

 

GAS中的每个操作指令都有一个字符后缀,用于表明操作数的大小。例如,mov有三种形式: movb(传送字节)、movw(传送字)、movl(传送双字)。其中float的后缀也是l,这不会与整数的混淆,因为浮点数使用的一组完全不同的指令和寄存器(浮点数寄存器)。

 

 

在IA32中央处理单元(CPU)中,包含了8个32位整数寄存器(如下图)。从图中可以看到在每个32位寄存器的名字前面都会有一个%e,在这里可以把e理解成extended(扩展的),因为早期的8086寄存器是16位,所以加e之后就变成32位的了。

 

 

 

Linux——平坦寻址方式:

 

ds,ss,cs等各段的段基地址都指向同一个地方,不管是数据段还是代码段,只要他们的偏移相等,那么他们就是寻址一样的物理内存,所以我们就只需指明偏移就能得到统一的寻址目标,不管这个目标是在代码段还是数据段或者堆栈段之中。

 

 

 

操作数:指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。

 

 

 

操作器的三种类型

 

立即数

寄存器

存储器

 

寄存器组是被所有过程共享的资源,但同一时刻只有一个过程激活,所以需要保证被调用者不会影响调用者在寄存器中的值。

 

将%eax, %edx, %ecx作为调用者保存寄存器,被调用者可以覆盖这些寄存器;

 

将%ebx, %ebi, %edi作为被调用者保存寄存器,需要在过程开始前pushl,在过程结束后popl到寄存器。

 

一.存放的可能

 

  1. 寄存器中
  2. 存储器中

 

 

 

二.立即数寻址方式

 

格式:$后加用标准c表示法表示的整数,如$0xAFF

 

  1. 寄存器寻址方式如%eax,与汇编中学过的AX寄存器类比。

 

三.存储器寻址方式

 

 

 

直接寻址方式

 

寄存器间接寻址方式

 

寄存器相对寻址方式

 

基址变址寻址方式

 

相对基址变址寻址方式

 

操作数指示符包括立即数,寄存器,存储器

 

栈帧结构

 

   栈由高地址向低地址方向增长。对单个过程分配的栈称为 栈帧。以两个指针来界定:帧指针%ebp和栈指针%esp.栈指针是不断变化的,所以大多数信息基于帧指针%ebp.(注意在我的电脑上,帧指针是%esp,所以在汇编时总是由 movl 8(%esp) %eax来得到参数)。

 

第四章 处理器体系结构

 

Y86指令集体系结构

指令集体系结构,包括定义各种状态元素、指令集和他们的编码、一组编程规范和异常事件处理。

 

程序员可见的状态:Y86程序中的每条指令都会读取或修改处理器状态的某些部分。

 

8个程序寄存器:%eax、%ebx、%ecx、%edx、%esi、%edi、%esp、%ebp。存储一个字。

 

存储器:可以理解为很大的字节数组,保存着程序和数据。Y86用虚拟地址来引用存储器位置。

 

物理地址:硬件和操作系统软件联合将虚拟地址翻译成实际,指明数据实际保存在存储器的那个位置

 

逻辑设计和硬件控制语言HCL

逻辑门

 

AND &&.    OR ||.   NOT

组合电路——将很多逻辑门组合成一个网,构建计算块。

!两个限制:

(1)       两个或多个逻辑门的输出不能连接在一起,否则它们可能会使线上的信号矛盾,可能会导致一个不合法的电压或电路故障;

(2)     这个网必须是无环的。回路会导致网络计算的函数有歧义。

 

 

 

第六章 存储器层次结构

 

存储器系统 是一个具有不同容量、成本和访问时间的存储设备的层次结构。

 

1.CPU寄存器:容量小,成本高,访问快
2.高速缓存存储器:CPU和主存之间的缓存区域
3.主存:磁盘上大容量,成本低,慢速

 

随机访问存储器分为两类:静态,动态。SRAM比DRAM更快,更贵。SRAM作为高速缓存存储器。DRAM作为主存。

局部性

 一个编写良好的计算机程序尝尝具有良好的局部性。也就是说,他们倾向于引用临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。

这种倾向性,被称为局部性原理,是一个持久的概念,对硬件和软件系统的设计和性能都有着极大的影响。

局部性通常有两种不同的形式:时间局部性和空间局部性。

两者的区别在于时间对的是一个存储器位置,空间对的是附近的存储器位置。

局限性

一个编写良好的计算机程序通常具有良好的局部性。他们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向称为局部性原理

局部性有两种不同形式:时间局部性空间局部性。

有良好局部性的程序比局部性差的程序运行的更快。

高速缓存存储器

高速缓存结构(S,E,B,m):高速缓存组、高速缓存行、块映射

一般而言,高速缓存的结构可以用元组(S,E,B,m)来描述。高速缓存的大小(或容量)C指的是所有块的大小的和。标记位和有效位不包括在内。因此,C=S*E*B.

 

收获:通过这一段时间的学习,或多或少得到了对计算机系统的一些理解和体会,不论学习任何课程,往往起步是最难的,从刚开始的迷茫,光是

安装虚拟机和系统都花费了好多的时间,解决了很多错误才得以实现。到克服心理上的抗拒,克服消积情绪。“物竞天择,适者生存”。起决定作用

的是不断修炼自己、勇攀高峰的意识,有了这种意识才能跨越初期进入课程学习的阻碍。然后通过一次次的实践,知道了解决问题的方法,慢慢正式

进入了学习的轨道。就学习内容而言,绝非仅仅凭单纯的死记硬背就能取得好成绩的,勤于思考,学会举一反三,对我们大有裨益。我们改变了学习的模式,

网络学习对我们教学观念,思想模式的转变很大,在传统教育模式中,是以教师为中心,教师通过讲授、板书及多种媒体的辅助,把教学内容传递给学生

或灌输给学生。老师是整个教学过程的主宰,学生则处于被动接受知识的地位。在这样一个模式下老师是主动施教者,学生是被动的外部刺激接受者即灌输对象,媒体是

 

辅助老师向学生灌输的工具,教材则是灌输的内容。而在我们这门课的课堂上,老师不但让同学们自主学习,还通过学生课堂演示的方法,帮助大家了解一些主要的难点,

同时,老师和同学们也都可以指出不足或弥补错误。通过这种方式,大家对于知识的理解和吸收更加的容易。

 

不足:学期开始,由于自己的懒惰,没有按时进入学习状态,导致自己从一开始就落下很多内容,从而在之后的学习上感到很吃力,跟不上,也吸收不了。

所以每次的测验总是徘徊于及格边缘。老师给我们安排了学习小组,之后我的很多疑问都得到了同学的帮助。而且自己的汇编也没有学好,涉及到汇编的内容,

学起来十分艰难,这就是老师说的欠债了。

 

posted on 2015-11-01 14:30  20135230潘俊洋  阅读(287)  评论(1编辑  收藏  举报