pae扩展内存 linux,浅析linux内核内存管理之PAE

浅析linux内核内存管理之PAE

早期Intel处理器从80386到Pentium使用32位物理地址,理论上,这样可以访问4GB的RAM。然而,大型服务器需要大于4GB的RAM来同时运行数以千计的进程,近几年来这对Intel造成了压力,所以必须扩展32位80x86所支持的RAM容量。

Intel通过在它的处理器上把管脚数从32增加到36已经满足了这些需求,可以寻址64GB。同时引入了一种新的分页机制PAE(Physical Address Extension,物理地址扩展)把32位线性地址转换为36位物理地址才能使用所增加的物理内存,通过设置CR4的第5位来开启对PAE的支持。引入PAE就是为了访问大于4GB的RAM,线性地址仍然是32位,而物理地址是36位。

64GB的RAM被分为2^24个页框,页表项的物理地址字段从20位扩展到了24位。PAE表项必须包含12个标志位和24个物理地址位,总数之和为36,页表项大小从32位变为64位。这样原来一个页框有1024个entry,现在有512个entry。开启PAE的80x86 32位使用的是三级页表,第一级是新引入的PDPT(页目录指针表,相当于PGD了),第二级是PMD,第三级是PTE。PDPT只有4个entry,每个对应1GB RAM,每个entry 是64位。CR3中有27位作为PDPT的起始地址。

在开启PAE前,CR3中用20来存储页目录的起始地址;开启PAE后,用27位来存储page directory pointer table的起始地址。

97031883_1.gif

下边分两种情况来讨论,一个是PS=0,一个是PS=1:

当CR4的第5位被置位(开启PAE),第4位被置位(开启PSE)

97031883_2.gif

线性地址31~30,用来指向一个PDPT的entry

线性地址29~21,用来指向一个pmd的entry

线性地址20~0,为4MB大页中的offset

当CR4的第5位被置位(开启PAE),第4位被清除(关闭PSE)

97031883_3.gif

线性地址31~30,用来指向一个PDPT的entry

线性地址29~21,用来指向一个pmd的entry

线性地址20~12,用来指向一个pte

线性地址11~0,为4KB页中的offset

如何访问64GB?

从上边的三级分页可以看到2^2*2^9*2^9*2^11=4GB,仍然访问的是4GB。访问64GB方法如下:

修改CR3中的值使其指向不同的PDPT,这样就指向不同的4GB

修改PDP entry中的值,使其指向不同的PMD表,这样可以指向不同的1GB

但是实际上是不能访问这么大的内存的,实际可用的内存被限制在16GB,因为如果有64GB,那么每个struct page结构需要32字节,总共512MB,这样ZONE_NORMAL的内核地址空间就被大量占用,这样是不允许的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值