目录


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 寄存器相互配合计算出物理内存范围,其计算方法如下:

# e.g. Physial Address Range 1MiB: 0x100000 - 0x1FFFFF

PhysBase = 0x100000 >> PAGE_SHIFT = 0x100
PhsyMask = (PhysBase ^ (~(1Mib - 1) >> PAGE_SHIFT)) & 0xFFFFFFFF = 0xFFFFFE

在上面的例子中,需要设置一段物理内存的 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 可以使用该寄存器对描述; 反之则无效.

IA32_MTRR_PHYSMASKn MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_PHYSMASKn MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_PHYSMASKn  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_PHYSMASKn-default

MSR IA32_MTRR_PHYSMASKn Source Code

具体实践过程可以参考:

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 字段结合可以确定影响物理内存的范围,其计算如下:

# e.g. Physial Address Range 1MiB: 0x100000 - 0x1FFFFF

PhysBase = 0x100000 >> PAGE_SHIFT = 0x100
PhsyMask = (PhysBase ^ (~(1Mib - 1) >> PAGE_SHIFT)) & 0xFFFFFFFF = 0xFFFFFE

在上面的例子中,需要设置一段物理内存的 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, 其值代表的函数如上图.

IA32_MTRR_PHYSBASEn MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.3


BiscuitOS 实践

Intel IA32_MTRR_PHYSBASEn MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_PHYSBASEn  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_PHYSBASEn-default

MSR IA32_MTRR_PHYSBASEn Source Code

具体实践过程可以参考:

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 如上图.

IA32_MTRR_FIX4K_F8000 MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_FIX4K_F8000 MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_FIX4K_F8000  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_FIX4K_F8000-default

MSR IA32_MTRR_FIX4K_F8000 Source Code

具体实践过程可以参考:

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 如上图.

IA32_MTRR_FIX4K_F0000 MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_FIX4K_F0000 MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_FIX4K_F0000  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_FIX4K_F0000-default

MSR IA32_MTRR_FIX4K_F0000 Source Code

具体实践过程可以参考:

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 如上图.

IA32_MTRR_FIX4K_E8000 MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_FIX4K_E8000 MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_FIX4K_E8000  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_FIX4K_E8000-default

MSR IA32_MTRR_FIX4K_E8000 Source Code

具体实践过程可以参考:

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 如上图.

IA32_MTRR_FIX4K_E0000 MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_FIX4K_E0000 MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_FIX4K_E0000  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_FIX4K_E0000-default

MSR IA32_MTRR_FIX4K_E0000 Source Code

具体实践过程可以参考:

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 如上图.

IA32_MTRR_FIX4K_D8000 MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_FIX4K_D8000 MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_FIX4K_D8000  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_FIX4K_D8000-default

MSR IA32_MTRR_FIX4K_D8000 Source Code

具体实践过程可以参考:

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 如上图.

IA32_MTRR_FIX4K_D0000 MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_FIX4K_D0000 MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_FIX4K_D0000  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_FIX4K_D0000-default

MSR IA32_MTRR_FIX4K_D0000 Source Code

具体实践过程可以参考:

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 如上图.

IA32_MTRR_FIX4K_C8000 MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_FIX4K_C8000 MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_FIX4K_C8000  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_FIX4K_C8000-default

MSR IA32_MTRR_FIX4K_C8000 Source Code

具体实践过程可以参考:

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 如上图.

IA32_MTRR_FIX4K_C0000 MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_FIX4K_C0000 MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_FIX4K_C0000  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_FIX4K_C0000-default

MSR IA32_MTRR_FIX4K_C0000 Source Code

具体实践过程可以参考:

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 如上图.

IA32_MTRR_FIX16K_A0000 MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_FIX16K_A0000 MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_FIX16K_A0000  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_FIX16K_A0000-default

MSR IA32_MTRR_FIX16K_A0000 Source Code

具体实践过程可以参考:

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 如上图.

IA32_MTRR_FIX16K_80000 MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_FIX16K_80000 MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_FIX16K_80000  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_FIX16K_80000-default

MSR IA32_MTRR_FIX16K_80000 Source Code

具体实践过程可以参考:

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 如上图.

IA32_MTRR_FIX64K_00000 MSR Register BiscuitOS 实践

Intel Software Development Vol3 11.11.2.2


BiscuitOS 实践

Intel IA32_MTRR_FIX64K_00000 MSR 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_FIX64K_00000  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_FIX64K_00000-default

MSR IA32_MTRR_FIX64K_00000 Source Code

具体实践过程可以参考:

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 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRR_DEF_TYPE  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRR_DEF_TYPE-default

MSR IA32_MTRR_DEF_TYPE Source Code

具体实践过程可以参考:

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 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_MTRRCAP  --->

BiscuitOS/output/linux-XXXX/package/MSR-IA32_MTRRCAP-default

