CPU Registers x86-64

来自osdev
Zhang3讨论 | 贡献2022年3月23日 (三) 11:31的版本 (创建页面,内容为“Category:CPU_Registers {{Disputed|Talk:CPU_Registers_x86-64}} == 通用寄存器 == {| class="wikitable" border="1" |- ! colspan=5 | 名称(Monikers) ! rowspan=2 | 描述 |- ! 64-bit ! 32-bit ! 16-bit ! 低16位中的8高位 ! 8-bit |- | RAX | EAX | AX | AH | AL | 累加器(Accumulator) |- | RBX | EBX | BX | BH | BL | 基址(Base) |- | RCX | ECX | CX | CH | CL | 计数器(Counter) |- | RDX | EDX | DX | DH | DL | 数据(Data - 通常用于扩展A寄…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索


本文或本节的事实准确性是有争议的
请看 讨论页 上的相关讨论。

通用寄存器

名称(Monikers) 描述
64-bit 32-bit 16-bit 低16位中的8高位 8-bit
RAX EAX AX AH AL 累加器(Accumulator)
RBX EBX BX BH BL 基址(Base)
RCX ECX CX CH CL 计数器(Counter)
RDX EDX DX DH DL 数据(Data - 通常用于扩展A寄存器)
RSI ESI SI N/A SIL 字符串操作源索引(Source index for string operations)
RDI EDI DI N/A DIL 字符串操作的目标索引(Destination index for string operations)
RSP ESP SP N/A SPL 堆栈指针(Stack Pointer)
RBP EBP BP N/A BPL 基址指针(Base Pointer 用于堆栈帧)
R8 R8D R8W N/A R8B 通用
R9 R9D R9W N/A R9B 通用
R10 R10D R10W N/A R10B 通用
R11 R11D R11W N/A R11B 通用
R12 R12D R12W N/A R12B 通用
R13 R13D R13W N/A R13B 通用
R14 R14D R14W N/A R14B 通用
R15 R15D R15W N/A R15B 通用

注意:使用REX.W指令前缀(译者注:REX前缀是在64位模式下使用的指令前缀字节,是机器编码的一种扩展)时,不能访问AHBHCHDH。 当操作数包含64位寄存器时,会添加此前缀 (由汇编器自动添加)。

指针寄存器(Pointer Registers)

名称(Monikers) 描述
64-bit 32-bit 16-bit
RIP EIP IP 指令指针(Instruction Pointer)

注意: 指令指针只能在RIP-相对寻址(RIP-relative addressing)中使用,这是在长模式(long mode)中引入的。

段寄存器(Segment Registers)

所有这些都是16位长。

名称(Monikers) 描述
CS 代码段(Code Segment)
DS 数据段(Data Segment)
SS 栈段(Stack Segment)
ES 额外段(Extra Segment 用于字符串操作)
FS 通用段
GS 通用段

CSDSESSS的段被视为基址为0,无论GDT中的段描述符如何表示。 例外是FSGS,它们有MSR来更改它们的基址。

所有段的限制检查均被禁用。

RFLAGS寄存器

标记 描述
0 CF 进位标志(Carry Flag)
1 1 保留
2 PF 奇偶校验标志(Parity Flag)
3 0 保留
4 AF 辅助进位标志(Auxiliary Carry Flag)
5 0 保留
6 ZF 零标志(Zero Flag)
7 SF 符号标志(Sign Flag)
8 TF 陷阱标志(Trap Flag)
9 IF 中断启用标志(Interrupt Enable Flag)
10 DF 方向标志(Direction Flag)
11 OF 溢出标志(Overflow Flag)
12-13 IOPL I/O权限级别(I/O Privilege Level)
14 NT 嵌套任务(Nested Task)
15 0 保留
16 RF 恢复标志(Resume Flag)
17 VM 虚拟8086模式(Virtual-8086 Mode)
18 AC 对齐检查/访问控制(Alignment Check / Access Control)
19 VIF 虚拟中断标志(Virtual Interrupt Flag)
20 VIP 虚拟中断待处理(Virtual Interrupt Pending)
21 ID 身份标志(ID Flag)
22-63 0 Reserved

控制寄存器(Control Registers)

CR0

位 (s) 标记 描述
0 PE 保护模式启用(Protected Mode Enable)
1 MP 监视器协处理器(Monitor Co-Processor)
2 EM 仿真(Emulation)
3 TS 任务切换(Task Switched)
4 ET 扩展类型(Extension Type)
5 NE 数值错误(Numeric Error)
6-15 0 保留
16 WP 写保护(Write Protect)
17 0 保留
18 AM 对齐掩码(Alignment Mask)
19-28 0 保留
29 NW 非直写(Not-Write Through)
30 CD 缓存禁用(Cache Disable)
31 PG 分页(Paging)
32-63 0 保留

请注意,此寄存器是唯一可以通过两种方式写入和读取的控制寄存器,而其他方式只能通过MOV指令访问

;方式1:
;写入:
mov cr0,reg32(64)
;读取:
mov reg32(64),cr0 
;----------------------
;方式2:
;写入:
lmsw reg16(32/64) ; lms(w)中的“w”代表word(16位),但指令本身可以使用指令重写修改cr0的上48位。

;读取:
smsw reg16(32/64) ; 同上

CR2

此控制寄存器包含触发页错误(page fault)的线性 (虚拟) 地址,可在页错误的中断处理程序中使用。

CR3

标记 描述 条件
0-11 0-2 0 保留 CR4.PCIDE = 0
3 PWT 页面级直写(Page-Level Write Through)
5 PCD 关闭页级缓存(Page-Level Cache Disable)
5-11 0 保留
0-11 PCID CR4.PCIDE = 1
12-63 PML4的物理基址(Page-Level Cache Disable)

请注意,这必须与页面对齐

CR4

位 (s) 标记 描述
0 VME 虚拟8086模式扩展(Virtual-8086 Mode Extensions)
1 PVI 保护模式虚拟中断(Protected Mode Virtual Interrupts)
2 TSD 时间戳仅在环0中启用(Time Stamp enabled only in ring 0)
3 DE 调试扩展(Debugging Extensions)
4 PSE 页面大小扩展(Page Size Extension)
5 PAE 物理地址扩展(Physical Address Extension)
6 MCE 机器检查异常(Machine Check Exception)
7 PGE 页面全局启用(Page Global Enable)
8 PCE 启用性能监控计数器(Performance Monitoring Counter Enable)
9 OSFXSR 操作系统对fxsave和fxrstor指令的支持
10 OSXMMEXCPT OS支持无掩码simd浮点异常
11 UMIP 用户模式指令保护(用户态关闭SGDT、SIDT、SLDT、SMSW、STR)
12 0 保留
13 VMXE 虚拟机扩展支持(Virtual Machine Extensions Enable)
14 SMXE 启用安全模式扩展(Safer Mode Extensions Enable)
15 0 保留
16 FSGSBASE Enables the instructions RDFSBASE, RDGSBASE, WRFSBASE, and WRGSBASE
17 PCIDE PCID启用
18 OSXSAVE XSAVE和处理器扩展状态启用
19 0 保留
20 SMEP 监控模式执行保护启用(Supervisor Mode Executions Protection Enable)
21 SMAP 启用Supervisor模式访问保护(Supervisor Mode Access Protection Enable)
22 PKE 为用户模式页面启用保护密钥
23 CET 启用控制流强制技术(Enable Control-flow Enforcement Technology)
24 PKS 启用主管模式页面的保护密钥(Enable protection keys for supervisor-mode pages)
25-63 0 保留

CR8

CR8是一个新的寄存器,可在64位模式下使用REX前缀访问。 CR8用于确定外部中断的优先级,称为任务优先级寄存器(TPR- task-priority register)。

AMD64体系结构允许软件定义多达15个外部中断优先级类。 优先级等级从1到15进行编号,优先级等级1最低,优先级等级15最高。 CR8使用四个低序位来指定任务优先级,其余60位为保留位,必须用零写入。

系统软件可以使用TPR寄存器来暂时阻止低优先级中断中断高优先级任务。 这是通过向TPR加载与要阻止的最高优先级中断相对应的值来实现的。 例如,加载值为9(1001b)的TPR会阻止优先级为9或更低的所有中断,同时允许识别优先级为10或更高的所有中断。 用0加载TPR启用所有外部中断。 用15(1111b)加载TPR将禁用所有外部中断。

复位时,TPR清零。

意图
0-3 优先级(Priority)
4-63 保留

CR1, CR5-7, CR9-15

保留,cpu在试图访问它们时会抛出#ud exeption。

MSRs

IA32_EFER

扩展功能启用寄存器(EFER)是AMD K6处理器中添加的型号特定寄存器(model-specific register),用于启用SYSCALL/SYSRET指令,以及稍后用于进入和退出长模式。 该寄存器在 AMD64 中成为架构设计,并已被英特尔采用。 其MSR编号为0xC0000080。

标记 描述
0 SCE 系统调用扩展(System Call Extensions)
1-7 0 保留
8 LME 长模式启用(Long Mode Enable)
10 LMA 长模式激活(Long Mode Active)
11 NXE 否-启用执行(No-Execute Enable)
12 SVME 安全虚拟机启用(Secure Virtual Machine Enable)
13 LMSLE 长模式段限制启用(Long Mode Segment Limit Enable)
14 FFXSR 快速 FXSAVE/FXRSTOR
15 TCE 转换缓存扩展(Translation Cache Extension)
16-63 0 保留

FS.base, GS.base

地址为0xC0000100(用于FS)和0xC0000101(用于GS)的MSR包含FS和GS段寄存器的基址。 这些通常用于用户代码中的线程指针和内核代码中的CPU本地指针。 可以安全地包含任何内容,因为使用段不会赋予用户代码额外的权限。

在较新的CPU中,还可以在任何特权级别使用WRFSBASE和WRGSBASE指令写入这些指令。

KernelGSBase

地址为0xC0000102的MSR。 基本上是在swapgs指令之后与GS.base交换的缓冲区。 通常用于分离GS寄存器的内核和用户使用。

调试寄存器(Debug Registers)

DR0 - DR3

最多包含4个断点的线性地址。 如果启用了分页,则将它们转换为物理地址。

DR6

它允许调试器确定发生了哪些调试条件。 启用调试异常时,在进入调试异常处理程序之前设置低位0-3。

DR7

描述
0 本地DR0断点
1 全局DR0断点
2 本地DR1断点
3 全局DR1断点
4 本地DR2断点
5 全局DR2断点
6 本地DR3断点
7 全局DR3断点
16-17 DR0的条件
18-19 DR0断点大小
20-21 DR1的条件
22-23 DR1断点的大小
24-25 适用于DR2的条件
26-27 DR2断点的大小
28-29 DR3的条件
30-31 DR3断点大小

硬件任务切换的本地断点位被停用,而全局则没有。

00b条件表示执行中断,01b表示写入观察点(watchpoint),11b表示R/W观察点。10b是为I/O R/W保留的(不支持)。

测试寄存器(Test Registers)

名称 描述
TR3 - TR5 无文档记录
TR6 测试命令寄存器(Test Command Register)
TR7 测试数据寄存器(Test Data Register)

保护模式寄存器(Protected Mode Registers)

GDTR

操作数大小 标记 描述
64-bit 32-bit
Bits 0-15 Limit GDT的大小
Bits 16-79 Bits 16-47 Base GDT的起始地址

LDTR

存储LDT的段选择器。

TR

存储 TSS 的分段选择器。

IDTR

操作数大小 标记 描述
64-bit 32-bit
Bits 0-15 Limit IDT 的大小
Bits 16-79 Bits 16-47 Base IDT的起始地址