CR0 到 CR4 是 x86 架构中核心的控制寄存器(Control Registers),它们就像 CPU 的“主控开关”,决定了 CPU 的工作模式、内存管理机制和众多扩展特性的开启与关闭。
按照功能把它们分成了“基础控制”和“特性控制”两大类。
第一层:基础控制寄存器(CR0, CR3)
CR0 和 CR3 是 CPU 运行的基础。
CR0:CPU 工作模式与状态(“总开关”)
CR0 控制 CPU 最核心的运行模式和保护机制。
| 标志位 | 名称 | 功能描述 |
|---|---|---|
| PE(bit 0) | 保护模式启用 | 1=启用保护模式,0=实模式。 |
| MP(bit 1) | 监控协处理器 | 控制 x87 FPU 的交互。 |
| EM(bit 2) | 模拟协处理器 | 1=用软件模拟 FPU,0=使用硬件 FPU。 |
| TS(bit 3) | 任务切换标志 | 在任务切换时设置,用于管理 FPU 上下文的延迟保存。 |
| ET(bit 4) | 扩展类型 | 在 386 时代标识 FPU 类型,现代 CPU 已固定。 |
| NE(bit 5) | 数字错误 | 控制 x87 FPU 异常的报告方式。 |
| WP(bit 16) | 写保护 | 1=即使内核(Ring 0)也不能修改只读页面,用于实现fork()的写时复制(COW)。 |
| AM(bit 18) | 对齐检查 | 结合 EFLAGS 的 AC 位,控制是否对齐检查。 |
| NW(bit 29) | 非写直达 | 与 CD 位配合,控制缓存策略。 |
| CD(bit 30) | 缓存禁用 | 控制是否禁用整个 CPU 的缓存。 |
| PG(bit 31) | 分页启用 | 1=启用分页机制,0=禁用。启用分页前,必须先启用 PE(保护模式)。 |
PG 和 PE共同决定 CPU 的内存管理模式:
PE=0, PG=0:实模式
PE=1, PG=0:保护模式(无分页)
PE=1, PG=1:保护模式(启用分页)
CR3:页表基址寄存器
CR3 用于存储当前进程的页表(Page Table)的物理基地址。
在 32 位模式下,存储页目录(Page Directory)的基址。
在 64 位模式下,存储PML4(Page Map Level 4)表的基址。
关键点:切换进程时,操作系统会更新 CR3 的值,CPU 会自动刷新 TLB(地址转换缓存),以切换到新进程的地址空间。
第二层:特性控制寄存器(CR4)
CR4 控制着 CPU 的各种现代扩展特性,是 CPU 的“高级功能开关”。
| 标志位 | 名称 | 功能描述 |
|---|---|---|
| VME(bit 0) | 虚拟 8086 模式扩展 | 在虚拟 86 模式下支持增强的中断处理。 |
| PVI(bit 1) | 保护模式虚拟中断 | 在保护模式下,支持虚拟中断标志(VIF)。 |
| TSD(bit 2) | 时间戳禁用 | 1=禁止用户态 (Ring 3) 执行RDTSC指令,防止计时侧信道攻击。 |
| DE(bit 3) | 调试扩展 | 1=启用 I/O 断点等调试扩展特性。 |
| PSE(bit 4) | 页大小扩展 | 1=允许页表使用 4MB 的大页(32位模式下)。 |
| PAE(bit 5) | 物理地址扩展 | 1=启用 PAE,允许 32 位 CPU 访问超过 4GB 的物理内存。 |
| MCE(bit 6) | 机器检查异常 | 1=启用机器检查异常,用于报告硬件错误(如ECC错误)。 |
| PGE(bit 7) | 全局页启用 | 1=启用全局页(Global Pages),某些页在 CR3 切换时不被刷新 TLB,可提升性能。 |
| PCE(bit 8) | 性能计数器启用 | 1=允许用户态执行RDPMC指令,读取性能计数器。 |
| OSFXSR(bit 9) | 操作系统 FXSAVE/FXRSTOR | 1=表示操作系统支持FXSAVE和FXRSTOR指令,用于保存/恢复 SSE 等扩展寄存器。 |
| OSXMMEXCPT(bit 10) | 操作系统 SSE 异常 | 1=表示操作系统支持处理 SSE/SSE2 的 SIMD 浮点异常。 |
| UMIP(bit 11) | 用户模式指令预防 | 1=阻止用户态执行SGDT、SIDT、SLDT、SMSW、STR等敏感指令。 |
| VMXE(bit 13) | 虚拟机扩展启用 | 1=启用 Intel VT-x 硬件虚拟化技术。 |
| SMXE(bit 14) | SMX 启用 | 启用 Safer Mode Extensions,为可信执行环境(TXT)提供支持。 |
| FSGSBASE(bit 16) | FS/GS 基址读写 | 1=启用RDFSBASE、WRFSBASE等指令,允许用户态直接读写 FS/GS 的基址。 |
| PCIDE(bit 17) | 进程上下文标识符 | 1=启用 PCID 特性,让 TLB 缓存带上进程标签,减少 CR3 切换时的 TLB 刷新开销。 |
| OSXSAVE(bit 18) | 操作系统 XSAVE | 1=表示操作系统支持XSAVE指令集,用于保存/恢复 AVX 等扩展寄存器。 |
| SMEP(bit 20) | 监管模式执行保护 | 1=禁止内核(Ring 0)执行用户态(Ring 3)的代码页,防止内核被劫持。 |
| SMAP(bit 21) | 监管模式访问保护 | 1=禁止内核(Ring 0)访问用户态(Ring 3)的数据页,防止内核意外读取用户数据。 |
| CET(bit 23) | 控制流执行技术 | 启用英特尔 CET,一种针对 ROP/JOP 等控制流劫持攻击的硬件防护机制。 |
CR1 和 CR2:
CR1:在 x86 架构中保留未使用。
CR2:专门用于页错误(Page Fault)。当 CPU 发生页错误时,CR2 会自动保存触发错误的线性地址(虚拟地址)。操作系统(如 Linux 的
do_page_fault函数)会读取 CR2,以知道是哪个地址访问出了问题。
总结
这些控制寄存器一起,构建了现代操作系统运行的基础:
CR0决定了 CPU 工作在实模式还是保护模式,以及分页是否开启,是一切的基础。
CR3负责内存地址的转换,是进程独立的虚拟内存空间的核心。
CR4则负责开启各种“高级功能”,如大页支持(PSE)、64位支持(PAE)、虚拟化(VMXE)、内核防护(SMEP/SMAP)等。