页表管理及多级页表

 

页表说需空间大小计算:

1、32 位地址空间、4KB 的页大小、页表的每项大小为 4Byte。

  • 32 位地址空间可寻址2^32 = 4GB
  • 每4KB=3^12为1个物理页,故需要总TLB项为2^32/2^12=2^20
  • 每个TLB项的大小为4B,故总的TLB缓存的大小为2^20*4=2^22=4M

2、64 位地址空间、4KB 的页大小、页表的每项大小为 4B。

 

多级分页:

  • 早期的内存很小,本模型是为了在虚拟内存下让页表也能交换出内存。
  • 引入多级页表的另一个原因就是可以按需分配页表所需的空间。
  • 一级页表的情形,每创建一个进程,为保证页表项的连续,都要为其一次分配 4MB 的页表,尽管其只用到很少的一部分。
  • 多级页表下,每创建一个进程,只要为其一次分配 PGD 所需的空间即可,只要保证 PGD 项之间的连续即可了,下一级则在其需要时再分配。
  • linux 2.6.11 始,内核就支持四级分页模型(PGD, PUD, PMD, PT ).PT 的每项内容就是该页对应的物理地址(页框号)和一些控制位,而 PGD, PUD, PMD的每项内容实际就是下级表的基地址。
  • 对于 32 位运行模式,MIPS Linux 使用两级分页,即页全局目录 (PGD) 和页表 (PT)。PUD, PMD为空。
  • 对于 64 位运行模式,MIPS Linux 使用三级分页,即页全局目录 (PGD) ,页中间目录 (PMD) 和页表。PUD为空。
  • 多级分页模型下,PUD, PMD, PT,其每张表自身的大小等同于一个页大小(64 位 Linux 的PGD 占用两个页),PGD 因为在最上层,则可根据页大小和虚拟地址空间大小灵活地调整容量。

 

32 位运行模式情形2级分页:

对 4KB 的页大小

因为每页PGD 的PT项为4KB/4B= 2^10条(实际4G=2^32/2^12/2^10 = 2^10条),故需要虚拟地址VA[31:22]10位 用来索引 页全局目录PGD项。

1页PGD(2^10条PT项×4byte=4KB)

~ 2^10条PT项×4M=4G

 

因为每页PT 的页表项为4KB/4B= 2^10条,故虚拟地址VA[21:12] 10位用来索引PT项。

1页PT(2^10条表项×4byte=4KB)

~2^10条表项*4kb=4M

 4KB=2^12需要用12位即可索引到一个物理页的实际范围。故用虚拟地址VA[11:0]12位 为页内偏移。它与物理地址是一致的。

1表项(4byte)

~ 4kb

对 16KB 的页大小

每页PGD 最大可包含16KB/4B=2^12项PT(实际4G=2^32/2^14/2^12 = 2^6条) 故需要虚拟地址VA[31:26]6位 用来索引页全局目录PGD项。

1页PGD(2^12项PT×4byte=16KB)

~ 2^12条PT项×64M=256G

(实际可访问大小为2^6条PT项×64M=4G)

 因为每页PT 的页表项为16KB/4B= 2^12条,故虚拟地址VA[25:14] 12位用来索引PT项。

1页PT(2^12条表项×4byte=16KB)

~2^12条表项*16kb=64M

 因16KB=2^14需要用14位即可索引到一个物理页的实际范围。故用虚拟地址VA[13:0]14位 为页内偏移。它与物理地址是一致的。

1表项(4byte)

~ 16kb

 

对于 32 位的内核运行在使用大于 32 位物理地址的硬件上的情形(内核选项 CONFIG_64BIT_PHY_ADDR ,主要是 MIPS32 的实现使用大于 32 位的物理地址 ;还有就是 MIPS64 的实现其使用超过 32 位的物理地址,且其兼容运行于 MIPS32 模式下)为了支持大于 32 位的物理地址,页表的每项占用大小要由4字节扩展到 8 字节,则每张页表可容纳的项数为:PAGE_SIZE/8 。扩展的目的旨在容纳大于 32 位的物理地址,其虚拟地址的位数仍然是 32 ,则所用容纳虚拟地址的项的大小无需变化,即 PGD 的项大小仍然是 4 字节。在此情形下页表的容量减为原来的一半,但 PGD 的容量却是原来的 2 倍,则其依然能映射 4GB 的虚拟地址空间大小。

 

对 4KB 的页大小

因为每页PGD 的PT项最大为4KB/4B= 2^10条,故需要虚拟地址VA[31:21]11位 用来索引 页全局目录PGD项。

1页PGD(2^10条PT项×4byte=4KB)

~ 2^10条PT项×4M=4G

(实际可访问大小为2^11条PT项×2M=4G )

 

因为每页PT 的页表项为4KB/8B= 2^9条,故虚拟地址VA[20:12] 9位用来索引PT项。

1页PT(2^9条表项×4byte=2KB)

~2^9条表项*4kb=2M

 4KB=2^12需要用12位即可索引到一个物理页的实际范围。故用虚拟地址VA[11:0]12位 为页内偏移。它与物理地址是一致的。

1表项(8byte)

~ 4kb

对 16KB 的页大小

每页PGD 最大可包含16KB/4B=2^12项PT,故需要虚拟地址VA[31:25]7位 用来索引页全局目录PGD项。

1页PGD(2^12项PT×4byte=16KB)

~ 2^12条PT项×32M=128G

(实际可访问大小为2^7条PT项×32M=4G )

 因为每页PT 的页表项为16KB/8B= 2^11条,故虚拟地址VA[24:14] 11位用来索引PT项。

