日期:2014-05-16 浏览次数:21093 次
地址映射
64位地址采用4层地址映射,如下图:
pgd、pud、pmd、pte各占了9位,加上12位的页内index,共用了48位。即可管理的地址空间为2^48=256T。而在32位地址模式时,该值仅为2^32=4G。
另外64位地址时支持的物理内存最大为64T,见e820.c中MAX_ARCH_PFN的定义:
# define MAX_ARCH_PFN MAXMEM>>PAGE_SHIFT
其中MAXMEM为2^46,PAGE_SHIFT为12。
而在32位地址时最大支持的物理内存为64G(开启PAE选项)。
地址空间
32位与64位具体地址分布如下图:
64位地址时将0x0000,0000,0000,0000 – 0x0000,7fff,ffff,f000这128T地址用于用户空间。参见定义:
#define TASK_SIZE_MAX ((1UL << 47) - PAGE_SIZE),注意这里还减去了一个页面的大小做为保护。
而0xffff,8000,0000,0000以上为系统空间地址。注意:该地址前4个都是f,这是因为目前实际上只用了64位地址中的48位(高16位是没有用的),而从地址0x0000,7fff,ffff,ffff到0xffff,8000,0000,0000中间是一个巨大的空洞,是为以后的扩展预留的。
而真正的系统空间的起始地址,是从0xffff,8800,0000,0000开始的,参见:
#define __PAGE_OFFSET _AC(0xffff,8800,0000,0000, UL)
而32位地址时系统空间的起始地址为0xC000,0000。
另外0xffff,8800,0000,0000 – 0xffff,c7ff,ffff,ffff这64T直接和物理内存进行映射,0xffff,c900,0000,0000 – 0xffff,e8ff,ffff,ffff这32T<