linux内存pae

http://en.wikipedia.org/wiki/X86-64


物理地址扩展Physical Address Extension),又释实体位置延伸,是x86处理器的一个功能,让中央处理器32位操作系统下存取超过4GB实体内存

PAE为IntelPentium Pro及以上级别的CPU(包括除了总线频率为400MHz的这个版本的奔腾M之外的所有新型号奔腾系列处理器)所支持,其他兼容的处理器,如速龙(Athlon)和AMD的较新型号的CPU也支持PAE。

x86的处理器增加了额外的地址线以选择那些增加了的内存,所以实体内存的大小从32位增加到了36位。最大的实体内存由4GB增加到了64GB。

32位的虚拟地址线性地址)则没有变,所以一般的应用软件可以继续使用地址为32位的指令;如果用平面内存模式的话,这些软件的地址空间也被限制为4GB。操作系统用页表将这4GB的地址空间映射到大小为64GB的实体内存,而这个映射对各个进程一般是不一样的。这样一来,即使不能为单单一个程序所用,那些增加了的物理内存仍然可以发挥作用。

对于需要超过4GB内存的应用软件来说,除了一般的PAE支持,还需要操作系统提供另外的特殊的技术。在Windows上,这种技术叫做Address Windowing Extensions(AWE)。而在类Unix的系统上则有多种技术在使用,例如使用mmap()按需要把一部分文件映射到地址空间;但是,这还没有成为一个标准。




浅析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的起始地址。



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


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




  • 线性地址31~30,用来指向一个PDPT的entry
  • 线性地址29~21,用来指向一个pmd的entry
  • 线性地址20~0,为4MB大页中的offset


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




  • 线性地址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的内核地址空间就被大量占用,这样是不允许的。



在传统的32位的保护模式中,x86处理器使用一种两级的转换方案。在这种方案中,控制暂存器CR3指向一个长4KiB的页目录(page directory);页目录又分为1024个每个4KB的页表(page table);最后页表又分为1024个每个长4KB的

启用PAE(通过设置控制暂存器CR4的第5位来启用)会改变上面的方案。默认情况下,每的大小是4KB的。页表和页目录中的表项都从32位扩为64位(8字节)以使用附加的地址位。但是,页表和页目录的总大小不变。所以,页表和页目录现在都只有512个表项。因为这变成了原来方案的一半,所以另外的一个级加了进来:CR3现在指向的是页目录指针表,即一个包含4个页目录指针的表。

页目录里的表项的第7位叫做PSPage Size)。如果这个位设为1,则页目录的表项不再指向页表,而是指向一个2MB的页。页目录里还有另外一个叫NX位元的标志位。它是第63位,表示No eXecute。因为页表项中最低的12位,要么是这种标识位,要么是和操作系统相关的数据,所以最多可有52位在将来用于在252 字节,即4pebibyte的物理内存中寻址。

现在,x86架构只使用该52位中的36位。对于在长模式long mode)中的x86-64处理器,PAE是必须的;其中使用了52位中的40位或48位[1]

CPU对PAE模式的支持可以通过CPUID标志PAE来识别。


Every x86 and x86_64 CPU has an address translation system that translates virtual addresses into physical addresses.

The virtual addresses are the ones programs actually use (they are the numerical values of pointer variables in the program).

The physical addresses are the ones the CPU sends to the memory controller to generate the signals needed to select specific memory locations.

Each process has its own translation tables, so a pointer in one process with identical value to a pointer in another process doesn't normally point to the same physical memory.

The older x86 architecture has a translation design that translates a 32 bit virtual address to a 32 bit physical address.

Newer x86 architecture also supports a translation (called PAE) that translates 32 bit virtual to 36 bit physical.

The x86_64 architecture has 48 bit virtual addresses. Pointers take 64 bits, but the top 17 bits of any 64 bit pointer are required to be identical (all 17 zeros or all 17 ones) so 16 of those 17 bits are redundant.

The x86_64 address translation takes in 48 bit virtual addresses on all models. But the number of physical addresses generated varies by model of CPU chip.

The architecture has an upper limit on the number of physical address bits. I think that is 52, but I'm not sure I remember correctly. But since no one will be using that much physical ram before current CPU models are obsolete, CPU chips don't actually support that much. They support various numbers of physical address bits from 36 up. 40, which you have, is pretty typical.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值