CSAPP阅读碎片
CSAPP阅读碎片
预处理 编译 汇编(二进制文件 目标文件) 链接
shell – 命令解释器(默认设置)
系统的硬件组成
1.总线 – 各个部件中传递且携带信息字节的传送定长字节块[4/8](字 word)
2.I/O设备 主板(I/O设备本身或系统的主印电路板上的芯片组)– 在I/O总线和I/O设备间传递消息
【一个典型系统的硬件组成】
3.主存 –临时存放程序和程序处理数据的一组动态随机存取存储器(DRAM)芯片. 逻辑上存储器是每字节有唯一数组索引的线性字节数组
4.处理器(读取并解释存放在主存里的二进制指令)(中央处理单元【CPU】)–解释(或执行)存储在主存中指令的引擎中央处理单元 处理器的核心是大小为一字节的存储设备–程序计数器PC 任何时刻PC都指向主存中的含指令地址的某条机器语言指令
处理器的指令集–描述每条机器代码指令的效果
处理器的微体系结构–处理器实际是怎么实现的
程序经汇编后的机器指令最初存放在磁盘上,程序加载时被复制到主存,处理器运行程序时,指令从主存复制到处理器
高速缓存存储器(cache memory):作为暂时集结的区域,存放处理器近期可能会需要的信息.
高速缓存的局部性原理:程序具有访问局部区域里的数据和代码的趋势,通过让告诉缓存里存放可能经常访问的数据,大部分的内存操作都能在快速的高速缓存中完成.
静态随机访问存储器(SRAM):L1、L2高速缓存依赖
存储器层次结构
操作系统管理硬件
shell加载和运行程序都依靠操作系统并未直接访问硬件.
操作系统两个基本功能(通过进程、虚拟内存、文件实现):
1.防止硬件被失控的应用程序滥用
2.向应用程序提供简单一致的机制来控制复杂又通常大不相同的低级硬件设备.
进程:操作系统对正在进行的程序的一种抽象,即在一个系统上可以同时运行多个进程而每个进程好像都在独立地使用硬件.
并发运行:一个进程的指令和和另一个进程的指令是交错执行的.
上下文:操作系统保持跟踪进程运行所需的所有状态信息的状态.上下文切换发生在操作系统决定把控制权由当前转移到某个新进程时.
流程:保存当前上下文–恢复新进程的上下文–控制权由旧到新
从一个进程到另一个进程的转换由操作系统内核管理
(某些操作–系统调用–控制权传给内核–执行被请求操作–返回应用程序)内核时操作系统代码常驻主存的部分,它不是一个独立的进程,它是系统管理全部进程所用代码和数据结构的集合.
线程:进程的执行单元.即一个进行由多个线程的执行单元组成.
线程一般比进程更高效:每个线程在进程的上下文中且共享相同的代码和全局数据;多线程比多进程之间更容易共享数据
虚拟内存:为进程提供的假象–每个进程都在独立地使用主存.每个进程看到一致的内存–虚拟地址空间.
地址空间最上面的区域是保留给操作系统中的代码和数据的,这对所有进程来说都是一样。地址空间的底部区域
系统之间利用网络通信:当系统从主存复制一串字节到网络适配器时,数据流经过网络到达另一台机器,而不是比如说到达本地磁盘驱动器。相似地,系统可以读取从其他机器发送来的数据,并把数据复制到自己的主存。
Amdahl定律
主要思想:对系统某部分加速时,其对系统整体的影响性能取决于该部分的重要性和加速程度.
即想显著加速整个系统必须提升全系统中相当大的部分的速度.
小结
1.计算机系统是由硬件和软件组成的,它们共同协作以运行应用程序.
2.程序被其他程序翻译成不同的形式,先ASCII文本后被编译器和链接器翻译成二进制可执行文件.
3.计算机花费了大量的时间在内存、I/O设备和CPU寄存器之间复制数据,因此系统被划分成层次结构(上面的附图ww)顶:CPU 下一层:多层的硬件高速缓存存储器、DRAM主存和
4.操作系统内核是应用程序和硬件之间的媒介.提供三个基本的抽象:
(1)文件是对I/O设备的抽象
(2)虚拟内存是对主存和磁盘的抽象
(3)进程是处理器、主存和I/O设备的抽象
5.网络提供了计算机系统之间的通信手段,特殊角度来看网络就是一种I/O设备
在系统上运行程序
链接器把程序的各个部分联合成一个文件,将其加载到内存并执行。
链接可在编译时执行(源码被翻译成机器码),加载时(加载器架加载到内存并执行),运行时(程序执行)执行。
链接由链接器(程序)自动执行。
链接器是的分离编译成为可能(更小模块化进行处理,感觉像某语言特点hh)
无论什么样的操作系统、ISA或目标文件格式,基本的链接概念是通用的。
main.i——>main.s(ASCII)【编译器(ccl)】
main.s——>main.o(可重定位文件)【汇编器(as】
mian.o——>a.out(可执行文件)【链接器(ld)】
静态链接
如linux ld 程序这杨样静态链接器以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的、可加载和运行的可执行目标文件输出.
链接器构造可执行文件的步骤
符号解析(symbol resolution)。目标文件定义和引用符号,每个符号对应于一个函数、一个全局变量或一个静态变量**(即 C 语言中任何以 static 属性声明的变量)。符号解析的目的是将每个符号引用正好和一个符号定义关联起来。
重定位(relocation)。编译器和汇编器生成从地址 0 开始的代码和数据节。链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节,然后修改所有对这些符号的引用,使得它们指向这个内存位置。链接器使用汇编器产生的重定位条目(relocation entry)的详细指令,不加甄别地执行这样的重定位。
目标文件
三种类型
可重定位目标文件
包含二进制代码和数据 形式可以在编译时与其他可重定位目标文件合并 创建一个可执行文件
ELF头剩下的部分包含帮助链接器语法分析和解释目标文件的信息。
包括:
ELF头的大小
目标文件类型(如科重定位、可执行或可共享的)
机器类型(如x86-64)
字头部表的文件偏移
节头部表中条目的大小和数量
不同节的位置和大小都是由节头部表描述的,其中目标文件中的每一个节都有一个固定大小的条目。
可执行目标文件
包含二进制代码和数据 信号是可直接被复制到内存
共享目标文件
一种特殊类型的可重定位目标文件 可以在加载或运行时被动态地加载进内存并链接.