查阅过很多的blog或者相关书,都说64位系统的空间足够所以不需要HIGHMEM ZONE,对于这句话一直是一知半解,今天仔细看了下相关的config,理解如下:
高端内存的由来:
在32位系统中总的地址空间是4GB,按照地址划分3G~4G为内核空间,0~3G为用户空间,此时PAGE_OFFSET为0xC0000000.如果物理内存的size为4GB,则后面3GB内核就无法访问,为了满足此要求,在内核1GB空间分出了一定的空间来进行映射。
Linux将内核地址空间划分为三部分ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,以手上某平台2GB RAM,32位系统的手机为例,通过开机的kernel log可以看到系统虚拟内存的映射如下:
[ 0.000000] <0> vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] <0> fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
[ 0.000000] <0> vmalloc : 0xe1000000 - 0xff800000 ( 488 MB)
[ 0.000000] <0> lowmem : 0xc0000000 - 0xe0800000 ( 520 MB)
[ 0.000000] <0> pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
[ 0.000000] <0> modules : 0xbf000000 - 0xbfe00000 ( 14 MB)
[ 0.000000] <0> .text : 0xc0008000 - 0xc1000000 (16352 kB)
[ 0.000000] <0> .init : 0xc1600000 - 0xc1800000 (2048 kB)