MSR IA32_MTRRCAP Source Code

具体实践过程可以参考:

BiscuitOS 独立程序实践教程

程序在 BiscuitOS 运行效果如下:


X86 CR3 Control Register

CR3 With 32Bit Paging

CR3 Register BiscuitOS 实践

Intel Software Development Vol2.3.2 CPUID


CR3 With 32Bit Paging


BiscuitOS 实践

Intel CR3 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] CR3 Register  --->
                  [*] X86 CR3 Register (Common)  --->

CR3 Source Code

具体实践过程可以参考:

BiscuitOS 独立程序实践教程

程序在 BiscuitOS 运行效果如下:


X86 CPUID Register

CPUID.01H

CPUID Register BiscuitOS 实践

Intel Software Development Vol2.3.2 CPUID


CPUID.80000008H

CPUID.01H Register BiscuitOS 实践


BiscuitOS 实践

Intel CPUID.80000008H 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] CPUID  --->
                  [*] X86 CPUID Register  --->
                      [*] CPUID.80000008H Register  --->
                          [*] X86 CPUID.80000008H Register  --->

CPUID.80000008H Source Code

具体实践过程可以参考:

BiscuitOS 独立程序实践教程

程序在 BiscuitOS 运行效果如下:


CPUID.01H

EAX

ECX

EDX

CPUID.01H Register BiscuitOS 实践


EAX


ECX


EDX


BiscuitOS 实践

Intel CPUID.01H 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] CPUID  --->
                  [*] X86 CPUID Register  --->
                      [*] CPUID.01H Register  --->
                          [*] X86 CPUID.01H Register  --->

CPUID.01H Source Code

具体实践过程可以参考:

BiscuitOS 独立程序实践教程

程序在 BiscuitOS 运行效果如下:


BiscuitOS 实践

Intel CPUID 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] CPUID  --->
                  [*] X86 CPUID Register  --->

CPUID Source Code

具体实践过程可以参考:

BiscuitOS 独立程序实践教程

程序在 BiscuitOS 运行效果如下:


X86 EFLAGS Register

X86 EFLAGS Register 包含了一组状态、控制和系统标志。

EFLAGS.AC

EFLAGS Register BiscuitOS 实践

Intel Software Development Vol3 2.2.1


EFLAGS.AC

EFLAGS.AC 标志位用于指明 “对齐检测” 或 “访问控制”. 当 CR0.AM 标志位置位,那么 AC 标志位用于表示 “对齐检测”.

如果 CR4.SMAP 标志位置位,那么内核空间可以访问用户空间的数据.

CR4.SMAP


BiscuitOS 实践

Intel EFLAGS 寄存器在 BiscuitOS 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] EFLAGS Register  --->
                  [*] X86 EFLAGS Register  --->

EFLAGS Register Source Code

具体实践过程可以参考:

BiscuitOS 独立程序实践教程

程序在 BiscuitOS 运行效果如下:


IA32_EFER MSR

X86 IA32_EFER MSR 寄存器全称 “Extended Feature enable Register”, 该寄存器提供了多个域与 IA-32e 模式的使能和操作相关,其中也包含了一个与 page-access 权限修改相关的域。

IA32_EFER.LME

IA32_EFER.NXE

IA32_EFER MSR Register BiscuitOS 实践

Intel Software Development Vol3 2.2.1


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 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] MSR Register  --->
                  [*] MSR IA32_EFER  --->

MSR IA32_EFER Source Code

具体实践过程可以参考:

BiscuitOS 独立程序实践教程

程序在 BiscuitOS 运行效果如下:


CR4

X86 CR4 寄存器包含了一组标志,该标志用于使能体系 “拓展的” 且用于指明操作系统或执行程序所支持的处理器特殊能力。

CR4.PSE

CR4.PAE

CR4.PGE

CR4.PCIDE

CR4.SMEP

CR4.SMAP

CR4.PKE

CR4 Register BiscuitOS 实践

Intel Software Development Vol3 2.5


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 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] CR4 Control Register  --->

CR0 Control Register Source Code

具体实践过程可以参考:

BiscuitOS 独立程序实践教程

程序在 BiscuitOS 运行效果如下:


CR0

X86 CR0 寄存器包含了用于控制处理器的操作模式和状态的系统控制标志。其长度为 32 bit,每个标志位的作用将左右操作系统的行为和状态.

CR0.PG

CR0.PE

CR0.WP

CR0 Register BiscuitOS 实践

Intel Software Development Vol3 2.5


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 中的实践如下:

cd BiscuitOS
make menuconfig

  [*] Package  --->
      [*] Register  --->
          [*] X86/i386/X64 Register  --->
              [*] CR0 Control Register  --->

CR0 Control Register Source Code

具体实践过程可以参考:

BiscuitOS 独立程序实践教程

程序在 BiscuitOS 运行效果如下: