物理地址:
linear address ----> paging ----> physical address |
SO, 这里主要理解 paging 的来龙去脉。
4.1、地址组成
physical address = page's base address + offset
这个页基址经过几级数据结构(page-translation tables)寻址得,offset 在 linear address 中提供。
4.2、page-translation tables 的基址CR3 寄存器中存放最高一层 page-translation tables 基址,在 x86 下是 32 位,x64 下被扩展为 64 位
4.2.1、 x86 下的 CR3 结构
(1) 非 PAE 模式下
CR3[31,12]: 对应着 page tables 的基址
CR3[4]:是 PCD(page cache disable)标志位。
CR3[3]:是 PWT(page writethrough)标志位。
其余保留,这意味着高最级的 page tables 是 4Kbyte 边界对齐,bit11 ~ bit0 为 0。
(2) PAE 模式下
CR3[31,5]: 对应着 page tables 的基址
CR3[4]:是 PCD(page cache disable)标志位。
CR3[3]:是 PWT(page writethrough)标志位。
其余保留,这意味着高最级的 page tables 是 32byte 边界对齐,bit4 ~ bit0 为 0。
4.2.2、x64 下的 CR3 结构
(1) Intel 的实现
CR3[39,12]: 对应着 page tables 的基址
CR3[4]:是 PCD(page cache disable)标志位。
CR3[3]:是 PWT(page writethrough)标志位。
其余保留,这意味着高最级的 page tables 是 4Kbyte 边界对齐,bit11 ~ bit0 为 0。
Intel 实现支持最高 40 位物理地址。
(2) AMD 实现
CR3[52,12]: 对应着 page tables 的基址
CR3[4]:是 PCD(page cache disable)标志位。
CR3[3]:是 PWT(page writethrough)标志位。
其余保留,这意味着高最级的 page tables 是 4Kbyte 边界对齐,bit11 ~ bit0 为 0。
AMD 实现最高支持 52 位物理地址。
4.3、 page-translation tables 数据结构AMD 实现 4 种尺寸的页:4K page、2M page、4M page 以及 1G page
Intel 不支持 1G page,实现 4K page、2M page 以及 4M page
每种大小的页面决定了不同的 page-tables 数据结构
4.3.1、 先说说 4K page4K 大小的页面,意味着:页地址是 4Kbyte 边界对齐,也即是 bit11 ~ bit0 为 0。
所以:linear address 中的低 12 位是 page 内 offset 值,整个地址空间中可以有 1M (1024*1024) 个 pages。
(1) 在 x86 下 32 位的 linear address 进行 paging 时,其 page-translation tables 经过 2 级寻址,分别寻址 page tabls 以及 pages。
2 个数据结构:PDT(page-directory tables)、PT(page tables)
所以,linear address 分成 3 个部分:
Bit31 ~ Bit22:共10 位,用来寻址 PT (page tables),即:在 PDT 中索引 PDE 值。
Bit21 ~ Bit12:共10 位,用来寻址真正页面 pages,即:在 PT 中索引 PTE 值。
Bit11 ~ Bit0 :共12 位,代表 4Kbyte 页面空间的 offset 值,即:在 page 中具体定位。
(2) 在 x64 下 64 位的 linear address 进行 paging 时,其 page-translation tables 经过 3 级寻址,分别寻址 page-directory pointer tables、page-directory tables、page tables 以及 pages。
4 个数据结构为:PML4T(page map level4 tables)、PDPT(page directory pointer tables)、PDT(page directory tables)以及 PT(page tables)。
实际上,64 位的 linear address 只实现了 48 位 linear address,高 16 位 linear address 是符号扩展位。
所以,48 位的 linear address 分成 5 个部分:
bit47 ~ bit39:共 9 位,用来寻址 PDPT(page directory pointer tables),即在 PML4T 中索引 PML4E 值。
bit38 ~ bit30:共 9 位,用来寻址 PDT(page directory tables),即在 PDPT 中索引 PDPE 值。
bit29 ~ bit21:共 9 位,用来寻址 PT (page tables),即在 PDT 中索引 PDE 值。
bit20 ~ bit12:共 9 位,用来寻址 page,即在 PT 中索引 PTE 值。
bit11 ~ bit0:共 12 位,代表在 4Kbyte 页面空间中 offset 值,即:在 page 中具体定位。
4.3.2、 大页面:4M page 在 CR4.PSE 置为 1 时,将开启 4M page,但在具体由相应的 page-translation tables 的属性来决定哪个是 4M pages,哪个是 4K pages。
4M page 意味着,线性地址的低 22 位是 page offset 值,32 位地址空间中有 1K (1024)个 pages。
那么:32 位 linear address 将为分成两个部分:
bit31 ~ bit22:用来直接寻址 PT(page tables),在 PDT 中索引 PDE
bit21 ~ bit0:代表在 4M 页面空间中的 offset 值,即在 page 中具体定位。
术语:LA = linear addess
PA = physcial address
PML4T = pages map level4 tables
PML4E = PML4T's entry
PDPT = pages directory pointer tables
PDPE = PDPT's entry
PDT = pages directory tables
PDE = PDT's entry
PT = pages tables
PTE = PT's entry
PAE = physcial address extension
PSE = page size extension
一、x86 下的 paging1、 CR4.PAE = 0 && CR4.PSE = 0其 paging 过程如下:
PDT(CR3)---> PDE(PT)---> PTE(pages)---> physical address如以下 linear address 0x81b3a6de:
1000000110 1100111010 011011011110 = 0x81b3a6de (linear address)
-----------
(PDE index) (PTE index) (offset)
2、 CR4.PAE = 0 && CR4.PSE = 1其 paging 过程如下:
PDT(CR3)---> PDE(PT)---------------> PTE(pages)---> PA(page + offset)
| PDE.PS = 0 (4K pages)
|
+--------------------------------------> PA(page + offset)
PDE.PS = 1(4M pages)线性地址会被分割 4 个组成部分
1000000110 1100111010 011011011110 = 0x81b3a6de (linear address)
------------
PDE index (PTE index) (offset)
|
|
|
+-----------> PDE.PS = 1 时,跳过 PT,直接获取 page
PDE.PS = 0 时,接下来的10位,用来在 PT 中索引 PTE。
这里情况稍有些复杂 PDE.PS 是大小页的开关(4M page / 4K pages)
(1) 4M page:有 22 位是 offset,高 10 是 PDE index (即:4M 的 offset 空间)
(2) 4K page:有 12 位是 offset(即:4K 的 offset 空间)
3、 CR4.PAE = 1 (CR4.PSE 忽略)PDPT(CR3)---> PDPE(PDT)---> PDE(PT)-------> PTE(pages)------> PA(page + offset)
| PDE.PS = 0(4K pages)
|
+---------------------------------------> PA(page + offset)
PDE.PS = 1(2M pages)10 000001101 100111010 011011011110 = 0x81b3a6de (linear address)
-- (PDE index) (PTE index) (offset)
| |
| |
| +---------> PDE.PS = 1 时:跳过 PT,直接获取 page
| PDE.PS = 0 时:接下来 9 位,用来在 PT 中索引 PTE
PDPE index
在开启 PAE 时,情况更复杂一些 PDE.PS 这个开关用来选择(2M page / 4K page)
(1) 2M page: 有 21 位的 offset(即:2M 空间的 offset )
(2) 4K page: 有 12 位的 offset (即:4K 空间的 offset)
二、 x64 下的 paging(PAE = 1)PML4T(CR3)
|
+---> PML4E(PDPT)---> PDPE(PDT)---> PDE(PT)-------> PTE(pages)------> PA(page + offset)
| | PDE.PS = 0 (4k pages)
| |
| +------------------------------------> PA
| PDE.PS = 1 (2M pages)
|
+------------------------------------------------------> PA
PDPE.PS = 1 (1G pages)x64 下的 paging 是更复杂的。在 AMD 实现 1G page 时达到最复杂状态
线性地址 0xfffff80002bc7c36 如下:
11111111 11111111 111110000 000000000 000010101 111000111 1100 00110110
------------------- (PML4 index) (PDPE index) (PDE index) (PTE index) ( offset )
(未实现)
| |
| |
| +---------> PDE.PS 进一步决定 4K / 2M page
|
|
+--------> PDPE.PS = 1 开启 1G 页,直接获取 page
PDPE.PS = 0 由 PDE.PS 进一步决定 4K / 2M page
x64 只实现了 48 位的虚拟地址,因此高 16 位是符号扩展。但是:这样子在以后也很容易进行扩展。
实现全 64 位的虚拟地址是很容易的。
AMD 的处理器上可以有 3 种大小的 page 共存:4K page / 2M page / 1G page
Intel 的处理器上未实现 1G page,只能有 4K page / 2M page
每一项 index 是 9 位
1G page: 有 30 位 offset 值,也就是 page 内有 1G 的 offset 空间
理解了 4K / 2M / 4M / 1G page 的含义,paging 也就不难了