x86/x86_64 下的 CPU 控制寄存器


前言

x86/x86_64 CPU 中提供了控制寄存器,来决定 CPU 的操作模式和当前执行任务的属性。这些寄存器在 32 位模式下是 32 bit,在 64 位模式中,控制寄存器扩展为 64 bit。

CPU 架构中共有 CR0、CR1、CR2、CR3、CR4、CR8 共 6 个控制寄存器。

一、CR0 寄存器

CR0 寄存器是 x86 架构中的一种控制寄存器,用于控制和配置处理器的操作模式和特性。CR0 寄存器中的位字段包含了各种系统和处理器状态的控制位,具体功能如下:

CR0 寄存器结构

  • PE:保护使能(Protection Enable),该位用于控制处理器的保护模式。
    • 当 PE = 1 时,处理器运行在保护模式下,可以使用内存保护等功能。
    • 当 PE = 0时,处理器运行在实模式下。
  • MP:监视协处理器(Monitor Coprocessor),该位用于控制对协处理器的监控。
    • 当 MP = 1 时,处理器监视协处理器的使用情况,当发生对协处理器的操作时,会触发异常。
    • 当 MP = 0 时,处理器不监视协处理器。
  • EM:模拟(Emulation),该位用于控制协处理器的模拟。
    • 当 EM = 1 时,处理器不支持协处理器指令,会将协处理器指令转为软件模拟执行。
    • 当 EM = 0 时,处理器支持协处理器指令。
  • TS:任务切换(Extension Type),该位用于指示处理器是否支持处理器扩展。
    • 当 ET = 1 时,表示处理器支持处理器扩展。
    • 当 ET = 0 时,表示不支持处理器扩展。
  • ET:扩展类型(Extension Type),该位用于指示处理器是否支持处理器扩展。
    • 当 ET = 1 时,表示处理器支持处理器扩展。
    • 当 ET = 0 时,表示不支持处理器扩展。
  • NE:数值错误(Numeric Error),该位用于控制浮点异常的处理方式。
    • 当 NE = 1 时,处理器会将浮点异常的错误码保存到浮点异常状态寄存器中。
    • 当 NE = 0 时,处理器在浮点异常发生时不保存错误码。
  • WP:写保护(Write Protect),该位用于控制写保护。
    • 当 WP = 1 时,处理器会禁止用户态程序向只读页面写数据。
    • 当 WP = 0 时,处理器不会执行写保护。
  • AM:对齐掩码(Alignment Mask),该位用于控制内存对齐检查。
    • 当 AM = 1 时,处理器会执行内存对齐检查。
    • 当 AM = 0 时,处理器不会执行对齐检查。
  • NW:不直写(Not Write-through),该位用于控制写缓冲的写策略。
    • 当 NW = 1 时,处理器执行不通过写缓冲进行写操作,而直接写入内存。
    • 当 NW = 0 时,处理器使用写缓冲进行写操作。
  • CD:缓存禁用(Cache Disable),该位用于控制处理器的缓存。
    • 当 CD 为 1 时,处理器禁用数据缓存。
    • 当 CD 为 0 时,处理器启用数据缓存。
  • PG:分页(Paging),该位用于控制分页功能。
    • 当 PG = 1 时,处理器启用分页机制。
    • 当 PG = 0 时,处理器禁用分页机制。

注意,这些字段的设置和读取需要在特权级别为 0(内核态)的情况下进行。

二、CR1 寄存器

CR1是未定义的控制寄存器,供将来的处理器使用。

三、CR2 寄存器

CR2是页故障线性地址寄存器,保存最后一次出现页故障(Page Fault)的全 32(或 64) 位线性地址。

CR2 寄存器结构

四、CR3 寄存器

CR3 是页目录基址寄存器,也叫做:PDBR(Page Table Base Register),用于保存页目录表的物理地址,页目录表总是放在以 4K 字节为单位的存储器边界上,因此,它的地址的低 12 位总为 0,不起作用,即使写上内容,也不会被理会。

每个任务(程序)都有自己的页目录和页表,页目录表的地址被记录在任务的 TSS 段中。

当操作系统调度任务的时候,处理器就会找到即将执行的新任务的 TSS 段信息,然后把新任务的页目录开始地址更新到 CR3 寄存器中。

每当用 MOV 指令重置 CR3 的值时,会导致分页机制高速缓冲区的内容无效,用此方法,可以在启用分页机制之前,即把 CR0 的 PG 位置 1之前,预先刷新分页机制的高速缓存。CR3 寄存器即使在 CR0 寄存器的 PG 位或 PE 位为 0 时也可装入,如在实模式下也可设置 CR3,以便进行分页机制的初始化。在任务切换时,CR3 要被改变,但是如果新任务中 CR3 的值与原任务中 CR3 的值相同,那么处理器不刷新分页高速缓存,以便当任务共享页表时有较快的执行速度。

CR3 寄存器结构

  • PWT:页级写穿标志位(Page-Level Write-Through),用于指定页表是否应用写穿策略。
  • PCD:页级高速缓存禁用标志位(Page-Level Cache Disable),用于指定页表是否应用高速缓存禁用策略。
  • Page Directory Base Address:这些位存储了页目录表(Page Directory Table)的物理地址的高20位,用于指定页目录表的起始物理地址。
    • 如果是 64 位的话 CR3 寄存器的第 32 位到第 52 位是 Page Directory Base Address 的扩展位,用于指定页目录表的起始物理地址的剩余 12 位。

五、CR4 寄存器

CR4 包含了一些扩展控制位,用于控制和配置处理器的高级功能。

CR4 寄存器结构
各个字段如下:

  • VME:允许使用虚拟 8086 模式扩展。
  • PVI:保护模式虚拟中断。
  • TSD:禁用处理器在启动过程中使用时间戳计数器。
  • DE:允许调试扩展。
  • PSE:启用超级页(2MB页)
  • PAE:启用物理地址扩展,支持大于4GB的物理内存。
    • 当 PAE = 1 时,是 2-9-9-12 分页。
    • 当 PAE = 0 时, 是 10-10-12 分页。
  • MCE:启用机器检查异常。
  • PGE:启用全局页表。
  • PCE:启用性能监控计数器。
  • OSFXSR:允许操作系统使用 FXSAVE 和 FXRSTOR 指令进行 XMM 寄存器的保存和恢复。
  • OSXMMEXCPT:允许操作系统使用 SSE 指令集的浮点异常。
  • UMIP:防止用户模式下执行特权指令。
  • VMXE:启用虚拟机扩展。
  • SMXE:启用安全模式扩展。
  • FSGSBASE:启用 FS、GS 寄存器的基址存储。
  • PCIDE:启用 PCID(Process Context Identifier)。
  • OSXSAVE:启用 XSAVE 和 XRSTOR 指令。
  • SMEP:启用用户模式执行保护。
  • SMAP:启用内核空间和用户空间地址映射的严格分离。

六、CR8 寄存器

CR8-提供对任务优先级寄存器(Task Priority Register, TPR)的读写访问。它指定优先级值,操作系统用于控制允许中断处理器的外部中断的优先级类别。此寄存器仅在 64 位模式下可用。但是,中断过滤在兼容模式下继续应用。

任务优先级寄存器存储了当前任务的优先级级别。优先级级别是一个 0 到 15 的值,其中 0 表示最高优先级,15 表示最低优先级。处理器使用该寄存器中的值来确定任务的调度顺序和优先级。

更多信息可以查阅 Intel 手册。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值