从/proc/cpuinfo
我们可以看到,目前Linux只使用48位虚拟地址大小。根据{{3}},内核虚拟地址从ffff800000000000 - ffff80ffffffffff(= 40位)保护孔开始。怎么理解?我看到有一行读hole caused by [48:63] sign extension
。这是否意味着内核只会在遇到虚拟地址时解释低48位并忽略高16位?
答案 0 :(得分:4)
符号扩展是由于x86-64仅使用低48位来寻址内存。作为防止程序员滥用16个高位的预防措施,第47位是符号扩展的。因此,如果位47为0,则所有位[48:63]也将为0,如果位47为1,则所有位[48:63]将为1.具有此位的地址形式被称为"规范"。如果您尝试使用非规范地址(即位[48:63]!=位47),则硬件将引发一般保护错误。
实际上,内核的内存是17个高位为1的高地址,用户空间内存为低内存,其中高位为0。