目录
IA32_MTRR_PHYSMASKn MSR
Variable-Range MTRR 使用 IA32_MTRR_PHYSBASEn/IA32_MTRR_PHYSMASKn MSR 寄存器对,来描述一段物理内存区域的 memory type, 其中 IA32_MTRR_PHYSBASEn 寄存器负责描述物理内存区域的基地址和 memory type 信息, IA32_MTRR_PHYSMASKn 寄存器则提供掩码,以此确认物理内存区域的范围,其还提供了 V 标志位用于描述该寄存器对描述的物理区域是否有效. MTRR 机制支持多个这样的寄存器对,其可以通过 IA32_MTRRCAP MSR 寄存器的 VCNT 字段获得寄存器对的数量, 寄存器的布局如上图所示。当该寄存器对描述的物理内存区域与 Fixed-Range MTRR 寄存器描述的物理内存范围重叠,那么 MTRR 机制优先采用 Fixed-Range MTRR 寄存器描述的 memory type. X86 架构支持 IA32_MTRR_PHYSBASEn/IA32_MTRR_PHYSMASKn 寄存器对的数量目前为 8 个.
PhysMask
PhysMask 字段与 IA32_MTRR_PHYSBASEn MSR 寄存器相互配合计算出物理内存范围,其计算方法如下:
在上面的例子中,需要设置一段物理内存的 memory type,其起始物理地址是 0x100000, 长度为 1MiB,因此结束地址为 0x1FFFFF. 首先计算 IA32_MTRR_PHYSBASEn 中的 PhysBase 字段,其值为物理内存区域的起始物理页帧,也就是起始地址向右移动 PAGE_SHIFT 的结果,因此 0x100000 对应的 PhysBase 就是 0x100. 对于 IA32_MTRR_PHYSMASKn 中的 PhysMask 字段,其计算方法是将物理区域的长度减去 1,并取反码,接着将取反码的值向右移动 PAGE_SHIFT 位,最后与 PhysBase 字段值进行亦或操作,并将值限定在 (MAXPHYADDR - 12) 范围内,因此计算的 PhysMask 字段值为 0xFFFFE.
V
V 标志位则表示 IA32_MTRR_PHYSBASEn/IA32_MTRR_PHYSMASKn 描述的物理内存区域的 memory type 是否有效,当该标志位置位,那么 Variable-Range MTRR 可以使用该寄存器对描述; 反之则无效.
BiscuitOS 实践
Intel IA32_MTRR_PHYSMASKn MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_PHYSBASEn MSR
Variable-Range MTRR 使用 IA32_MTRR_PHYSBASEn/IA32_MTRR_PHYSMASKn MSR 寄存器对,来描述一段物理内存区域的 memory type, 其中 IA32_MTRR_PHYSBASEn 寄存器负责描述物理内存区域的基地址和 memory type 信息. MTRR 机制支持多个这样的寄存器对,其可以通过 IA32_MTRRCAP MSR 寄存器的 VCNT 字段获得寄存器对的数量。目前 X86 架构中支持多达 8 个 IA32_MTRR_PHYSBASEn/IA32_MTRR_PHYSMASKn 寄存器对,寄存器的布局如上图所示。当该寄存器对描述的物理内存区域与 Fixed-Range MTRR 寄存器描述的物理内存范围重叠,那么 MTRR 机制优先采用 Fixed-Range MTRR 寄存器描述的 memory type.
PhysBase
PhysBase 字段用于指定物理内存区域的起始物理页帧,其长度范围为 [12: MAXPHYADDR],该字段的值与对应的 IA32_MTRR_PHYSMASKn MSR 寄存器的 PhysMask 字段结合可以确定影响物理内存的范围,其计算如下:
在上面的例子中,需要设置一段物理内存的 memory type,其起始物理地址是 0x100000, 长度为 1MiB,因此结束地址为 0x1FFFFF. 首先计算 IA32_MTRR_PHYSBASEn 中的 PhysBase 字段,其值为物理内存区域的起始物理页帧,也就是起始地址向右移动 PAGE_SHIFT 的结果,因此 0x100000 对应的 PhysBase 就是 0x100. 对于 IA32_MTRR_PHYSMASKn 中的 PhysMask 字段,其计算方法是将物理区域的长度减去 1,并取反码,接着将取反码的值向右移动 PAGE_SHIFT 位,最后与 PhysBase 字段值进行亦或操作,并将值限定在 (MAXPHYADDR - 12) 范围内,因此计算的 PhysMask 字段值为 0xFFFFE.
Type
IA32_MTRR_PHYSBASEn MSR 寄存器的 Type 字段用于设置指定物理内存区域的 meory type, 其值代表的函数如上图.
BiscuitOS 实践
Intel IA32_MTRR_PHYSBASEn MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_FIX4K_F8000 MSR
IA32_MTRR_FIX4K_F8000 MSR 寄存器用于描述物理地址从 0xF8000H 到 0x10000H 之间 32 KiB 物理内存区域的 memory type. IA32_MTRR_FIX4K_F8000 MSR 寄存器位宽 64 位,其被划分为 8 个区域,每个区域占用 8 bit. IA32_MTRR_FIX4K_F8000 MSR 寄存器将物理内存 32 KiB 同样划分为 8 个区域,每个区域的长度正好是 4K,因此该寄存器的每个区域正好对应一个 4 KiB 区域,如上图所示。
IA32_MTRR_FIX4K_F8000 MSR 寄存器的每个域可以设置对应物理内存区域的 memory type,其值 对应的 memory type 如上图.
BiscuitOS 实践
Intel IA32_MTRR_FIX4K_F8000 MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_FIX4K_F0000 MSR
IA32_MTRR_FIX4K_F0000 MSR 寄存器用于描述物理地址从 0xF0000H 到 0xF8000H 之间 32 KiB 物理内存区域的 memory type. IA32_MTRR_FIX4K_F0000 MSR 寄存器位宽 64 位,其被划分为 8 个区域,每个区域占用 8 bit. IA32_MTRR_FIX4K_F0000 MSR 寄存器将物理内存 32 KiB 同样划分为 8 个区域,每个区域的长度正好是 4K,因此该寄存器的每个区域正好对应一个 4 KiB 区域,如上图所示。
IA32_MTRR_FIX4K_F0000 MSR 寄存器的每个域可以设置对应物理内存区域的 memory type,其值 对应的 memory type 如上图.
BiscuitOS 实践
Intel IA32_MTRR_FIX4K_F0000 MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_FIX4K_E8000 MSR
IA32_MTRR_FIX4K_E8000 MSR 寄存器用于描述物理地址从 0xE8000H 到 0xF0000H 之间 32 KiB 物理内存区域的 memory type. IA32_MTRR_FIX4K_E8000 MSR 寄存器位宽 64 位,其被划分为 8 个区域,每个区域占用 8 bit. IA32_MTRR_FIX4K_E8000 MSR 寄存器将物理内存 32 KiB 同样划分为 8 个区域,每个区域的长度正好是 4K,因此该寄存器的每个区域正好对应一个 4 KiB 区域,如上图所示。
IA32_MTRR_FIX4K_E8000 MSR 寄存器的每个域可以设置对应物理内存区域的 memory type,其值 对应的 memory type 如上图.
BiscuitOS 实践
Intel IA32_MTRR_FIX4K_E8000 MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_FIX4K_E0000 MSR
IA32_MTRR_FIX4K_E0000 MSR 寄存器用于描述物理地址从 0xE0000H 到 0xE8000H 之间 32 KiB 物理内存区域的 memory type. IA32_MTRR_FIX4K_E0000 MSR 寄存器位宽 64 位,其被划分为 8 个区域,每个区域占用 8 bit. IA32_MTRR_FIX4K_E0000 MSR 寄存器将物理内存 32 KiB 同样划分为 8 个区域,每个区域的长度正好是 4K,因此该寄存器的每个区域正好对应一个 4 KiB 区域,如上图所示。
IA32_MTRR_FIX4K_E0000 MSR 寄存器的每个域可以设置对应物理内存区域的 memory type,其值 对应的 memory type 如上图.
BiscuitOS 实践
Intel IA32_MTRR_FIX4K_E0000 MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_FIX4K_D8000 MSR
IA32_MTRR_FIX4K_D8000 MSR 寄存器用于描述物理地址从 0xD8000H 到 0xE0000H 之间 32 KiB 物理内存区域的 memory type. IA32_MTRR_FIX4K_D8000 MSR 寄存器位宽 64 位,其被划分为 8 个区域,每个区域占用 8 bit. IA32_MTRR_FIX4K_D8000 MSR 寄存器将物理内存 32 KiB 同样>划分为 8 个区域,每个区域的长度正好是 4K,因此该寄存器的每个区域正好对应一个 4 KiB 区域,如上图所示。
IA32_MTRR_FIX4K_D8000 MSR 寄存器的每个域可以设置对应物理内存区域的 memory type,其值 对应的 memory type 如上图.
BiscuitOS 实践
Intel IA32_MTRR_FIX4K_D8000 MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_FIX4K_D0000 MSR
IA32_MTRR_FIX4K_D0000 MSR 寄存器用于描述物理地址从 0xD0000H 到 0xD8000H 之间 32 KiB 物理内存区域的 memory type. IA32_MTRR_FIX4K_D0000 MSR 寄存器位宽 64 位,其被划分为 8 个区域,每个区域占用 8 bit. IA32_MTRR_FIX4K_D0000 MSR 寄存器将物理内存 32 KiB 同样>划分为 8 个区域,每个区域的长度正好是 4K,因此该寄存器的每个区域正好对应一个 4 KiB 区域,如上图所示。
IA32_MTRR_FIX4K_D0000 MSR 寄存器的每个域可以设置对应物理内存区域的 memory type,其值 对应的 memory type 如上图.
BiscuitOS 实践
Intel IA32_MTRR_FIX4K_D0000 MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_FIX4K_C8000 MSR
IA32_MTRR_FIX4K_C8000 MSR 寄存器用于描述物理地址从 0xC8000H 到 0xD0000H 之间 32 KiB 物理内存区域的 memory type. IA32_MTRR_FIX4K_C8000 MSR 寄存器位宽 64 位,其被划分为 8 个区域,每个区域占用 8 bit. IA32_MTRR_FIX4K_C8000 MSR 寄存器将物理内存 32 KiB 同样划分为 8 个区域,每个区域的长度正好是 4K,因此该寄存器的每个区域正好对应一个 4 KiB 区域,如上图所示。
IA32_MTRR_FIX4K_C8000 MSR 寄存器的每个域可以设置对应物理内存区域的 memory type,其值 对应的 memory type 如上图.
BiscuitOS 实践
Intel IA32_MTRR_FIX4K_C8000 MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_FIX4K_C0000 MSR
IA32_MTRR_FIX4K_C0000 MSR 寄存器用于描述物理地址从 0xC0000H 到 0xC8000H 之间 32 KiB 物理内存区域的 memory type. IA32_MTRR_FIX4K_C0000 MSR 寄存器位宽 64 位,其被划分为 8 个区域,每个区域占用 8 bit. IA32_MTRR_FIX4K_C0000 MSR 寄存器将物理内存 32 KiB 同样划分为 8 个区域,每个区域的长度正好是 4K,因此该寄存器的每个区域正好对应一个 4 KiB 区域,如上图所示。
IA32_MTRR_FIX4K_C0000 MSR 寄存器的每个域可以设置对应物理内存区域的 memory type,其值对应的 memory type 如上图.
BiscuitOS 实践
Intel IA32_MTRR_FIX4K_C0000 MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_FIX16K_A0000 MSR
IA32_MTRR_FIX16K_A0000 MSR 寄存器用于描述物理地址从 0xA0000H 到 0xC0000H 之间 128 KiB 物理内存区域的 memory type. IA32_MTRR_FIX16K_A0000 MSR 寄存器位宽 64 位,其被划分为 8 个区域,每个区域占用 8 bit. IA32_MTRR_FIX16K_A0000 MSR 寄存器将物理内存 128 KiB 同样划分为 8 个区域,每个区域的长度正好是 16K,因此该寄存器的每个区域正好对应一个 16 KiB 区域,如上图所示。
IA32_MTRR_FIX16K_A0000 MSR 寄存器的每个域可以设置对应物理内存区域的 memory type,其值对应的 memory type 如上图.
BiscuitOS 实践
Intel IA32_MTRR_FIX16K_A0000 MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_FIX16K_80000 MSR
IA32_MTRR_FIX16K_80000 MSR 寄存器用于描述物理地址从 0x80000H 到 0xA0000H 之间 128 KiB 物理内存区域的 memory type. IA32_MTRR_FIX16K_80000 MSR 寄存器位宽 64 位,其被划分为 8 个区域,每个区域占用 8 bit. IA32_MTRR_FIX16K_80000 MSR 寄存器将物理内存 128 KiB 同样划分为 8 个区域,每个区域的长度正好是 16K,因此该寄存器的每个区域正好对应一个 16 KiB 区域,如上图所示。
IA32_MTRR_FIX16K_80000 MSR 寄存器的每个域可以设置对应物理内存区域的 memory type,其值对应的 memory type 如上图.
BiscuitOS 实践
Intel IA32_MTRR_FIX16K_80000 MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_FIX64K_00000 MSR
IA32_MTRR_FIX64K_00000 MSR 寄存器用于描述物理地址从 0x00000H 到 0x7FFFFH 之间 512 KiB 物理内存区域的 memory type. IA32_MTRR_FIX64K_00000 MSR 寄存器位宽 64 位,其被划分为 8 个区域,每个区域占用 8 bit. IA32_MTRR_FIX64K_00000 MSR 寄存器将物理内存前 512 KiB 同样划分为 8 个区域,每个区域的长度正好是 64K,因此该寄存器的每个区域正好对应一个 64 KiB 区域,如上图所示。
IA32_MTRR_FIX64K_00000 MSR 寄存器的每个域可以设置对应物理内存区域的 memory type,其值对应的 memory type 如上图.
BiscuitOS 实践
Intel IA32_MTRR_FIX64K_00000 MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRR_DEF_TYPE MSR
IA32_MTRR_DEF_TYPE MSR 寄存器从 P6 家族处理器开始被命名为 “MTRRdefType MSR”, 该寄存器的作用范围是被 MTRRs 相关寄存器设置 memory type 的物理内存区域,该寄存器会为这些区域设置默认的 memory type。其字段描述如下:
Type field
Type 域用于为没有设置 memory type 的物理内存区域,设置默认的 memory type。该区域默认支持的 memory type 为 0, 1, 4, 5 和 6. 如果设置为其他值会引起通用保护异常 (#GP), memory type 对应的值如下表:
Intel 推荐使用 UC (Uncached) 作为所有物理内存缺省时的 memory type。MTRR 机制为不存在内存的位置分配 UC,既可以通过该寄存器设置为默认的 memory type,也可以显示的通过 Fixed-Range Register 和 Variable-Range Register 进行设置.
FE (Fixed MTRRs enabled)
FE 标志用于指明 MTRR 机制是否支持 Fixed-Range Register. 当该标志置位,那么系统支持 Fixed-Range Register, Fixed-Range Register 用于为固定的物理内存区域设置 memory type; 反之当该标志清零,那么 MTRR 机制不支持 Fixed-Range Register. MTRR 机制也包含了 Variable-Range Register, 其可灵活设置某段内存区域的 memory type。MTRR 机制支持的 Fixed-Range Register 列表如下:
当 Fixed-Range Register 设置的某块固定物理内存区域与 Variable-Range Register 设置的>某块物理内存区域存在重叠,那么对于重叠部分物理内存的 memory type,MTRR 机制优先采用 Fixed-Range Register 设置的 memory type. 当标志清零,那么 MTRR 机制一直使用 Variable-Range Register 的值作为指定物理区域的 memory type。
E (MTRRs Enable)
E 标志用于指明系统是否使能了 MTRR 机制。之前讨论过,架构在 CPUID.01H EDX 的 12 bit 用于指明是否支持 MTRR 机制,而 E 标志位则指明系统是否使用 MTRR 机制。当该标志为清零,那么系统没有使能 MTRR 机制,那么所有的物理内存的 memory type 则为 UC; 反之改标志位置位,那么 MTRR 机制使能,可以使用 Fixed-Range Register 和 Variable-Range Register 设置指定物理内存区域的 memory type.
Other bit
IA32_MTRR_DEF_TYPE MSR 寄存器的其他 bit 均为 Reserved, 如果对这些 bit 写入非 0 值,那么会触发通用保护异常 (#GP).
BiscuitOS 实践
Intel IA32_MTRR_DEF_TYPE MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_MTRRCAP MSR
IA32_MTRRCAP MSR 寄存器从 P6 家族处理器开始被命名为 “MTRRcap MSR”, 该寄存器为只读寄存器,需要通过 RDMSR 指令进行读取,寄存器内部提供了多个域用于描述 MTRR 机制的能力信息,其字段描述如下:
VCNT (Variable range registers count)
VCNT 字段用于描述当前 MTRR 机制支持的 Variable-Range Register 的数量, 该字段的长度为 8its, 因此系统支持的最大 Variable-Range Register 的数量不会超过 256 个,Linux 支持的最大 Variable-Range Register 数量通过宏 MTRR_MAX_VAR_RANGES 进行维护.
FIX (Fixed range register supports)
FIX 字段用于描述 MTRR 机制是否支持 Fixed-Range Register. 当该标志位置位,那么 MTRR 机制提供的 Fixed-Range Register 包含了 IA32_MTRR_FIX64K_00000 到 IA32_MTRR_FIX4K_0F8000 12 个寄存器; 反之当该标志位清零,MTRR 机制中不存在 Fixed-Range Register.
WC (Write Combining)
WC 字段用于描述系统是否支持 Write-combining memory type。Write-combining 写合并缓存类型也是一种 memory type。当该标志位清零,那么系统以及 MTRR 机制不支持 WC; 反之该标志位置位,那么系统支持 WC,MTRR 机制相关的寄存器可以将对应的物理内存区域的 memory type 设置为 WC.
SMRR (System-Management Range Register)
SMRR 字段用于描述系统是否支持 System-Management range register, 如果该标志位置位,那么系统支持 SMRR; 反之该标志位清零,那么系统不支持 SMRR.
BiscuitOS 实践
Intel IA32_MTRRCAP MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
X86 CR3 Control Register
CR3 With 32Bit Paging
BiscuitOS 实践
Intel CR3 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
X86 CPUID Register
CPUID.80000008H
BiscuitOS 实践
Intel CPUID.80000008H 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
CPUID.01H
EAX
ECX
EDX
BiscuitOS 实践
Intel CPUID.01H 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
BiscuitOS 实践
Intel CPUID 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
X86 EFLAGS Register
X86 EFLAGS Register 包含了一组状态、控制和系统标志。
EFLAGS.AC
EFLAGS.AC 标志位用于指明 “对齐检测” 或 “访问控制”. 当 CR0.AM 标志位置位,那么 AC 标志位用于表示 “对齐检测”.
如果 CR4.SMAP 标志位置位,那么内核空间可以访问用户空间的数据.
BiscuitOS 实践
Intel EFLAGS 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
IA32_EFER MSR
X86 IA32_EFER MSR 寄存器全称 “Extended Feature enable Register”, 该寄存器提供了多个域与 IA-32e 模式的使能和操作相关,其中也包含了一个与 page-access 权限修改相关的域。
IA32_EFER.LME
IA32_EFER.LME 标志用于指明 IA-32e 模式是否激活. 当该标志置位,那么 IA-32 模式已经激活; 反之 IA-32e 模式没有激活.
IA32_EFER.NXE
IA32_EFER.NXE 标志用于指明使能物理页的访问限制,如果该 bit 置位,那么系统会阻止 PAE 物理页在 XD 标志置位的情况下的指令预取.
BiscuitOS 实践
Intel IA32_EFER MSR 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
CR4
X86 CR4 寄存器包含了一组标志,该标志用于使能体系 “拓展的” 且用于指明操作系统或执行程序所支持的处理器特殊能力。
CR4.PSE
CR4.PSE 标志用于指明 32-bit 系统分页是否支持 4MB 物理页的映射。如果该标志位置位,那么在 32-bit 系统里,PTE 可以指向一块 4MB 的物理页; 反之该标志位清零,那么在 32-bit 系统中 PTE 只能映射 4KB 的物理页.
CR4.PAE
CR4.PAE 标志用于指明系统是否支持物理地址拓展。当该标志位置位,那么分页的时候使用超过 32 bit 的物理地址; 反之,当该标志位清零的时候,物理地址只能是 32 bit。当系统进入 IA-32e 模式之前,CR4.PAE 表示为必须使能。
CR4.PGE
CR4.PGE 标志用于指明是否支持全局页特性。如果该标志位使能,那么系统支持全局页属性; 反之不支持全局页属性。全局页属性允许所有的用户频繁使用或共享 PTE/PDE 中 “Global” 标志位置位的页。全局页特点包括当 Task 切换或者更新 CR3 的值不会引起全局页从 TLB 中刷出. 当系统需要使能 CR4.PGE 标志,那么 CR0.PG 必须使能。
CR4.PCIDE
CR4.PCIDE 标志用于指明是否支持处理器上下文标识. 当该标志位置位,那么系统支持 PCIDs 功能; 反之系统不支持 PCIDs 功能.
CR4.SMEP
CR4.SMEP 标志用于指明系统是否支持阻止 “超级用户执行” 的能力。如果该标志位置位,那么系统可能阻止超级用户执行的动作.
CR4.SMAP
CR4.SMAP 标志用于指明系统是否支持阻止 “超级用户访问” 的能力. 如果该标志位置位,那么系统可能阻止超级用户访问的动作.
CR4.PKE
CR4.PKE 标志用于指明系统是否支持在 4-level 分页时附带一个 “Protection key”. PKRU 寄存器指明用户的线性地址的 “Protection key” 是否可读写.
BiscuitOS 实践
Intel X86 CR4 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下:
CR0
X86 CR0 寄存器包含了用于控制处理器的操作模式和状态的系统控制标志。其长度为 32 bit,每个标志位的作用将左右操作系统的行为和状态.
CR0.PG
CR0.PG 标志位用于使能系统的分页机制. 如果 CR0.PG 置位,那么系统支持分页,此时线性地址不是虚拟地址; 反之 CR0.PG 清零,那么系统不支持分页,此时线性地址就是物理地址. CR0.PG 标志位的变化不受 CR0.PE 标志位的影响,但当 CR0.PE 标志位清零的时候,将 CR0.PG 标志位置位将引起一个 #GP 错误, 也就是系统没有进入保护模式的时候,系统开启分页将引起一个 “general-protection exception (#GP)”.
CR0.PE
CR0.PE 标志位用于使能系统的保护模式. 如果 CR0.PE 置位,那么系统进入保护模式; 如果 CR0.PE 清零,那么系统进入实时模式。CR0.PE 的使能不能直接启用系统的分页功能,需要再将 CR0.PG 置位,并且 CR0.PE 的使能只提供了 Segment 级别的保护.
CR0.WP
CR0.WP 用于使能写保护机制。当 CR0.WP 置位,那么系统会阻止超级权限的程序去写只读的物理页; 反之当 CR0.WP 清零,那么系统允许超级权限的程序对只读物理页进行写操作。
BiscuitOS 实践
Intel X86 CR0 寄存器在 BiscuitOS 中的实践如下:
具体实践过程可以参考:
程序在 BiscuitOS 运行效果如下: