第八周期中的总结
期中总结
一、LINUX基本概念和操作
1、LINUX基本指令
1.常见解压命令:.a(tar xv) .zip(Unzip)
2.网络相关命令:ping(查看网络主机是否在工作)
3.LINUX系统服务包括:独立运行的系统服务和由xinet设定的系统服务
2、Linux下的C编程环境
1.LINUX下的C语言编程程序主要涉及编辑器、编译链接器、调试器及项目工具这四个工具。
2.信息就是位+上下文。
3.编辑器完成对所录入文字的编辑功能,常用VIM和EMACS。
4.编译链接器的主要工作有:源代码→预处理→编译器→汇编处理→目标代码→链接→可执行文件,常用GCC。
5.调试器常用GDB:设断点,单步跟踪。
6.项目管理器“make”,是一种控制编译或者重复编译的工具
7.ls(显示) cp(复制) rm(删除)mv(移动)cat,tail(查看),find(查找),grep(匹配),sort(排序)
8.正则表达基础:
|竖直分隔符表示选择
+前面的字符必须出现至少一次(1次或多次),例如,"goo+gle",可以匹配"gooogle","goooogle"等;
?表示前面的字符最多出现一次(0次或1次),例如,"colou?r",可以匹配"color"或者"colour";
*星号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次),例如,“0*42”可以匹配42、042、0042、00042等。
n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o
3、VIM编辑器
1.Vim的三种模式
命令行模式:移动光标来进行操作,但无法编辑;
插入模式:进行文字编辑,按ESC退回一般模式;
底行模式:进行文件保存、退出操作;也可以设置编辑环境,如列出行号;
2.命令行功能键
进入插入模式:i,a,o
删除所在行:dd;删除所在光标下n行:ndd;
删除所在字符:x;恢复前一个动作:u;
复制:yy;粘贴:p
3.底行功能键:
保存 :w
保存并退出 :wq
强制退出 q!
显示行号 :set nu
4、GCC编译器
1.编译系统:预处理→编译器→汇编器→链接器
2.操作系统内核是应用程序和硬件之间的媒介,它提供三个抽象:文件对I/O设备的抽象;虚拟存储器对主存和磁盘的抽象;进程对处理器、主存和I/O设备的抽象。
3.gcc -o hello hello.c
预处理: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** 创建可执行目标文件
5、GDB调试器
1.gdb programm(启动GDB)l 查看所载入的文件b 设断点info b 查看断点情况run 开始运行程序bt 打印函数调用堆栈p 查看变量值c 从当前断点继续运行到下一个断点n 单步运行(不进入)s 单步运行(进入)quit 退出GDB
二、信息的处理及表示
1、信息存储
字长为w,虚拟地址的范围为1-(2^w-1)
小端法:最低有效字节在前面——“高对高,低对低”
大端法:最高有效字节在前面
位运算:位向量按位进行逻辑运算,结果仍是位向量(区别于逻辑运算)
常见用法:掩码——用来选择性的屏蔽信号将一个w位的数截断为k位数字时,就会丢弃高w-k位。
对于无符号数来说,就相当于 mod 2的k次幂
对于有符号数来说,先按照无符号数截断,然后再转化为有符号数
IEEE浮点标准:
用V=(-1)^s X 2^E X M 来表示一个数:符号:s决定这个数是正还是负。0的符号位特殊情况处理。阶码:E对浮点数加权,权重是2的E次幂(可能为负数)尾数:M是一个二进制小数,范围为1~2-ε或者0~1-ε(ε=1/2的n次幂)
编码规则:
单独符号位s编码符号s,占1位k位的阶码字段exp编码阶码En位小数字段frac编码尾数M(同时需要依赖阶码字段的值是否为0)
两种精度
单精度(float),k=8位,n=23位,一共32位;
双精度(double),k=11位,n=52位,一共64位。
到和数值x最接近的匹配值x',可以用期望的浮点形式表示出来。
IEEE浮点格式定义了四种不同的舍入方法:
1.向偶舍入(默认方法)
即:将数字向上或向下舍入,是的结果的最低有效数字为偶数。
能用于二进制小数。
2.向零舍入
即:把整数向下舍入,负数向上舍入。
3.向下舍入
正数和负数都向下舍入。
4.向上舍入
正数和负数都向上舍入。
默认的(即向偶舍入)方法可以得到最接近的匹配,其余三种可用于计算上界和下界。
我把向偶舍入看做平时管用的四舍五入的升级版,四舍六入,五求偶。
1.浮点加法
浮点加法是可交换的
浮点加法不具结合性
大多数值的浮点加法都有逆元,除了无穷和NaN。
浮点加法满足单调性
2.浮点乘法
浮点乘法是可交换的
浮点乘法不具有结核性
浮点乘法的单位元为1.0
浮点乘法在加法上不具备分配性
在一定条件下满足单调性:
三、程序的机器表示
1、程序编码
1.机器级编程的两种抽象
(1)指令集结构ISA
(2)机器级程序使用的存储器地址是虚拟地址
2.操作符指示符
1.操作数的三种类型:立即数、寄存器、存储器
2.结果存放的两种可能:存储器、寄存器
3.寻址方式
(1)立即数寻址方式
(2)寄存器寻址方式
(3)存储器寻址方式:
直接寻址方式
寄存器间接寻址方式
寄存器相对寻址方式
基址变址寻址方式
相对基址变址寻址方式
3.数据传送指令
Mov:
movb 传送字节
movw 传送字
movl 传送双字
movs 符号位扩展
movz 零扩展
Push&Pop:
堆栈操作必须至少以字为单位,这时栈顶指针-2
如果压入的是双字,栈顶指针-4
2、算术和逻辑操作
1.一元操作
只有一个操作数,既是源又是目的,可以是一个寄存器,或者存储器位置。
2.二元操作
源操作数 目的操作数
第一个操作数可以是立即数、寄存器或者存储器位置第二个操作数可以是寄存器或者存储器位置但是不能同时是存储器位置。
3、栈帧结构
1.栈用来传递参数、存储返回信息、保存寄存器,以及本地存储。
最顶端的栈帧以两个指针界定:
寄存器%ebp-帧指针
寄存器%esp-栈指针
栈指针可移动,所以信息访问多相对于帧指针。
3.调用的过程
1.保存不能存放在寄存器中的局部变量。
当要对一个局部变量使用地址操作符&的时候,就必须要为它生成一个地址,所以要入栈。这个用法!以前没见过!
2.存放它调用的其他过程的参数。
二、转移控制
这里用到的主要就是CALL和RET这一对指令。
1.call
call指令和转移指令相似,同样分直接和间接,直接调用的目标是标号,间接调用的目标是*后面跟一个操作数指示符,和JMP一样。
CALL指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。返回地址是还在程序中紧跟在call后面的那条指令的地址。
然后就会用到ret了。
2.ret
ret指从栈中弹出地址,并跳转到这个位置。
在上学期的汇编语言学习中,call和ret常被用来进行子函数、子模块的调用。
3.leave
这个指令可以使栈做好返回的准备,等价于:
movl %ebp,%esppopl %ebp
四、处理器体系结构
1、Y86指令体系结构
1.8个程序寄存器,%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp
处理器的每个程序寄存器存储一个字
寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况下,寄存器没有固定的含义或固定值。
2.addl 加subl 减andl 与xorl 异或
3.jmp 直接跳转jle(SF^OF)|ZF 有符号数≤jl SF^OF 有符号<je ZF 相等/零jne ~ZF 不相等/非零jge ~(SF^OF) 有符号≥jg ~(SF^OF)&~ZF 有符号>
2、逻辑设计HCL
1.逻辑门产生的输出,等于它们输入位值的某个布尔函数。;AND &&OR ||NOT !;逻辑门只对单个位的数进行操作,而不是整个字;逻辑门总是活动的,输入变化输出很快就跟着变化。
2.时钟寄存器保存程序计数器PC,条件代码CC和程序状态Stat。
3、Y86的顺序实现
1.取指,译码,执行,访存,返回,写回,更新PC
五、存储器层次结构
1、RAM和ROM
静态的SRAM-更快,更贵,作为高速缓存存储器,CPU片上或片下
动态的DARM-作为主存以及图形系统的帧缓冲区
2.总线分类:
系统总线——连接CPU和I/O桥
存储器总线——连接I/O桥和主存
I/O总线(具体见6.1.2.4)
3.最大旋转延迟=1/RPM X 60secs/1min (s)
平均旋转时间是最大值的一半。
4.平均传送时间= 1/RPM x 1/(平均扇区数/磁道) x 60s/1min
5.一个连续变量中,每隔k个元素进行访问,就被称为步长为k的引用模式。
- 重复引用同一个变量的程序有良好的时间局部性
- 对于具有步长为k的引用模式的程序,步长越小,空间局部性越好
对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
高速缓存确定一个请求是否命中,然后取出被请求的字的过程,分为三步:
1.组选择2.行匹配3.字抽取
每台计算机都有表明他存储器系统的能力特色的唯一的存储器山。利用时间局部性,使得频繁使用的字从L1中取出;利用空间局部性,使得尽可能多的字从一个L1高速缓存行中访问到
问题:1.字长决定虚拟地址空间的最大大小这一点很抽象,不懂这一小节是什么意思。
注意区分逻辑右移和算术右移的区别;
总结心得:第一周的知识点在于运用VIM,GCC和GDB的基础操作,第二章信息的处理及表述重点在于二进制,任何问题都要转换到二进制运用相关公式进行计算;而第三章机器码的表示是基于信息的转换,在汇编相关指令下进行操作。存储器层次结构理解较简单,感觉难消化的是处理器体系结构中,Y86的顺序实现的理解。