入门
三大件
- CPU 中央处理器(Central Processing Unit)
- 内存(Memory)
- 主板(Motherboard)
还有一个很特殊的设备,就是 显卡(Graphics Card) - GPU(Graphics Processing Unit,图形处理器)
冯·诺依曼体系结构(Von Neumann architecture)
也叫 存储程序计算机
- 可编程
- 存储
计算机组成
- 运算器:处理器单元(Processing Unit)
- 算术逻辑单元(Arithmetic Logic Unit,ALU)
- 处理器寄存器(Processor Register)
- 控制器:控制器单元(Control Unit/CU)
- 程序计数器(Program Counter)
- 指令寄存器(Instruction Register)
- 存储器(Memory Register)
- 内存
- 数据(Data)
- 指令(Instruction)
- 硬盘
- 内存
- 输入设备(Input Device)
- 和输出设备(Output Device)
计算机组成原理知识地图
两个核心指标
- 性能 = 1/ 响应时间
- 功耗
性能- 跑得更快:响应时间(Response time)/执行时间(Execution time)
- 搬得更多:吞吐率(Throughput)/带宽(Bandwidth)
计算机的计时单位:CPU 时钟
$ time seq 1000000 | wc -l
1000000
seq 1000000 0.26s user 0.00s system 96% cpu 0.269 total
wc -l 0.01s user 0.01s system 4% cpu 0.268 total
程序的 CPU 执行时间 = CPU 时钟周期数 × 时钟周期时间
晶振: 晶体振荡器(Oscillator Crystal)
我们把 晶振 当成 CPU 内部的电子表来使用。晶振带来的每一次“滴答”,就是时钟周期时间。
功耗
功耗 ~= 1/2 × 负载电容 × 电压的平方 × 开关频率 × 晶体管数量
性能提升方法
- 加速大概率事件: GPU
- 通过流水线提高性能
- 通过预测提高性能
指令和计算
纸带编程
计算机指令集 (Instruction Set)
- 存储程序型计算机(Stored-program Computer)
- 插线板计算机(Plugboard Computer)
代码怎么变成机器码
解析指令和机器码
指令类型: - 算术类指令
- +-*/
- 数据传输类指令
- =
- 逻辑类指令
- & ! |
- 条件分支类指令
- if else
- 无条件跳转指令
- goto
- goto
goto
逻辑上,我们可以认为,CPU 其实就是由一堆寄存器组成的。而寄存器就是 CPU 内部,由多个触发器(Flip-Flop)或者锁存器(Latches)组成的简单电路。
寄存器类型
- PC 寄存器(Program Counter Register):也叫指令地址寄存器(Instruction Address Register)
- 指令寄存器(Instruction Register):用来存放当前正在执行的指令
- 条件码寄存器(Status Register):用里面的一个一个标记位(Flag),存放 CPU 进行算术或者逻辑计算的结果
- 通用寄存器
gcc -g -c test.c
objdump -d -M intel -S test.o
stack overflow
图中,rbp 是 register base pointer 栈基址寄存器(栈帧指针),指向当前栈帧的栈底地址。rsp 是 register stack pointer 栈顶寄存器(栈指针),指向栈顶元素。
ELF和静态链接
ELF 文件格式
- 首先是**.text Section**,也叫作代码段或者指令段(Code Section),用来保存程序的代码和指令;
- 接着是**.data Section**,也叫作数据段(Data Section),用来保存程序里面设置好的初始化数据信息;
- 然后就是**.rel.text Secion**,叫作重定位表(Relocation Table)。重定位表里,保留的是当前的文件里面,哪些跳转地址其实是我们不知道的。比如上面的 link_example.o 里面,我们在 main 函数里面调用了 add 和 printf 这两个函数,但是在链接发生之前,我们并不知道该跳转到哪里,这些信息就会存储在重定位表里;
- 最后是**.symtab Section**,叫作符号表(Symbol Table)。符号表保留了我们所说的当前文件里面定义的函数名称和对应地址的地址簿。
内存分页
getconf PAGE_SIZE
- 虚拟内存
- 虚拟内存地址(Virtual Memory Address):指令里用到的内存地址
- 物理内存地址(Physical Memory Address):硬件里面的空间地址
- 虚拟内存到物理内存的映射表
- 内存交换
- 分段
- 内存交换(Memory Swapping)
- 内存分页
动态链接
链接
- 静态链接(Static Link)
- 动态链接(Dynamic Link)共享库(Shared Libraries)
- Windows 下,这些共享库文件就是**.dll**文件,也就是 Dynamic-Link Libary(DLL,动态链接库)
- Linux 下,这些共享库文件就是**.so **文件,也就是 Shared Object(一般我们也称之为动态链接库)
gcc lib.c -fPIC -shared -o lib.so
gcc -o show_me_poor show_me_poor.c ./lib.so
objdump -d -M intel -S show_me_poor
-fPIC: Position Independent Code 地址无关代码
PLT 和 GOT,动态链接的解决方案
- PLT:程序链接表(Procedure Link Table)
- GOT:共享库的 data section 里面,保存了一张全局偏移表(GOT,Global Offset Table)
处理器
应用
参考
- 极课时间《深入浅出计算机组成原理》
- 北京大学免费公开课《Computer Organization》
- 《计算机组成与设计:硬件 / 软件接口》
- 《深入理解计算机系统》
- CSAPP深入理解计算机系统 课程视频含英文字幕
- 《计算机组成:结构化方法》
- 《编码:隐匿在计算机软硬件背后的语言》
- 《程序员的自我修养:链接、装载和库》