canonical-address 地址形式

转自:点击打开链接


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 异常。等等诸如之类的检查。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值