控制寄存器的多个标志位可以分成三类:内存管理、保护与安全、性能优化。
1. 内存管理维度:PG、PAE、PSE
CR0.PG (分页启用) 与 CR0.PE (保护模式启用)
-
实现机制:这是一个两级“总闸”。
PG位直接控制 CPU 内部的分页单元(Paging Unit)的启用。当PG=1时,CPU 会将来自分段单元的线性地址送往分页单元进行转换,否则,线性地址就直接作为物理地址。 -
重要规则:硬件规定,
PG只能在PE=1(已开启保护模式)的情况下才能被置为 1。因此,从实模式启动到启用分页,必须先进入保护模式。
CR4.PAE (物理地址扩展)
-
实现机制:
PAE位改变了页表结构。当PAE=0时,使用 32位页表,页目录项(PDE)和页表项(PTE)都是 4 字节,最多寻址 4GB 物理内存。当PAE=1时,CPU 切换到 64位页表,PDE 和 PTE 变为 8 字节。页表项中的物理地址字段从 20 位扩展到 24 位(再加上 8 位,共 36 位),从而允许 32 位 CPU 寻址高达 64GB 的物理内存。 -
一个关键检查:操作系统在启用
PAE前,必须通过CPUID指令检查 CPU 是否真的支持PAE特性。
CR4.PSE (页大小扩展)
-
实现机制:
PSE位允许页的大小在 4KB 和 4MB 之间切换。当PSE=1时,CPU 会检查页目录项(PDE)中的PS(Page Size) 位。如果PS=1,该 PDE 就指向一个 4MB 的大页,而不是一个下级页表。大页减少了页表层级,增加了 TLB 的命中率,对数据库等大型应用性能有明显提升。 -
64位下的变化:在 x86-64 长模式下,
PSE标志被忽略,并固定支持 2MB 大页(由PS位控制)。
2. 保护与安全维度:WP、SMEP、SMAP、UMIP
CR0.WP (写保护)
-
实现机制:
WP位控制内核(Ring 0)能否写入标记为只读(Read-Only)的内存页。当WP=0时,内核可以无视页表上的只读标志,直接写入任何页面。当WP=1时,即使内核态,写入只读页也会触发页错误(Page Fault)。 -
核心用途:这是实现 写时复制(Copy-on-Write, COW) 的关键。在
fork()系统调用时,子进程的页表被标记为只读。当父子进程任意一方尝试写入时,会触发页错误,内核通过处理该错误来复制物理页。WP=1保证了内核在 COW 过程中不会意外绕过这个机制。
CR4.SMEP 与 CR4.SMAP
-
实现机制:这是两个基于特权级检查的硬件防护。
-
SMEP (Supervisor Mode Execution Prevention):当该位为 1 时,禁止内核(Ring 0)执行用户态(Ring 3)内存页中的代码。这能阻止经典的“ret2user”攻击,即内核被劫持后跳转到用户空间准备的恶意代码。
-
SMAP (Supervisor Mode Access Prevention):当该位为 1 时,禁止内核(Ring 0)访问用户态(Ring 3)内存页的数据。这能防止内核意外地从用户空间读取或写入数据,例如,防止
copy_from_user类函数在未做安全检查时被恶意利用。
-
-
如何绕过:内核可以通过临时设置
EFLAGS.AC标志位,在执行特定的用户空间访问操作时,短暂地禁用 SMAP 检查。
CR4.UMIP (用户模式指令预防)
-
实现机制:UMIP 使得
SGDT、SIDT、SLDT、SMSW和STR这五条指令,在用户态(CPL > 0)执行时会触发通用保护异常(#GP)。这些指令原本在用户态执行时只是返回一些信息(如 GDT 基址),但恶意软件可利用这些信息进行侧信道攻击或内核地址空间布局随机化(KASLR)绕过。UMIP 提供了硬件级的防护。
3. 性能与虚拟化维度:PGE、PCIDE、VMXE
CR4.PGE (全局页启用)
-
实现机制:
PGE位启用了页表项(PTE)中的 “全局页(Global Page)” 标志(bit 8)。当一个页被标记为“全局”时,即使CR3寄存器被修改(即发生进程切换),CPU 也不会自动刷新该页在 TLB 中的缓存。 -
用途:典型的全局页包括内核代码段、内核数据段等。因为所有进程都共享这部分内核地址空间,无需在每次上下文切换时重新建立 TLB 映射,能显著提升性能。
CR4.PCIDE (进程上下文标识符)
-
实现机制:
PCIDE位允许为每个进程分配一个 12 位的 PCID(Process Context IDentifier)。当启用后,CPU 在 TLB 中缓存地址转换信息时,会同时打上 PCID 标签。这样,在切换 CR3(切换进程)时,CPU 可以通过 PCID 区分不同进程的 TLB 条目,只刷新当前进程的 TLB,或根本不刷新。这避免了传统切换 CR3 时刷新整个 TLB 的巨大开销。 -
与 PGE 的协作:
PGE和PCIDE有密切配合。启用PCIDE时,全局页(PGE)的行为会稍有变化,它们会关联到一个特定的 PCID,而不是所有 PCID,实现了更细粒度的控制。
CR4.VMXE (虚拟机扩展启用)
-
实现机制:
VMXE是启用 Intel VT-x 的“总开关”。当该位为 1 时,CPU 才会识别并允许执行 VMX(Virtual Machine eXtensions) 指令集(如VMLAUNCH、VMRESUME等)。VMM(虚拟机监视器,如 KVM)使用这些指令来创建、进入和退出 VMX 根模式(VMM 自身) 和 VMX 非根模式(虚拟机内部)。启用VMXE本身并不会开始虚拟化,它只是允许 CPU 进入 VMX 操作模式。

68

被折叠的 条评论
为什么被折叠?



