Jef*_* Li 3 kernel x86-64 virtual-memory linux-kernel
从/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。
归档时间: |
|
查看次数: |
1690 次 |
最近记录: |