友链
在64位操作系统中,虚拟地址宽度为64bits,但是大多数的处理器都不支持64位宽的虚拟地址空间
当前的Intel/AMD处理器只使用48bits来表示虚拟地址空间
所有的虚拟地址必须是Canonical Address
那么什么样的地址才是Canonical Address呢?
Intel开发者手册是这么写的
这里bits 63指的是最高位
0xfffff801c9c11000
的二进制形式为
11111111 11111111 11111000 00000001 11001001 11000001 00010000 00000000
那么最前面这16个1就是bits 63-48
其实是做了一个符号扩充操作
因为一共只用了48bit,那么bits47就是最高有效位了,48-63是没有用的,如果把最高有效位看做符号位,那么48-63就是符号扩充
因为48-63全是1,而最好有效位,也就是bits47也是1
这样的就是Canonical Address
0xffff080000000000
的二进制形式:
11111111 11111111 00001000 00000000 00000000 00000000 00000000 00000000
这里48-63和47不一致,不符合符号扩充的规则,因此不是Canonical Address