2. paging机制下使用的资源

  • 1 寄存器
  • 2 CPUID查询leaf
    • 2.1 CPUID.01H leaf功能
    • 2.2 CPUID.07H leaf功能
    • 2.3 CPUID.80000001H leaf功能
  • 3 寄存器的控制位
  • 4 页转换表资源
    • 4.1 32位paging模式中
    • 4.2 PAE paging模式中
    • 4.3 IA-32e paging模式中

1 寄存器

下面的寄存器需要被使用。

① CR0、CR2、CR3和CR4。

② IA32_EFER。

CR0和CR4用来开启和控制paging机制及页转换表结构CR2是保存发生#PF异常的线性地址CR3是整个页转换表结构的基地址

IA32_EFER开启IA-32e模式(long-mode)。

2 CPUID查询leaf

paging机制里某些功能需要先查询处理器是否支持,在支持的情况下才可以enable功能。

2.1 CPUID.01H leaf功能

01H叶返回的ECX和EDX寄存器包括了大多数paging机制support位

① ECX[17].PCID位:指示处理器是否支持PCID功能,支持的话可以开启CR4.PCIDE控制位

② EDX[3].PSE位:指示是否支持4M页面,支持的话可以对CR4.PSE控制位置位。在32位paging模式下通过PDE.PS=1来使用4M页面。这个support位与PSE-36位是不同的意义,但PSE-36功能需要配合4M页面使用。

③ EDX[17].PSE-36位:如果支持:指示在32位paging模式下,PDE能提供最高40位的物理地址。那么PDE[16:13]是36位物理地址的高4位,或者PDE[20:13]是40位物理地址的高8位。如果不支持则这些位为保留位

④ EDX[6].PAE位:指示是否支持PAE(Physical Address Extensions)模式,是的话通过对CR4.PAE置位使用PAE paging模式,并可以使用36位、40位或52位的最高物理地址,依赖于MAXPHYADDR值

⑤ EDX[16].PAT位:指示是否支持PAT(Page Attribute Table)功能

⑥ EDX[13].PGE位:指示是否支持PGE(Page Global Enable)功能,支持的话可以置CR4.PGE=1支持Global page功能。

2.2 CPUID.07H leaf功能

在07H叶的0H子叶里(EAX=07H,ECX=0H)返回以下内容。

① EBX[7].SMEP位:指示是否支持SMEP(Supervisor-Mode Execution Prevention)功能,是的话可以对CR4.SMEP控制位进行置位。

② EBX[10].INVPCID位:指示是否支持INVPCID指令。

2.3 CPUID.80000001H leaf功能

在80000001H叶里主要是针对Intel64和AMD64机器,即支持long-mode的机器。

① EDX[29].LM位:指示是否支持Intel64或long-mode。

② EDX[20].XD位:在AMD64中是NX位,指示是否支持Execution Disable功能。是的话可以在PAE模式和IA-32e页转换模式里使用XD位。

③ EDX[26].1G-page位:指示处理器是否支持1G页面。CPUID.80000008H leaf功能 这个叶功能将返回MAXPHYADDR值和最高virtual address值。

① EAX[7:0]:返回MAXPHYADDR值。

② EAX[15:8]:返回最高virtual address值。

3 寄存器的控制位

CR0和CR4有许多控制位被使用在paging机制上。

① CR0.PG:在CR0.PE=1的基础上,置CR0.PG=1开启paging机制。

② CR0.WP:对CR0.WP置位可以启用Write Protect功能,使Supervisor用户也无权对Read-only(只读)页进行修改。

③ CR0.CD与CR0.NW:将影响到各级页转换表结构里的PCD和PWT标志,包括CR3。

④ CR4.PSE:置CR4.PSE=1时,配合PDE.PS标志位在32位paging模式里使用4M页面。

⑤ CR4.PAE:置CR4.PAE=1时,开启PAE paging模式。CR4.PAE控制位将忽略CR4.PSE的作用。

⑥ CR4.PGE:置CR4.PGE=1时,配合PDE.G和PTE.G标志位启用Global page功能,当更新CR3时,TLB里Global page不被刷新。

