计算机组成原理

大二上学期计算机组成原理的复习笔记,目前已完结。含自学的后半部分。

一、数据

1. 基本概念

  1. 字长:指针数据的标称大小,32 位系统为 4 字节
  2. 对象的地址为低地址(最小地址),最低有效字节在低地址(67 45 23 01)
  3. 逻辑运算符 && 和 || 有短路性,位运算符没有
  4. 加减法的优先级高于移位运算
  5. 整数运算有交换结合分配律没有单调性;浮点运算有单调性、只有交换律

2. 整数

  1. 逻辑右移补零,算术右移补符号位
  2. %d,%u,%x 分别输出有符号十进制、无符号十进制、十六进制
  3. 有符号和无符号运算时,有符号被转为无符号
  4. short 转 unsigned:先扩展(补符号位),再转为无符号
  5. 加法溢出:无符号 $s<x$;有符号 $x,y$ 同号且结果异号
  6. TMin 的逆元为 TMin,其余为相反数
  7. 有无符号右移为向下取整,但有符号除法要向零:x<0 ? x+(1<<k)-1 : x) >> k
  8. ~x+1 等价于 -x

3. 浮点数

  1. 32 位:1+8+23,64 位:1+11+52
  2. $V=(-1)^s\times M\times 2^E,E=e-Bias=e-2^{k-1}-1$
  3. 规格化数 $M=1+f$;非规格化数 $M=f,e=1$
  4. 向偶数舍入,最低有效位为 0 为偶数(只对 X.Y100 有效)
  5. $NaN+x=NaN$

二、汇编

1. 基本概念

  1. movq 不支持内存到内存
  2. leaq 仅做地址计算,不访问内存,不设置条件码
  3. sarq 算术右移,shrq 逻辑右移
  4. ZF:零;SF:负;CF/OF:无符号/有符号溢出
  5. cmp,test 设置条件码,不保存结果
  6. ja/jb 无符号大于/小于;jl=(SF^OF)
  7. setX 只支持低地址单字节,配合 movzbl(32 位)
  8. 条件移动 cmovX:不用于复杂计算、风险引用和副作用计算

2. 过程调用

  1. 栈:向低地址生长,%rsp 指向当前栈顶
  2. call 将下一条指令地址入栈,属于调用者栈帧
  3. 参数顺序:%rdi,%rsi,%rdx,%rcx,%r8,%r9,Arg7 在低地址
  4. 调用者保存:%rax,%r10,%r11 和六个参数
  5. 存储空间:text 代码,data 全局变量,heap 动态分配,stack 局部变量
  6. 栈攻击防护:检查输入长度、安全函数、栈随机化、栈不可执行、金丝雀

三、处理器

1. Y86-64 指令集

  1. 无 %r15,无 CF(只有 opq 设置),小端法
  2. 寄存器:%rax,%rcx,%rdx,%rbx,%rsp,%rbp,%rsi,%rdi
  3. icode:halt,nop,cmov,irmovq,rmmovq,mrmovq,opq,jxx,call,ret,pushq,popq
  4. irmovq 寄存器 F,rB;mrmovq D(rB),rA
  5. ifun:le,l,e,ne,ge,g;add,sub,and,xor
  6. 状态:AOK,HLT,ADR,INS=1,2,3,4
  7. 程序结构:从零地址开始,需初始化栈指针和数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
init:
irmovq Stack, %rsp
call Main
halt

.align 8
Array:
.quad ...
.quad 0

Main:
...

.pos 0x100
Stack:

