《深入理解计算机系统》读书系列
第一章:计算机系统漫游
hello world 程序运行时,系统发生了什么。
程序由源文件开始,源文件由字节组成文本文件。文件分为ASCII表示的文本文件和二进制文件。
hello.c 经过预处理器(cpp)处理得到hello.i: 根据#开头的命令,将引入的程序插入
helloc.i 经过编译器(ccl)翻译成汇编程序hello.s: 不同高级语言对于汇编是相同的
hello.s 经过汇编器(as)翻译为机器语言指令hello.o: 二进制文件
hello.o 经过链接器(ld)链接标准C库的预编译目标文件产生hello: 可执行文件
GNU: GNU’s Not Unix
理解编译系统可以优化程序性能,理解链接时出现的错误,避免安全漏洞
shell是一种命令行解释器,第一个单词不是命令,就是可执行文件。
总线,I/O设备,主存,处理器
CPU:
程序计数器:指向某条机器语言指令
寄存器文件:小的存储设备
加载:主存->寄存器
存储:寄存器->主存
更新:寄存器->ALU->寄存器
I/O读,I/O写:寄存器<->I/O设备
转移:指令->程序计数器
执行hello程序
1 | ./hello |
- shell程序逐一读取字符到寄存器,再把它存放在主存中
- 敲回车键,shell结束命令输入,shell执行一些指令,将hello目标文件中的代码和数据从磁盘拷贝至主存,从而加载hello文件,数据:例如“hello world!\n”字符串
- 利用DMA(直接存储器读取),数据不通过cpu直接从磁盘到主存
- cpu执行hello程序机器语言指令,指令将“hello world!\n”的字节从存储器拷贝到寄存器,再从寄存器拷贝到显示设备。
高速缓存:速度位于寄存器和主存之间
操作系统:应用程序和硬件之间的一层软件,程序不直接访问键盘,显示器,磁盘或主存
- 防止硬件被失控的应用程序滥用,
- 为硬件做抽象表示:处理器->进程 主存->虚拟存储器 I/O设备->文件
进程:程序看上去好像在独占硬件
上下文切换:各进程指令的交错执行
虚拟地址空间
上1/4是操作系统数据与代码
从上至下:用户栈,共享库存储器映射区域。运行时堆,读写数据,只读的代码和数据
网络也是一种I/O设备
第二章:信息的表示与处理
信息存储中,8位称为一个字节,按字节寻址。
使用十六进制表示法表示字节(0x00-0xFF)
字长和虚拟空间地址大小的关系。
C声明 | 典型地32位机器 | Compaq Alpha机器 |
---|---|---|
char | 1 | 1 |
short int | 2 | 2 |
int | 4 | 4 |
long int | 4 | 8 |
char * | 4 | 8 |
float | 4 | 4 |
double | 8 | 8 |
大端小端之争
字符串无大小端问题
sizeof(T)返回存储一个类型为T的对象所需要的字节数。
无符号,有符号,二进制补码
数字扩展和截断数字
无符号加法溢出
二进制补码加法溢出