注:
PSE(Page Size Extension) 使得用户可以使用4M的页表。
PAE (Physical Address Extension)使得32位的系统就能够使用接近64GB的内存的一种技术。
如果PAE和PSE同时使用,则只能使用2M的页表。
x86_64默认使用PAE的扩展—— long mode。
通过上面两个图可知:
是否使用分页是通过CR0寄存器的PG表示来控制的,如果只使用传统的分段模式,则将CR0.PG置为0, 如果启用分页则需要将PG设置为1。使用page的大小则是由IA32_EFER寄存器LME标志以及CR4寄存器的PAE标志和PSE标志控制的, 其中IA32_EFER.LME标志控制是否是否启用IA-32e模式,而CR4.PAE标志为控制是否启用PAE, CR4.PSE标志控制是否启用PSE。但是并不是这三者的任意组合都是存在的,现实中存在的情况为以下几种:
| page size | paging mode | CR0.PG | IA32_EFER.LME | CR4.PAE | CR4.PSE |
|---|---|---|---|---|---|
| 4M | PSE | 1 | 0 | 0 | 1 |
| 4k | PAE | 1 | 0 | 1 | 0 |
| 2M | PAE+PSE | 1 | 0 | 1 | 1 |
| 2M | IA-32e | 1 | 1 | 1 | 1 |
| 4k | normal 32/64 | 1 | 0 | 0 | 0 |
#define PMD_SHIFT 21
...
#define PMD_SIZE (1UL <<PMD_SHIFT)
可知使用long mode的page的大小为:
1 << 21 = 2097152
这个移位运算的结果,可询问wolframalpha大神: http://www.wolframalpha.com/input/?i=1%3C%3C21
需要注意的是page table的大小用户无法自定义,在Linux中即使修改这个宏定义,重新编译内核,也无法修改page的大小。
| Architecture | Page Size | Huge Page Size | Large Page Size |
|---|---|---|---|
| i386 | 4 KB | 4M (2M in PAE mode) | 1 GB |
| IA-64 | 4 KB | 4K, 8K, 64K, 256K, 1M, 4M, 16M, 256M | – |
| ppc64 | 4 KB | – | 16M |
| sparc | 8 KB | – | 8K, 64K, 4M, 256M, 2G |