概论
信息就是位+上下文
- 用ASCII标准表示文本字符: 用一个唯一的单字节大小整数值来表示每个字符
- 源文件通过编译器, 汇编器和连接器翻译成二进制可执行文件
- 所有信息由一串位表示,区分数据对象唯一方法是读到的上下文
总线
- 传送定长字节块: 字
- 一般分4字(32位)/8字(64位)
操作系统内核
- 硬件和软件之间的媒介,提供三种抽象:
- 文件是对IO的抽象,就是字符序列
- 虚拟存储器是对主存和磁盘的抽象
- 进程是对处理器, 主存和IO设备的抽象
虚拟机
- 对整个计算机的抽象
进程
- 操作系统对一个正在运行系统的抽象
- 处理器通过上下文切换实现多进程并发执行
- 上下文: 操作系统保持跟踪进程运行所需的所有状态信息
线程
- 一个线程可以由多个线程的执行单元组成
- 所有线程运行在进程的上下文中,共享代码和全局数据
- 多线程比多进程更容易共享数据, 网络服务器并行处理中更高效
虚拟存储器
- 抽象概念, 为每个进程提供独自使用主存的假象, 称为虚拟地址空间
- 从低地址到高区域为: 程序代码和数据, 堆, 共享库, 栈, 内核虚拟存储器
信息的表示和处理
信息存储
- 8位一字节: 最小可寻址存储器单位
- 存储器可视为非常大的字节数组, 每个字节由唯一数字标示: 地址
- 所有可能的地址集合为虚拟地址空间
字长(32/64)
- 决定虚拟地址空间最大大小
- 字长w位, 虚拟地址范围0~(2^w)-1, 程序最多访问2^w个字节
- 如字长32位, 限定虚拟地址空间4GB
链接
链接器
- 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程
- 可以执行于编译时: 源代码翻译成机器代码
- 可以执行于加载时: 程序被加载器加载到存储器并执行时
- 可以执行于运行时: 由应用程序来执行
- 链接由链接器执行, 实现分离编译
目标文件
- 字节块集合, 包括三种形式:
* 可重新定位目标文件: 可以在编译时与其他可重新定位目标文件合并,创建一个可执行目标文件
* 共享目标文件: 特殊可重新定位目标文件, 可以在加载或运行时被动态地加载到存储器并链接
* 可执行目标文件: 可被拷贝到存储器并执行 - 编译器和汇编器生成可重新定位目标文件或共享目标文件, 链接器生成可执行目标文件
- 目标模块是一个字节序列, 目标文件就是存放在磁盘文件中的目标模块
可重新定位目标文件
- 各个系统目标文件格式不同, unix为例格式为ELF
- ELF头
* 以一个16字节的序列开始, 其描述了生成该文件系统字的大小和字节顺序
* 剩下部分包括ELF头的大小, 目标文件的类型, 机器类型, 字节部表的文件偏移, 字节头部表中的条目大小和数量
符号和符号表
- 每个可重新定位目标模块m都有一个符号表, 它包含m所定义和引用的符号信息
- 在链接器的上下文中包含三种符号:
* m定义并能被其他模块引用的全局符号
* 其他模块定义并被模块m引用的全局符号, 这些符号称为外部符号
* 只被模块m定义和引用的本地符号
符号解析
- 链接器解析符号引用是将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义联系起来
- 编辑器只允许每个模块中每个本地符号中有一个定义
- 引用外部符号时会假设符号在其他模块中定义, 生成链接器符号表条目, 如果链接器在任何输入模块找不到则输出错误信息并终止
解析多重定义全局符号
- 编译时编译器向汇编器输出每个全局符号分为强或弱, 汇编器把这个信息隐含地编码在可重新定位目标文件符号里
- 函数和已经初始化的全局变量为强符号, 未初始化的全局变量为弱符号
- 链接器处理规则:
* 不允许有多个强符号
* 如果有一个强符号和多个弱符号, 选择强符号
* 多个弱符号则随机选择