CSAPP 学习笔记 (第一章)
2023-07-26 12:50:00
# Book
Chapter 1: 计算机系统漫游
1.1 信息就是位+上下文
只使用 $ASCII$ 字符构成的文件称为文本文件
所有其他的文件称为二进制文件
系统中所有的信息都是由比特序列表示的, 通过上下文来区分这些数据表示什么
1.2 程序被其他程序翻译成不同的格式
每条 C 语句都被编译器驱动程序翻译成低级机器语言指令, 这些指令被打包成可执行目标文件 \
- 预处理阶段: 预处理器把头文件内容直接插入到
hello.c
中, 得到hello.i
- 编译阶段: 编译器把
hello.i
翻译成hello.s
, 这是一个汇编程序 - 汇编阶段: 汇编器把
hello.s
翻译成机器语言, 打包成hello.o
, 可重定位目标程序 - 链接阶段: 链接器负责将预编译的目标文件并入当前文件, 如
printf.o
, 得到hello
, 可执行目标程序
1.3 了解编译系统如何工作是大有益处的
- 优化程序性能
- 理解链接时出现的错误
- 避免安全漏洞
1.4 处理器读并解释储存在存储器中的指令
把文件名输入到 shell
, 一种命令行解释器中
1.4.1 系统的硬件组成
总线: 传递字, 字包含若干字节, 一个字包含的字节数称作字长
IO设备: 通过控制器或适配器和 IO总线连接
主存: 一个临时存储设备, 由一些 DRAM
(动态随机存取储存器)芯片组成, 是一个线性的字节数组
处理器: 从 PC 指向的存储器中取出指令并执行
- 加载: 从主存拷贝一个字节或者一个字存到寄存器中
- 存储: 从寄存器拷贝到主存
- 更新: 用 ALU 计算并存到寄存器中
- I/O 读: 从 IO 设备到寄存器
- I/O 写: 从寄存器到 IO 设备
- 转移: 从指令本身抽取一个字放在 PC 中
1.4.2 执行 hello
程序
- 从键盘逐一读取
hello
命令放到寄存器, 最后放到主存中 - 通过 DMA 技术从磁盘调用可执行文件到主存中
- 逐条运行机器语言指令, 把
hello, world!
从主存拷贝到寄存器再到输出设备
1.5 高速缓存
较大的存储设备比较小的存储设备运行慢, 但快速设备的造价远高于低速同类设备
系统设计者采用 SRAM技术实现的高速缓存存储器来加快拷贝速度
1.6 形成层次结构的存储设备
1.7 操作系统管理硬件
程序并没有直接访问硬件, 而是靠 操作系统 提供的服务
操作系统有两个基本功能:
- 防止硬件被失控的程序滥用
- 为应用程序提供简单且一致的硬件操作方法
1.7.1 进程
进程是操作系统对运行程序的一种抽象
每个进程好像在独自使用硬件, 这称之为并行, 实际上是不同进程的指令的交错执行
这种机制称作 上下文切换, 上下文也就是进程运行所需的所有状态信息
1.7.2 线程
一个进程可以由多个线程组成, 多线程比多进程更容易共享数据
1.7.3 虚拟存储器
虚拟存储器是一个抽象概念, 它为每个进程提供一个假象
每个进程看到的存储器都是一致的, 称为虚拟地址空间
虚拟存储空间由大量准确定义的区组成, 包括程序代码和数据, 堆, 共享库, 栈, 内核虚拟储存器
1.7.4 文件
所有的设备甚至网络, 都可以被看成文件
1.8 利用网络系统和其他系统通信
一个网络也可以看作一个IO设备
1.9 下一步
系统是互相交织的硬件和软件的集合体, 他们必须共同协作
1.10 小结
信息是一串01序列, 根据上下文有不同的解释方式
程序被其他程序翻译成其他格式, 最终变为可执行文件
存储设备按层次排列
操作系统内核提供三个基本的抽象概念
- 文件是对 IO 设备的抽象概念
- 虚拟存储器是对主存和磁盘的抽象概念
- 进程是处理器, 主存和 IO 设备的抽象概念