计系(2)复习

  • Post author:
  • Post category:其他


期末了,就是看书有点看不进去。所以我想着打字打出来吧,应该能看进去一些。


目录


第一章 计算机系统漫游


第二章 信息的表示和处理


第三章 程序的机器级表示


第六章 存储器层次结构


第七章 链接



第一章 计算机系统漫游

1.2 程序被其他程序翻译成不同的格式

1) 掌握编译系统的四个阶段,掌握各个阶段的文件名称和类型。


预处理:预处理器cpp    hello.c->hello.i


编译:编译器ccl   hello.i->hello.s


汇编:汇编器as   hello.s->hello.o


链接:把几个.o文件链接生成可执行文件

1.4 处理器读并解释存储在内存中的指令

1) 了解shell程序

shell是一个应用程序,它输出一个提示符,等待输一个命令行,然后执行这个命令。

2) 了解计算机系统的硬件组成

总线、I/O设备、主存、处理器

3) 理解hello程序的运行过程

从I/O设备(键盘)输入hello,将字符存入寄存器,存入主存。按回车,shell程序执行指令,把可执行hello文件从磁盘复制到主存。处理器开始执行hello程序。

1.5 高速缓存至关重要

1) 理解高速缓存的组成器件

cache???

2) 理解高速缓存的主要作用

CPU从寄存器读数据很快,处理器从主存读取数据很慢。访问速率差距过大,高速缓存存放近期处理器可能回处理的数据来缩小差异。

1.6 存储设备形成层次结构

1) 掌握存储器层次结构中不同存储器在访问时间、存储容量、价钱上的趋势

P10

1.7 操作系统管理硬件

1) 了解操作系统提供的抽象表示

文件:是对I/O设备的抽象

虚拟存储器;是对主存和磁I/O设备的抽象

进程:是处理器、主存、I/O设备的抽象


第二章 信息的表示和处理

2.1 信息存储

1) 理解进制转换,数据大小

二进制、十进制、十六进制。

2) 掌握大端法和小端法的存储规则


小端法:地位在低地址。一般x86机器都是小端法。

3)  掌握C语言中的位级运算

|  &  ~

4) 掌握C语言中的逻辑运算

|| && !。除了true就是false,除了1就是0.

5)  理解算数移位和逻辑移位

算数位移 右移补1,左移补0;

逻辑位移 右移左移都是补0;

2.2 整数表示

1) 理解常用数字表示方法(原码、补码、反码、移码)


正数:原码、补码、反码都一样。


负数:反码是除符号位都取反,补码是反码+1。


移码:补码的符号位取反

2) 掌握无符号数(原码)、有符号数(补码)、二进制数之间的转换。最高有效

位: 补码表示符号位;无符号数表示正权重

B2U([1011])=
1*2^3+0*2^2-1*2^1+1*2*0=8+0+2+1=11

B2T([1011])=
-1*2^3+0*2^2+1*2^1+1*2^0=-8+2+1=-5

T2U_{16}(-12345)=-12345+2^{16}

T2U_{16}(56)=56

U2T_{8}(16)=16

U2T_8(200)=200-2^8

3)  理解无符号数的零扩展,理解补码数的符号扩展

4)  理解截断数字

不管有符号还是无符号,

只需要把高位去掉,保留低位就行

2.3 整数运算

1)  理解补码加减法  2) 理解溢出

3) 了解整数乘法

2.4 浮点数

V=(-1)^s*M*2^E

1) 掌握IEEE 754浮点规格化表示

e不是全0,也不是全1;

2)  掌握阶码、偏置bias

规格化:E=e-127或e-1023  M=1.f

非规格化E:1-127或1-1023  M=0.f

3)  掌握特殊值的浮点表示: NaN,负无穷,指数/尾数 的位数

无穷大e全1.f全0

NaN e全1,f不全0

4)  掌握规格化数的表示范围,进制转换

规格化范围[1.0,2.0)


第三章 程序的机器级表示

3.2 程序编码

1)  理解反汇编器

objdump

(objdump .o和可执行程序,生成结果不同)

可以objdump -d hello.o

也可以objdump -d hello

生成结果不同,地址不同。

2)  理解编译的过程

hello.i->hello.s ,变成汇编语言。

3

)

掌握代码格式

3.3 数据格式

1) 掌握C语言数据类型在X86-64中的大小:

后缀 b/w/l/q – 1/2/4/8

按X86-64中的大小,char/b;short/w;int/l; long /q; char */q; float/s; double/l

浮点数有点神奇,书上就这么写的。单精度s,双精度l。这个l不会产生歧异,因为浮点数使用的是一组完全不同的指令和寄存器。

3.4 访问信息

1) 掌握整数寄存器

生成1字节和2字节数字的指令回保持剩下的字节不变;生成4字节的指令会把高位4个字节置为0;

2) 掌握操作数格式

注意比例因子s必须是1、2、4、8.

3) 掌握数据传送指令mov (movb, movw, movl, movq),掌握movl清零,理解扩展

