CPU体系结构笔记

4.1 Y86-64指令集体系结构

通过Y86——一个模拟X86的体系结构学习CPU结构

程序员可见状态

CPU体系结构笔记_第1张图片
去掉了%r15,用F代表无寄存器。

Y86-64指令

只支持64位。

mov:

分成irmovq,rrmovq,mrmovq,rmmovq。不支持第二变址寄存器,和伸缩。即rrmovq (%rdi,%rsi,4) %rdx这样的格式。

算数运算:

addq, subq, andq, xorq,这些指令会设置条件码。

剩余:跳转,条件传送,call&ret,push&pop,halt

指令编码

与x86类似。第一个字节前四位指明指令大类,后四位指明具体行为,比如 addq=0x60。第二个字节指明REGIS A,B。
CPU体系结构笔记_第2张图片

4.2逻辑设计和硬件控制语言HCL

逻辑门

CPU体系结构笔记_第3张图片
[逻辑门类型和图形表示]

组合电路和HCL布尔表达式

HCL布尔表达式都能够被转化成电路设计。比如位相等bool eq = (a && b) || (!a && !b)就可以用下图表示。
CPU体系结构笔记_第4张图片

字节级别

将64个小电路做AND运算即可。
CPU体系结构笔记_第5张图片
可以抽象成一个大单元。

存储器和时钟

作者先提出了两类寄存器的区别。这是在后面才会学到的。硬件寄存器,是用于字传送的,程序员不可见。程序寄存器,程序员可见,就是汇编用到的那些。
寄存器在电压上升是载入新值,输出旧址(保存的值)。时钟控制着寄存器的加载。

4.3 Y86-64的SEQ实现

SEQ硬件实现

在顺序实现中,一个时钟周期被分为5片(2和5经常在一起说):1.fetch 2. decode 3.execute 4.memory 5.write back 6.pc update

fetch

从M[PC]中拿到指令,rA,rB,valC,valP(+8的)。检测简单错误。

decode

从寄存器得到valA,valB。

execute

根据icode,决定ALU的功能,输出valE。

memory

根据memo_addr,memo_data,从内存中读取/写入数据/产出错误。他们的值从HCL中来。

write back

根据dstE,valE(execute得到的),dstM,valM(memory得到的)更新目标寄存器。
CPU体系结构笔记_第6张图片

SEQ的实现

这个部分把上面的图拆成5个部分,每个部分用小图和HCL的方式描述出来。完整HCL如下

fetch

CPU体系结构笔记_第7张图片

#SEQ

bool need_regids =icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, IIRMOVQ, IRMMOVQ, IMRMOVQ };

bool need_valC = icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL };

decode&writeback

CPU体系结构笔记_第8张图片

word srcA = [ icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ icode in { IPOPQ, IRET } : RRSP; 1 : RNONE; # Don’t need register ];

word srcB = [ icode in { IOPQ, IRMMOVQ, IMRMOVQ } : rB; icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; 1 : RNONE; # Don’t need register ];

# WARNING: Conditional move not implemented correctly here word 
dstE = [ icode in { IRRMOVQ } : rB; icode in { IIRMOVQ, IOPQ} : rB; icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; 1 : RNONE; # Don’t write any register ];

word dstM = [ icode in { IMRMOVQ, IPOPQ } : rA; 1 : RNONE; # Don’t write any register ];

word dstE = [ icode in { IRRMOVQ } && Cnd : rB; icode in { IIRMOVQ, IOPQ} : rB; icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; 1 : RNONE; # Don’t write any register ];

execute

CPU体系结构笔记_第9张图片

word aluA = [icode in { IRRMOVQ, IOPQ } : valA; icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : valC;

word aluB = [ icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, IPUSHQ, IRET, IPOPQ } : valB;
icode in { IRRMOVQ, IIRMOVQ } : 0;
# Other instructions don’t need ALU 
];


word alufun = [ icode == IOPQ : ifun; 1 : ALUADD; ];

bool set_cc = icode in { IOPQ };

memory

CPU体系结构笔记_第10张图片

word mem_addr = [ icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : valE; icode in { IPOPQ, IRET } : valA; 
# Other instructions don’t need address
];

word mem_data = [ # Value from register icode in { IRMMOVQ, IPUSHQ } : valA; # Return PC icode == ICALL : valP; 
# Default: Don’t write anything
];

bool mem_read = icode in { IMRMOVQ, IPOPQ, IRET };

bool mem_write = icode in { IRMMOVQ, IPUSHQ, ICALL };

update pc

word new_pc = [

# Call. Use instruction constant 
icode == ICALL : valC; 
# Taken branch. Use instruction constant
 icode == IJXX && Cnd : valC; 
# Completion of RET instruction. Use value from stack
 icode == IRET : valM; 
# Default: Use incremented 
1 : valP;
];
# Determine instruction status 
word Stat = [ imem_error || dmem_error : SADR; !instr_valid: SINS; icode == IHALT : SHLT; 1 : SAOK; ];

4.4 流水线通用原理

你可能感兴趣的:(csapp,cpu架构,读书笔记)