计算机组成原理
大二上学期计算机组成原理的复习笔记,目前已完结。含自学的后半部分。
一、数据
1. 基本概念
- 字长:指针数据的标称大小,32 位系统为 4 字节
- 对象的地址为低地址(最小地址),最低有效字节在低地址(67 45 23 01)
- 逻辑运算符 && 和 || 有短路性,位运算符没有
- 加减法的优先级高于移位运算
- 整数运算有交换结合分配律没有单调性;浮点运算有单调性、只有交换律
2. 整数
- 逻辑右移补零,算术右移补符号位
- %d,%u,%x 分别输出有符号十进制、无符号十进制、十六进制
- 有符号和无符号运算时,有符号被转为无符号
- short 转 unsigned:先扩展(补符号位),再转为无符号
- 加法溢出:无符号 $s<x$;有符号 $x,y$ 同号且结果异号
- TMin 的逆元为 TMin,其余为相反数
- 有无符号右移为向下取整,但有符号除法要向零:
x<0 ? x+(1<<k)-1 : x) >> k - ~x+1 等价于 -x
3. 浮点数
- 32 位:1+8+23,64 位:1+11+52
- $V=(-1)^s\times M\times 2^E,E=e-Bias=e-2^{k-1}-1$
- 规格化数 $M=1+f$;非规格化数 $M=f,e=1$
- 向偶数舍入,最低有效位为 0 为偶数(只对 X.Y100 有效)
- $NaN+x=NaN$
二、汇编
1. 基本概念
- movq 不支持内存到内存
- leaq 仅做地址计算,不访问内存,不设置条件码
- sarq 算术右移,shrq 逻辑右移
- ZF:零;SF:负;CF/OF:无符号/有符号溢出
- cmp,test 设置条件码,不保存结果
- ja/jb 无符号大于/小于;jl=(SF^OF)
- setX 只支持低地址单字节,配合 movzbl(32 位)
- 条件移动 cmovX:不用于复杂计算、风险引用和副作用计算
2. 过程调用
- 栈:向低地址生长,%rsp 指向当前栈顶
- call 将下一条指令地址入栈,属于调用者栈帧
- 参数顺序:%rdi,%rsi,%rdx,%rcx,%r8,%r9,Arg7 在低地址
- 调用者保存:%rax,%r10,%r11 和六个参数
- 存储空间:text 代码,data 全局变量,heap 动态分配,stack 局部变量
- 栈攻击防护:检查输入长度、安全函数、栈随机化、栈不可执行、金丝雀
三、处理器
1. Y86-64 指令集
- 无 %r15,无 CF(只有 opq 设置),小端法
- 寄存器:%rax,%rcx,%rdx,%rbx,%rsp,%rbp,%rsi,%rdi
- icode:halt,nop,cmov,irmovq,rmmovq,mrmovq,opq,jxx,call,ret,pushq,popq
- irmovq 寄存器 F,rB;mrmovq D(rB),rA
- ifun:le,l,e,ne,ge,g;add,sub,and,xor
- 状态:AOK,HLT,ADR,INS=1,2,3,4
- 程序结构:从零地址开始,需初始化栈指针和数据
1 | |
2. 顺序处理器
- HCL:小写 bool 大写 words,&&/||/!;in {}
- 阶段:Fetch,Decode,Execute,Memory,WriteBack,PC
- Fetch:icode,ifun;rA,rB;valC;valP
- Decode:valA,srcA;valB,srcB
- Execute:valB/0 OP/ALUADD valA/valC/8;0xF
- Memory:valM
- WriteBack:valE,dstE;valM,dstM
- PC:Cnd? (Cnd $\leftarrow$ Cond(CC,ifun))
- 控制流
int icode=[imem_error:INOP;1:mem_icode;];int ifun=[imem_error:FNONE;1:mem_ifun;];int Stat=[imem_error||dmem_error:SADR;!instr_valid:SINS;icode==IHALT:SHLT;1:SAOK;];need_regids;mem_addr;mem_read;new_pc
四、存储
1. 缓存
- Miss:cold(compulsory),capacity,conflict
- S=2^s sets, E=2^e lines/set, B=2^b bytes/block
- Address:m=t+s+b,(S,E,B,m)
- Write-through/back;Write-allocate/no-write-allocate
- 存储器山:时间局部性脊,空间局部性斜坡,硬件预取脊
2. 程序优化
- 矩阵乘法:
A[i][k]*B[k][*]=C[i][*];分块 $3B^2<C$ - 通用方法:代码移动(减少函数调用)、临时变量
- 循环展开:减少数据依赖,展开、重组、并行
五、链接
- 编译过程:.c $\to$ 预处理 $\to$ .i $\to$ 编译 $\to$ .s $\to$ 汇编 $\to$ .o $\to$ 链接 $\to$ .exe
- 可重定位目标文件 .o:代码 .text,数据 .rodata/.data/.bss(只读/已初始化/未初始化),符号表 .symtab,重定位表 .rel.text/.rel.data
- 库:静态库 .a(多个 .o 文件打包,链接时提取需要的 .o 文件)、动态库 .so/.dll(链接时记录库名和符号表,运行时加载)
- 链接过程:符号解析确定所需 .o 再合并,重定位引用地址
六、异常控制流
- 异常:中断(异步 I/O)、陷阱(系统调用)、故障(可恢复错误)、终止(不可恢复错误)
- 进程:虚拟内存空间(代码、数据、栈)、寄存器、文件描述符表
- 信号:类似异常,接收后内核将控制流转移到信号处理程序再返回
七、虚拟内存
- 正常流程:MMU 接收虚拟地址向内存中页表请求查询物理页号,再将物理页号和虚拟页偏移量组合成物理地址向内存请求访问
- 缺页:MMU 发现物理页号首位无效(地址指向初始磁盘位置),触发缺页异常将磁盘复制到内存,更新页表后重试访问
- 加速:TLB 页表缓存、多级页表、和高速缓存联用
八、系统级 I/O
- 共享文件:描述符表进程独立,打开文件表和 v-node 表进程共享
- 打开同一文件两次:描述符表中两条,指向打开文件表中不同条,指向同一 v-node 表条
- 父子进程:复制描述符表,对应条指向同一打开文件表条,指向同一 v-node 表条
- 重定向:将描述符表条重新指向其他打开文件表条(可用于 stdin/out/err)
九、网络编程
- 端口:客户端由内核自动分配临时端口,服务器为固定端口,服务器内核监听到端口请求后将控制流转移到对应程序
- URL:通用资源定位符,用于静态内容在服务器磁盘上查找
- CGI :通用网关接口,用于动态内容传递运行参数,用?分隔文件名和参数,用&分隔参数
十、并发编程
- 并发方式:进程式(遇请求后 fork)、事件式(遇请求后转移控制流)、多线程
- 线程:栈(同一虚拟内存空间的不同区间)、寄存器,共享虚拟内存空间、文件描述符
- 信号量:P(减一,阻塞直到非负)、V(加一,唤醒一个等待线程),用于互斥锁
- 死锁:等待永远不为真的条件,如 PV 顺序不一致导致的禁止区域左下角
计算机组成原理
https://sqzr2319.github.io/25Fall/CSAPP/