canonical-address 地址形式就是:64 位的 linear address(virtual address)中的从 MSB(Most Significant Bit)最高有效位到第 63 位全是 0 或 1 的这种形式。
看下面的地址:
FFFF8010_bc001000:这是符合 canonical-address 的地址,MSB 是 bit47,值为 1。 而 bit63 ~ bit48 全是 1
00007c80_b8102040:这是符合 canonical-address 的地址,MSB 是 bit47,值为 0。 而 bit63 ~ bit48 全是 0
实质上,canonical-address 地址中 bit63 ~ bit48 是符号扩展位。bit47 是 64 位地址中最高能表示的位(MSB)。
1、canonical-address 地址形式产生的前提
当前的 x64 体系中,64 位的 virtual address(linear address)仅实现了 48 位 virtual address,剩下的高 16 位仅仅是作为符号扩展,组成最终的 64 位 virtual address。
高 16 位是符号位加上 48 位真正的 virtual address 组成 64 位 virtual address,这种地址形式就是 x64 体系中的 canonical-address 地址形式。
之所以这样做,是考虑到以后实现 52、56、60 以及真正的 64 位 virtual address 时,这种地址形式(48 位+16 符号位)无需做出任何的改变就可以平滑的兼容(52、56、60 或 64 位 virtual address)。
即:48 位 + 16 符号位这个实现,既可以看成是 52 位 + 12 位符号,也可看成是 56 位 + 8 位符号位,或看成是 60 位 + 4 位符号位,或看成全 64 位 virtual address。这对于软件层面来看完全没有任何影响。
实现的不同只是 processor 才能感受到,processor 在做 virtual address 转到为 physical address 才有影响。
2、非 canonical-address 地址形式检查
processor 会对软件上的非 canonical-address 地址形式进行检查,程序中使用了非 canonical-address 会产生 #GP 异常。
象下面这种情形:
mov rax, qword ptr [0x11223344557788]
--------------------------------------------------------------
这里 [0x1122334455667788] 明显不是 canonical-address 地址,processor 检查到将会产生 #GP 异常。
又如:64 bit 下 processor 不会对 descriptor 的 limit 进行任何检查,但会以 canonical-address 地址检查为代替。若 gate descriptor 中的 offset 值是非 canonical-address 地址,processor 检测到就会产生 #GP 异常。等等诸如之类的检查。
阅读(2357) | 评论(0) | 转发(0) |