⑦ CR4.SMEP:置CR4.SMEP=1时,启用SMEP功能,防止Supervisor用户执行用户代码。

⑧ CR4.PCIDE:置CR4.PCIDE=1时,启用process-context identifier功能。

⑨ IA32_EFER.LME:置IA32_EFER.LME=1时,开启long-mode,但需要开启paging机制后才被激活。

⑩ IA32_EFER.LMA:置CR4.PAE=1,且CR4.PG=1时,激活long-mode。

⑪ IA32_EFER.NXE:置IA32_EFER.NXE=1时,在PAE paging模式和IA-32e paging模式里启用Execution Disable功能。

4 页转换表资源

处理器paging机制里使用的各级页转换表,最终是为了查找线性地址映射到物理地址空间上相应的page frame,再由page frame基地址加上page offset值得出最终的物理地址。

在三种paging模式里,根据不同的页面尺寸使用不同的页转换表结构

4.1 32位paging模式中

线性地址是32位宽, 采用一级或两级页转换表, 每个表项大小是4字节宽, CR3使用32位。

① 4K页面下:使用PDT(page directory table,页目录表)和PT(page table,页表)两级表格。

4KB页面线性地址构成: 10(PDT索引, 1024个项) + 10(PT索引, 1024个项) + 12(Page offset, 4KB页)

一个PDT和一个PT大小都是4KB.

② 4M页面下:使用PDT(page directory table)一级表格。

4MB页面线性地址构成: 10(PDT索引, 1024个项) + 22(Page offset, 4MB页)

一个PDT大小是4KB

4.2 PAE paging模式中

线性地址32位宽, 使用两级或三级页转换表, 每个表项8字节宽, CR3还是32位, 但只使用了27位, 拼凑了32位PDPT物理地址。

在PAE paging模式里使用两级或三级页转换表。

① 4K页面下:使用PDPT(page directory pointer table,页目录指针表),PDT和PT。

4KB页面线性地址构成: 2(PDPT索引, 4个项) + 9(PDT索引, 512个项) + 9(PT索引, 512个项) + 12(Page offset, 4KB页)

PDPT大小可以是4x8=32字节, PDT和PT仍然是4KB大小, 512x8.

② 2M页面下:使用PDPT和PDT。

2MB页面线性地址构成: 2(PDPT索引, 4个项) + 9(PDT索引, 512个项) + 21(Page offset, 2MB页)

PDPT大小可以是4x8=32字节, PDT是4KB

4.3 IA-32e paging模式中

线性地址48位宽, 使用两级到四级的页转换表, 每个表项都是8字节宽, CR3是64位宽, 针对是否支持PCIDE功能, CR3使用不一样。

① 4K页面下:使用PML4T(page map level-4 table,四层映射表),PDPT,PDT和PT。

4KB页面线性地址构成: 9(PML4T索引, 512个项) + 9(PDPT索引, 512个项) + 9(PDT索引, 512个项) + 9(PT索引, 512个项) + 12(Page offset, 4KB页)

每个table(PML4T, PDPT, PDT, PT)大小都是4KB = 512x8

② 2M页面下:使用PML4T,PDPT和PDT。

2MB页面线性地址构成: 9(PML4T索引, 512个项) + 9(PDPT索引, 512个项) + 9(PDT索引, 512个项) + 21(Page offset, 2MB页)

每个table(PML4T, PDPT, PDT)大小都是4KB = 512x8

③ 1G页面下:使用PML4T和PDPT。

1GB页面线性地址构成: 9(PML4T索引, 512个项) + 9(PDPT索引, 512个项) + 30(Page offset, 1GB页)

每个table(PML4T, PDPT, PDT)大小都是4KB = 512x8

每个table里的entry(表项)分别被称为PTE(Page Table Entry)、PDE(Page Directory Table Entry)、PDPE(Page Directory Pointer Table Entry)和PML4E(Page-Map Leve-4 Table Entry)。

你可能感兴趣的:(2. paging机制下使用的资源)