linux虚拟内存用户/内核空间在x86_64中拆分

时间:2014-09-07 02:53:18

标签: linux-kernel kernel x86-64 virtual-memory

/proc/cpuinfo我们可以看到,目前Linux只使用48位虚拟地址大小。根据{{​​3}},内核虚拟地址从ffff800000000000 - ffff80ffffffffff(= 40位)保护孔开始。怎么理解?我看到有一行读hole caused by [48:63] sign extension。这是否意味着内核只会在遇到虚拟地址时解释低48位并忽略高16位?

1 个答案:

答案 0 :(得分:4)

符号扩展是由于x86-64仅使用低48位来寻址内存。作为防止程序员滥用16个高位的预防措施,第47位是符号扩展的。因此,如果位47为0,则所有位[48:63]也将为0,如果位47为1,则所有位[48:63]将为1.具有此位的地址形式被称为"规范"。如果您尝试使用非规范地址(即位[48:63]!=位47),则硬件将引发一般保护错误。

实际上,内核的内存是17个高位为1的高地址,用户空间内存为低内存,其中高位为0。