从 /proc/cpuinfo
可以看出,目前 Linux 只使用 48 位虚拟地址大小。根据 /Documentation/x86/x86_64/mm.txt ,内核虚拟地址开始于 ffff800000000000 - ffff80ffffffffff(=40 位)保护孔。这怎么理解?我看到有一行读取 hole caused by [48:63] sign extension
。这是否意味着内核在遇到虚拟地址时只会解释低48位而忽略高16位?
最佳答案
符号扩展是由于 x86-64 仅使用低 48 位来寻址内存。为了防止程序员滥用高 16 位,第 47 位是符号扩展的。因此,如果第 47 位为 0,则所有位 [48:63] 也将为 0,如果位 47 为 1,则所有位 [48:63] 将为 1。具有此值的地址形式被称为“规范”。如果您尝试使用非规范地址(即位 [48:63] != 位 47),则硬件将引发一般保护错误。
实际上,内核的内存是那些高17位高位为1的高地址,而用户空间的内存是低位内存,高位为0。
关于linux-kernel - linux 虚拟内存用户/内核空间在 x86_64 中拆分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25706656/