CPU Registers x86-64

来自osdev
跳到导航 跳到搜索


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

通用寄存器

名称(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寄存器

(译者注:在x64架构下,原来的eflags寄存器升级成了64位的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的起始地址