首页 > 代码库 > [转载]理解 paging

[转载]理解 paging

物理地址:

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 page

4K 大小的页面,意味着:页地址是 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 下的 paging



1、   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 也就不难了

[转载]理解 paging