原操作数可以是一个立即数,也可以是通过寻址得到的内存空间的数值。

目的地址可以是寄存器,也可以是通过寻址得到的内存空间。

mov指令不能直接完成内存到内存的数据半夜

任何为寄存器生成32位值的指令,都会把该寄存器的高位置0。所以movl会把高位置0.

MOVZ是零扩展,MOVS是符号扩展。

cltq把%eax符号扩展到%rax

4)  掌握入栈和出栈操作(pushq,popq),等价指令



入栈  是rsp-8

rsp rsp rsp rsp rsp rsp

3.5 算数和逻辑操作

1) 理解有效地址

有效地址就是一个可以用于指定哪个内存位置可以用来执行存取操作的值。

2)  掌握加载有效地址(lea)

leaq是movq的变形。它的指令形式是从内存读数据到寄存器,但实际上它更笨就没有引用内存。

movq (%rdi,%rsi,4),%rax                     //%rax=M[r[Rdi]+4*R[%rsi]]

leaq (%rdi,%rsi,4),%rax                      //%rax=r[Rdi]+4*R[%rsi]

3) 理解算数移位和逻辑移位

SA算数位移。SH逻辑位移。

SAL补0,SAR补符号位。

SHR补0,SHL补0。

位移量可以是一个立即数,也可以是存放在%cl中。

(必须存放在%cl中)

4) 理解特殊的算术操作imulq, mulq, idivq, divq

imulq 有符号全乘法

mulq 无符号全乘法

idivq有符号除法

divq无符号除法

3.6 控制

1) 了解条件码的符号

四个最常用的条件码。

CF:进位标志。

ZF:零标志。

SF:符号标志。

OF:溢出标志。

2) 掌握比较和测试指令。不修改寄存器的值、只设置条件码

CMP指令与SUB指令行为一致。

TEST指令与AND指令行为一致。常常test自身。testq %rax,%rax来判断%rax是负数、零、还是正数。

3)  理解跳转指令(jmp,je, jne)

jmp是无条件跳转指令。

je相等时跳转。

jne不相等时跳转。

4)  掌握PC相对寻址


相对寻址中,指令提供的相对地址实质上是:下条指令在内存中的首地址为基准的位置偏移量。

因为执行本条指令时,已经完成了PC++,PC中是未雨绸缪思想下,保存下一条指令的地址。

普通情况下,相对寻址就是简单的把PC的值与偏移量相加得到操作数的有效地址。


EA = (PC) + A

5)  掌握条件控制实现条件分支(if-else)

6)  掌握条件传送 cmov

条件传送 VS 条件跳转

对于这个程序:

条件跳转是先判断x和y的大小,只算x-y或y-x中的一个,而条件传送是先把x-y和y-x都算出来,然后在传送一个。保证随机输入的情况下,第二种的运行速度是比第一种要快的。

7)  理解循环 do-while, while, for

8)  掌握switch语句,跳转表

跳转表是一个数组,表项i是一个代码段的地址,这个代码段实现当开关索引值等于i时程序应该采取的动作。使用跳转表的优点是执行开关语句的时间与开关情况的数量无关。

3.7 过程

1)  掌握通用的栈帧结构

2) 掌握过程调用call

3) 掌握数据传送

4) 掌握栈上的局部存储

5) 掌握递归过程

3.8 数组分配和访问

1) 掌握数组的分配

2) 掌握指针运算

3) 掌握嵌套数组

3.9 异质的数据结构

1)  掌握结构体偏移量和大小

不考虑对齐时,直接按照顺序分配就行。

2) 掌握数据对齐

要求任何K字节的基本对象的地址必须是K的倍数。

3.10 在机器级程序中将控制与数据结合起来

1) 理解指针

2) 理解内存越界和缓冲区溢出,掌握缓冲区溢出的过程

C对于数组引用不进行任何边界检查,而且局部变量和状态信息都存放在栈中,这样可能导致越界的数组元素的写操作会破坏存储在栈中的状态信息。

缓冲区溢出:在栈中分配某个字符数组来保存一个字符串,但是字符串的长度超出了位数组分配的空间。


第六章 存储器层次结构

6.1 存储技术

1)  理解静态、动态存储器的基本存储单元(SRAM-晶体管、DRAM-电容)

SRAM静态存储器的基本存储单元:晶体管

DRAM动态存储器的基本存储单元:电容

2) 理解静态、动态存储器分别对应的存储设备

静态:

动态:相机的传感器

3) 了解非易失性存储器

断电不会丢失信息。

SRAM和DRAM、cache都是易失性存储器。

非易失性存储器有:ROM(只读存储器),闪存。

4) 了解闪存存储器

闪存是一种非易失性存储器,固态硬盘SSD是基于闪存的存储技术。

5) 掌握磁盘存储器的基本构成(盘片、盘面、柱面、磁道、扇区)

6) 掌握磁盘容量的计算方法

磁盘容量=盘片数*盘面数*磁道数*扇区数*每个扇区的字节数。