2. 顺序处理器

  1. HCL:小写 bool 大写 words,&&/||/!;in {}
  2. 阶段:Fetch,Decode,Execute,Memory,WriteBack,PC
    1. Fetch:icode,ifun;rA,rB;valC;valP
    2. Decode:valA,srcA;valB,srcB
    3. Execute:valB/0 OP/ALUADD valA/valC/8;0xF
    4. Memory:valM
    5. WriteBack:valE,dstE;valM,dstM
    6. PC:Cnd? (Cnd $\leftarrow$ Cond(CC,ifun))
  3. 控制流
    1. int icode=[imem_error:INOP;1:mem_icode;];
    2. int ifun=[imem_error:FNONE;1:mem_ifun;];
    3. int Stat=[imem_error||dmem_error:SADR;!instr_valid:SINS;icode==IHALT:SHLT;1:SAOK;];
    4. need_regids;mem_addr;mem_read;new_pc

四、存储

1. 缓存

  1. Miss:cold(compulsory),capacity,conflict
  2. S=2^s sets, E=2^e lines/set, B=2^b bytes/block
  3. Address:m=t+s+b,(S,E,B,m)
  4. Write-through/back;Write-allocate/no-write-allocate
  5. 存储器山:时间局部性脊,空间局部性斜坡,硬件预取脊

2. 程序优化

  1. 矩阵乘法:A[i][k]*B[k][*]=C[i][*];分块 $3B^2<C$
  2. 通用方法:代码移动(减少函数调用)、临时变量
  3. 循环展开:减少数据依赖,展开、重组、并行

五、链接

  1. 编译过程:.c $\to$ 预处理 $\to$ .i $\to$ 编译 $\to$ .s $\to$ 汇编 $\to$ .o $\to$ 链接 $\to$ .exe
  2. 可重定位目标文件 .o:代码 .text,数据 .rodata/.data/.bss(只读/已初始化/未初始化),符号表 .symtab,重定位表 .rel.text/.rel.data
  3. 库:静态库 .a(多个 .o 文件打包,链接时提取需要的 .o 文件)、动态库 .so/.dll(链接时记录库名和符号表,运行时加载)
  4. 链接过程:符号解析确定所需 .o 再合并,重定位引用地址

六、异常控制流

  1. 异常:中断(异步 I/O)、陷阱(系统调用)、故障(可恢复错误)、终止(不可恢复错误)
  2. 进程:虚拟内存空间(代码、数据、栈)、寄存器、文件描述符表
  3. 信号:类似异常,接收后内核将控制流转移到信号处理程序再返回

七、虚拟内存

  1. 正常流程:MMU 接收虚拟地址向内存中页表请求查询物理页号,再将物理页号和虚拟页偏移量组合成物理地址向内存请求访问
  2. 缺页:MMU 发现物理页号首位无效(地址指向初始磁盘位置),触发缺页异常将磁盘复制到内存,更新页表后重试访问
  3. 加速:TLB 页表缓存、多级页表、和高速缓存联用

八、系统级 I/O

  1. 共享文件:描述符表进程独立,打开文件表和 v-node 表进程共享
  2. 打开同一文件两次:描述符表中两条,指向打开文件表中不同条,指向同一 v-node 表条
  3. 父子进程:复制描述符表,对应条指向同一打开文件表条,指向同一 v-node 表条
  4. 重定向:将描述符表条重新指向其他打开文件表条(可用于 stdin/out/err)

九、网络编程

  1. 端口:客户端由内核自动分配临时端口,服务器为固定端口,服务器内核监听到端口请求后将控制流转移到对应程序
  2. URL:通用资源定位符,用于静态内容在服务器磁盘上查找
  3. CGI :通用网关接口,用于动态内容传递运行参数,用?分隔文件名和参数,用&分隔参数

十、并发编程

  1. 并发方式:进程式(遇请求后 fork)、事件式(遇请求后转移控制流)、多线程
  2. 线程:栈(同一虚拟内存空间的不同区间)、寄存器,共享虚拟内存空间、文件描述符
  3. 信号量:P(减一,阻塞直到非负)、V(加一,唤醒一个等待线程),用于互斥锁
  4. 死锁:等待永远不为真的条件,如 PV 顺序不一致导致的禁止区域左下角

计算机组成原理
https://sqzr2319.github.io/25Fall/CSAPP/
作者
sqzr2319
发布于
2026年1月9日
许可协议