[转载]理解 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 也就不难了

时间: 2025-01-17 20:58:45

[转载]理解 paging的相关文章

[转载] 理解RESTful架构

原文: http://www.ruanyifeng.com/blog/2011/09/restful.html 理解RESTful架构 作者: 阮一峰 日期: 2011年9月12日 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高并发等特点. 网站开发,完全可以采用软件开发的模式.但是传统上,软件和网络是两个不同的领域,很少有交集:软件开发主要针对单机环境

转载--理解数字信号处理的三把钥匙

原址 在数字信号处理大厦中,有许许多多的小房间,有的门上写着"DFT",有的门上写着"滤波",有的门上写着"卷积",有的门上写着"相关",等等.每一个房间都藏着知识的秘密,每一个房间都要用属于自己的钥匙才能打开.但就整体上来说,理解数字信号处理有三把"万能"的钥匙:时域与频域的相互切换.向量和MATLAB软件.充分应用这三把钥匙,能为深入理解数字信号处理提供有力的帮助. 1.时域与频域的相互切换 深入理解数

[转载] 理解linux进程

原文: http://tobegit3hub1.gitbooks.io/understanding-linux-processes/content/index.html linux进程在我们上操作系统课程的时候老师就讲过了, 但是当时觉得是那么抽象不可理解. 随着对计算机技术理解的不断深入, 对进程的理解也越来越多了. 不过技术总是飞速的发展着, 特别是cgroup和namespace技术, 对linux进程的理解又多了一分神秘. 本文以非常简短的方式介绍了linux进程的方方面面, 虽然都没有

转载 理解objective c的Runtime

注:本文是对 Colin Wheeler 的 Understanding the Objective-C Runtime 的翻译. 初学 Objective-C(以下简称ObjC) 的人很容易忽略一个 ObjC 特性 —— ObjC Runtime.这是因为这门语言很容易上手,几个小时就能学会怎么使用,所以程序员们往往会把时间都花在了解 Cocoa 框架以及调整自己的程序的表现上.然而 Runtime 应该是每一个 ObjC 都应该要了解的东西,至少要理解编译器会把 [target doMeth

[转载] 理解 rto

原文: http://mp.weixin.qq.com/s?__biz=MzAxNjM3MDkyOQ==&mid=204656491&idx=1&sn=5046aa16eee05e84d554caf36dafcf42#rd http://mp.weixin.qq.com/s?__biz=MzAxNjM3MDkyOQ==&mid=204729635&idx=1&sn=81db3ca7ce0361a1f258de24d836bb6a#rd http://mp.w

(转载)理解Java中的引用传递和值传递

关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习和分析一下,着急可以先看最后的结论. 1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某

[转载]理解HTML语义化

声明: 本文转载于:freeyiyi1993博客. 原文地址:http://www.cnblogs.com/freeyiyi1993/p/3615179.html 1.什么是HTML语义化? <基本上都是围绕着几个主要的标签,像标题(H1~H6).列表(li).强调(strong em)等等> 根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地解析. 2.为什么要语义化? 为了在没有CSS的情况下,页面也能呈现出很好地内

[转载]理解同步异步、阻塞与非阻塞

"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主动等待这个*调用*的结果. 而异步则是相反

[转载] 理解 epoll 的事件触发机制

原文: http://weibo.com/p/1001603862394207076573?sudaref=weibo.com epoll的I/O事件触发方式有两种模式:ET(Edge Triggered)和LT(Level Triggered). 这个触发模式其实是events(事件)的属性,该属性是和POLLIN.POLLOUT等属性并列且混杂使用的,而events有时依附在fd(文件描述符)上的,所以可以说:这个触发模式是events所依附的fd的属性.区分events和fd的原因是ker