背后其实反映出两项重要的能力
状态机模型帮助大家将程序, 指令集, 处理器关联起来
程序 | 抽象计算机 | CPU | |
---|---|---|---|
状态 | {<V, PC>} |
{<R, M>} |
{时序逻辑电路} |
状态转移规则 | C语言语句的语义 | 指令的语义 | 组合逻辑电路 |
FM | C语言标准手册 | 指令集手册 | 架构设计文档 |
32位 | 64位 | |
---|---|---|
c90 | TT | FT |
c99 | FT | FT |
YEMU(NEMU简化版) = 指令集模拟器 = 用C语言实现指令集手册定义的状态机
putch()
和halt()
两个API_start()
0
开始运行void _start() {
putch('H'); putch('e'); putch('l'); putch('l'); putch('o'); putch(','); putch(' ');
putch('R'); putch('I'); putch('S'); putch('C'); putch('-'); putch('V'); putch('!');
putch('\n');
halt(0);
}
用30行Chisel代码实现YEMU - NPC简化版
示例 - 手写递归版本汉诺塔的汇编代码
AM = 按照计算机发展史将计算机功能抽象地模块化的裸机运行时环境
异常 = 一种特殊的跳转
_start()
TRM | AM | 操作系统 | | | IOE | AM | 操作系统 |
---|---|---|---|---|---|---|
程序入口 | main() |
加载器 | | | 输入 | ioe_read() |
SYS_read |
退出方式 | halt() |
SYS_exit |
| | 输出 | ioe_write() |
SYS_write |
打印字符 | putch() |
SYS_write |
| | 设备 | 时钟/键盘/VGA | 设备文件抽象 |
堆区 | heap |
SYS_brk |
| |
真实的处理器通过总线和其他设备通信
A/B12~15 A/B8~11 A/B4~7 A/B0~3
|| || || ||
+---------------------------------------------+
S0~3 <--|------||--------||--------||------+ || |
S4~7 <--|------||--------||------+ || | || |
S8~11 <--|------||------+ || | || | || |
S12~15<--|-+ VV | VV | VV | VV |
| | +----+ +----+ +----+ +----+ |
| +-|4CLA|<-+ |4CLA|<-+ |4CLA|<-+ |4CLA|<--+--|--C0
| +----+ | +----+ | +----+ | +----+ | |
| || | || | || | || | |
| VV | VV | VV | VV | |
| +------------------------------------+ | |
| | P3G3 C12 P2G2 C8 P1G1 C4 P0G0| | |
C16 <--|--|C16 Carry Lookahead Unit(CLU) |<-+ |
| | PG GG | |
| +------------------------------------+ |
| 16-bit Carry-Lookahead Adder | | |
+---------------------------------------------+
| |
V V
+----+ | | +----+
A4-->| |------+ | +-->| |-->S4
B4-->| FA | | +----->| FA |
C4-->| |---+ +-------->| |--+
+----+ | +----+ |
+-----+ +-----------+
+----+ | | +----+
A5-->| |------+ | +-->| |-->S5
B5-->| FA | | +----->| FA |
C5-->| |---+ +-------->| |--+
+----+ | +----+ |
+-----+ +-----------+
+----+ | | +----+
A6-->| |------+ | +-->| |-->S6
B6-->| FA | | +----->| FA |
C6-->| |---+ +-------->| |--+
+----+ | +----+ |
遇到问题时知道去哪里找到正确的答案
使用正确的编程模式写出好代码, 降低出错的可能
assert
检查非预期行为
-Wall
,
-Werror
It's very satisfying to take a problem we thought difficult and find a simple solution. The best solutions are always simple.
-- Ivan Sutherland
教学的 “神之一手” - 用简单的话将一件复杂的事情讲清楚
同学喜欢的顺序: 单周期 -> 流水线 -> cache -> 总线 -> 仙剑
讲义顺序: 单周期 -> 仙剑 -> 总线 -> cache -> 流水线
即使是学过/做过的内容, 重新思考也会带来新的认识