7) 掌握磁盘访问时间(寻道时间、旋转时间、传送时间)的概念和计算方法

寻道时间:一般是通过对几千次对随机扇区的寻道求平均值

旋转时间:

传送时间:

访问时间=寻道时间+旋转时间+传送时间。

6.2 局部性

1) 掌握存储系统的时间局部性和空间局部性

时间局部性:被引用过一次的内存位置很可能在不远的将来再被多次引用。

空间局部性:被引用过一次的内存位置,那么程序很可能在不远的将来引用附件的一个内存位置。

6.3 存储器层次结构

1) 掌握存储器层次结构中不同存储器在访问时间、存储容量、价钱上的趋势

越上面越快、越小、越贵。

2) 掌握高速缓存在存储器层次结构中的作用

CPU从寄存器读数据很快,处理器从主存读取数据很慢。访问速率差距过大,高速缓存存放近期处理器可能回处理的数据来缩小差异。

3) 理解缓存命中率的概念和计算方法

缓存命中率=命中次数/总次数

6.4 高速缓存存储器

1) 掌握直接映射、全相联的地址表示

直接映射  只有一行:E=1。命中率低。

全相联是   只有一组:S=1。成本高。

2) 了解组相联的地址表示

3) 理解影响高速缓存存储器命中率的主要因素

①高速缓存大小的影响

②块大小的影响

③相联度(E)越高,命中率越高。

④写策略的影响。

有两种写策略:write-through和write-back。

write-through和写不分配对应,在命中时更新Cache和Memory,未命中时至更新Memory。

write-back和写分配对应,在命中时只更新Cache,未命中时先把数据写到cache,等到cache的那个数据要被替换时,把Memory更新。

6.5 编写高速缓存友好的代码

1) 掌握空间局部性对多维数组的影响


第七章 链接

7.1 编译器驱动程序

1) 掌握编译过程的各个步骤(预处理、编译、汇编、链接)


预处理:预处理器cpp    hello.c->hello.i


编译:编译器ccl   hello.i->hello.s


汇编:汇编器as   hello.s->hello.o


链接:把几个.o文件链接生成可执行文件

2) 掌握链接的概念:链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程。(链接的优点)、

模块化、效率高。

7.2 静态链接

1) 掌握静态链接需要完成的两个主要任务

符号解析 和 重定位。

2)  掌握符号解析的概念。

符号解析是将每个符号引用和目标文件符号表中的确定的符号定义联系起来。

3) 掌握重定位的概念。

重定位就是把程序的

逻辑地址空间

变换成内存中的实际物理地址空间的过程。

7.3 目标文件

1) 理解目标文件的三种形式:可重定位目标文件(二进制)、可执行目标文件(二进制)、共享目标文件。

7.4 可重定位目标文件

1) 掌握ELF可重定位目标文件的组成

7.5 符号和符号表

1) 理解全局符号、局部符号的概念。

全局符号:main、外地符号exteern

局部符号(本地符号):static

2) 掌握定义和引用的概念。

符号定义:包括变量的声明,变量的初始化,函数的实现

符号引用:包括变量的使用,函数的调用

3) 掌握ELF符号表条目。能看懂READELF工具显示的符号表条目。

符号表是由汇编器构成的,???不记得上课讲过,没印象了??还是掌握。。。。

7.6 符号解析

1) 理解强符号、弱符号的概念。

函数和已初始化的全局变量是强符号。

未初始化的全局变量是弱符号。

2) 掌握处理多重定义符号的规则。

①不允许有多个同名的强符号。

②如果有越高强符号和多个弱符号同名,那么选择强符号。

③如果有多个弱符号同名,那么从这些弱符号中任意选择一个。

3) 理解存档文件。(.a文件)

静态库一存档文件的形式存在磁盘中。.a文件是几个.o文件组成的。

得到静态库  Linux> ar rccs lib.a hello.o add.o

4) 掌握静态库链接。

将所有相关的目标模块.o打包成为一个单独的文件.a,称为静态库。libc.a是C标准库,libm.a是数学库。

lib.c无需明显地指出,编译器自己默认帮你

链接指令是有顺序的,如果foo.c调用libx.a,libx.a调用liby.a,liby.a调用libx.a。

可以这样:linux> gcc foo.c libx.a liby.a libx.a

连接器维护三个集合:E,U,D

E中按顺序装.o文件。U。。去看PPT吧

7.7 重定位

1) 掌握重定位的过程。

符号解析完之后重定位。重定位有两步:重定位节和符号定义、重定位节中的符号引用。

2) 掌握ELF重定位条目。

3) 理解两种重要的重定位的类型和重定位符号引用

真的没讲吧??

7.8 可执行目标文件

1) 掌握ELF可执行目标文件的组成

7.9 加载可执行目标文件

1) 了解LINUX运行时存储器映像

7.10 动态链接共享库

1) 了解链接共享库的文件后缀名



版权声明:本文为weixin_62438655原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。