1页PT(2^11条表项×4byte=8KB)

~2^11条表项*16kb=32M

 因16KB=2^14需要用14位即可索引到一个物理页的实际范围。故用虚拟地址VA[13:0]14位 为页内偏移。它与物理地址是一致的。

1表项(8byte)

~ 16kb

 

 

 

64位运行模式情形2级分页:

对 4KB 的页大小

因为每页PGD 的PMD项为4KB/8B= 2^9条(实际2^40/2^12/2^9/2^9 = 2^10条),故需要虚拟地址VA[39:30] 10位 用来索引 页全局目录PGD。

1页PGD(2^9项PMD×8byte=4KB)

~ 2^10项项PMD×1G=1T

 因为每页PMD 的页表项PT为4KB/8B= 2^9条,故虚拟地址VA[29:21] 9位用来索引 页表PMD。

1页PMD(2^9项PT×8byte=4KB)

~2^9项PT*2M=1G

 因为每页PT 的页表项为4KB/8B= 2^9条,故虚拟地址VA[20:12] 9位用来索引 页表PT。

1页PT(2^9条表项×8byte=4KB)

~2^9条表项*4kb=2M

 因用12位即可索引到一个物理页的实际范围4KB=2^12。故用虚拟地址VA[11:0]12位 为页内偏移。它与物理地址是一致的。

1表项(8byte)

~ 4kb

对 8KB 的页大小

因为每页PGD 有8KB/8B=2^10项PMD(实际2^43/2^13/2^10/2^10= 2^10条) 故需要虚拟地址VA[42:33]10位 用来索引页全局目录PGD表项。

1页PGD(2^10项PMD×8byte=8KB)

~ 2^10项PMD×8G=8T

 因为每页PMD表 有为8KB/8B= 2^10项PT,故虚拟地址VA[32:23] 10位用来索引PMD表项。

1页PMD(2^10项PT×8byte=8KB)

~2^10项PT*8M=8G

 因为每页PT 的页表项为8KB/8B= 2^10条,故虚拟地址VA[22:13] 10位用来索引PT表项。

1页PT(2^10条表项×8byte=8KB)

~2^10条表项*8kb=8M

 因用13位即可索引到一个物理页的实际范围8KB=2^13。故用虚拟地址VA[12:0]13位 为页内偏移。它与物理地址是一致的。

1表项(8byte)

~ 8kb

对 16KB 的页大小

因为每页PGD 有16KB/8B=2^11项PMD(实际2^47/2^14/2^11/2^11= 2^11条) 故需要虚拟地址VA[46:36]11位 用来索引页全局目录PGD表项。

1页PGD(2^11项PMD×8byte=16KB)

~ 2^11项PMD×64G=128T

 因为每页PMD表 有为16KB/8B= 2^11项PT,故虚拟地址VA[35:25] 11位用来索引PMD表项。

1页PMD(2^11项PT×8byte=16KB)

~2^11项PT*32M=64G

 因为每页PT 的页表项为16KB/8B= 2^11条,故虚拟地址VA[24:14] 11位用来索引PT表项。

1页PT(2^11条表项×8byte=16KB)

~2^11条表项*16kb=32M

 因用14位即可索引到一个物理页的实际范围16KB=2^14。故用虚拟地址VA[13:0]14位 为页内偏移。它与物理地址是一致的。

1表项(8byte)

~ 16kb

 

  • 可以看到,当前 64 位 Linux 的设计,在不同的页大小下,其使用的虚拟地址空间大小是不一样的,即 4KB 时为 40 位;8KB 时为 43 位;16KB 时为 47 位;64KB 时为 55 位。
  • 这也是一个无奈之举,因为内核在编译时就需要确定 PGD 的大小,这时是不能去动态的获取实际实现的虚拟地址长度 (获取 EntryHi 之 VPN2 域的有效位),只能估测稍大点,便于实现吧,尽管可能尾部的 PGD 项根本用不上,浪费一些空间。
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
跨ISA(指令集体系结构)系统级虚拟该机具有重大的研究和实用价值。 例如,几个最近宣布的虚拟智能适用于在x86上运行智能手机应用程序的iOS手机基于PC的PC部署在跨ISA系统级别的虚拟机上机器。 此外,对于移动设备应用程序的开发, 通过更多地模拟Android / ARM环境强大的x86-64平台,应用程序开发和调试变得更加方便和高效。 然而, 虚拟化层通常会产生高性能开销。 关键开销来自内存虚拟化访客虚拟地址(GVA)必须经过多级地址转换成为主机物理地址(HPA)。 嵌入式影子页表(ESPT)方法已建议有效减少此地址转换成本。 ESPT直接将GVA映射到HPA,从而避免了冗长的访客虚拟到访客物理,访客物理到主机虚拟主机和虚拟主机来托管物理地址转换。 但是,原始的ESPT工作有一些缺点。 例如,其实现依赖于可加载的内核模块(LKM)来管理影子页表。 使用由于以下原因,LKM对于系统虚拟机而言不太理想可移植性,安全性和可维护性问题。 我们的工作提出了一种不同但更实际的实施方案解决缺点。 而不是依靠使用LKM, 我们的方法采用共享内存映射方案仅使用“ mmap”维护影子页面表(SPT) 系统调用。 此外,这项工作研究了以下方面的支持: SPT用于更详细的多处理。 装置三不同的SPT组织,并评估其实力和上标准和实际Android应用程序的弱点模拟Android / ARM的系统虚拟机x86-64系统上的平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值