计算机系统
从机器的角度来看,程序仅仅是字节序列。
总线和字
- 总线。贯穿整个系统的一组电子管道,它携带信息字节并负责在各个部件之间传递。通常总线被设计成传送固定的字节块,也就是字。字中的字节数也就是字长,是一个基本的系统参数。总线包括系统总线,I/O总线,内存总线等。
- 字节,八位的位序列块,最小的可寻址内存单位。
- 字,总线传送的固定的字节块。
- 字长,字中的字节数。一个字长为w位的机器,虚拟地址的范围从0到$2^w -1$。
地址和虚拟内存
- 机器程序的虚拟内存,机器级程序将内存看成一个非常大的字节数组,称为虚拟内存。
- **(虚拟)**地址,虚拟内存的每个字节都由一个唯一的数字标示,这个数字叫做这个字节的地址。
- 虚拟地址空间,所有(虚拟)地址的集合称为虚拟地址空间。
- 大端和小端。大端,最高有效字节在最前面;小端,最低有效字节在最前面。用于跨多字节的对象,它的地址是什么,如何排列这些字节。在网络传输二进制数据时,可能会出现问题。
I/O设备
- I/O设备。输入输出设备是系统和外部世界的联系通道。常见的用户输入设备有键盘和鼠标,用户输出设备显示器,以及磁盘驱动器(磁盘)。每个I/O设备都通过一个控制器或者设配和I/O总线相连接,是适配器和控制器的功能都是在I/O总线和I/O设备之间传递信息。
- 控制器。控制器是I/O设备本身或者系统的主印制电路板上的芯片组。
- 适配器。而适配器是一块插在主板插槽上的卡。
处理器
- 处理器。中央处理单元,简称CPU,是解释(执行)存储在主存中指令的引擎。
- 程序计数器。处理器的核心是一个大小为一个字的存储设备(寄存器),称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器指令。
- 指令集架构。处理器按照一个指令执行模型来操作,这个模型叫做指令集架构。指令集架构描述的是每条机器代码指令的效果。
- 微体系架构。微体系结构描述的是处理器是如何实现的。
- 算术/逻辑运算单元(ALU)。计算新的数据和地址值。
存储器
- 主存。
- 动态随机访问存储器
- 静态随机访问存储器
- 高速缓存存储器
- 闪存
- 磁盘存储器
- 寄存器文件。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有一个唯一的名字。
程序和进程
- 程序。程序是一个存储在磁盘上的某个目录中的可执行文件。内核使用
exec函数将程序读入内存,并执行该程序。 - 进程。程序的执行实例被称为进程(process),是操作系统对一个正在运行的程序的抽象。
- 线程
- 并发
- 并行
运算
- 算术右移和逻辑右移。算术右移在左端补k个最高有效位的值,而逻辑右移在左端补k个0,C语言没有规定对于有符号数使用哪种右移,但是几乎所有的编译器和机器组合都对有符号数进行算术右移。对于无符号数,右移必须是逻辑右移。
机器指令和可执行文件
- 机器指令。
- 可执行目标程序(executable object program),或者也叫可执行目标文件(executable object files),是一种文件格式。将一系列形式机器指令以这种格式组织,然后存放成一个二进制文件。
编译器和编译器驱动程序
- 编译器,或者编译系统(compile system)。执行将源文件翻译成可执行目标文件过程的程序,即预处理器,编译器,汇编器和链接器,构成编译系统。
- 编译器驱动程序。编译器驱动程序自动的完成整个编译过程,即在需要时分别调用预处理器,编译器,汇编器和连接器,整个编译过程都是由编译器驱动程序负责的。[1,2]。
- 链接是将各种代码和数据片段收集并组合成一个单一文件的过程,这个文件可以被加载到内存并执行。
- **符号和符号表。**每一个可重定位模块m都有一个ELF符号表(
.symtab),有三种不同的符号:对应于本模块中定义的non-static的C函数和global variables的全局符号(global symbols);对应其他模块中定义的non-static的C函数和global variables的外部符号(external symbol);对应于C的static function和static global variables,static local variables的局部符号(local symbols)。
每一个符号都被分配到某个section字段表示,section字段的取值还可以是在seciton header table中没有entry的三个特殊伪节(pseudosection):UNDER表示未定义的符号, ABS表示不应该重定位的符号和COMMON表示还没有分配位置的未初始化的数据目标;对于COMMON符号,value字段给出对齐要求,size给出最小的大小。
COMMON和.bss的区别:COMMON存放的是未初始化的全局变量,而.bss存放的是未初始化的静态变量,以及初始化为0的全局或者静态变量。 - **强符号和弱符号。**函数和已经初始化的全局变量是强符号,未初始化的全局变量是弱符号。
参考文献
1.《CSAPP》第三版
2.https://stackoverflow.com/a/58392562/8939281