什么是highmem?
Linux内存管理
highmem的出现与Linux的内存管理相关。众所周知,linux内核一般将处理器的虚拟地址空间分为两个部分。底部较大的部分用于用户进程,而顶部的较小部分用于内核。这个划分的比例通常是1:3(在编译内核时可以通过特殊的配置选项修改这个比例)。所以在一个32位处理器上,用于内核的虚拟地址空间是1GiB。而Linux内核在管理物理内存时,会将所有的物理内存都映射到内核的地址空间中使用。访问内存时,如果访址所用的虚拟地址与内核区域的起始地址之间的偏移量不超过可用物理内存的长度,那么该虚拟地址会自动关联到对应的物理地址。在可用物理内存较小的时候,这是没有问题的。但是,一个系统的理论寻址空间肯定是内核地址空间大的,在需要访问更多的物理内存时,就必须要借助highmem的机制了。
highmem
在一个32位系统上,虚拟地址空间是4GiB,内核地址空间则是高1GiB,所以按照上面的描述,可以将1GiB的物理内存直接1:1映射到内核虚拟地址上。但是这是不可行的,因为内核虚拟地址空间不可能全部用来作为物理内存的寻址,内核需要保留一部分的虚拟地址用于其他的用途(例如映射寄存器的地址等)。而且这样的映射最多也只能映射1GiB的物理地址,无法处理更大的物理内存。所以在实际应用中,只有896MiB的物理内存会直接映射到内核虚拟地址(也就是上面说的,物理地址和虚拟地址之间只存在一个偏移,偏移量是内核空间的起始地址,32位系统中是0xC0000000),剩余的128MiB用于映射额外的物理地址,而这128MiB的地址空间则称为highmem。
总结
highmem是在物理内存大于某个值时,内核用于管理更大的物理内存的寻址机制。所以对于64位系统来说,目前还用不上highmem的机制,因为物理内存短时间还无法达到需要64位系统也需要借助highmem才能完全寻址的大小(谁能猜到呢,几十年前也是这么说的)。