stack segment 的访问

转自:点击打开链接

基于 stack 的访问都将引发 stack 访问控制检查,对于 stack 的访问控制比一般的 data segment 访问检查要严格。



用简单的式子表达为:

if (RPL == DPL && CPL = DPL) {
  /* 通过检查,允许访问,加载 descriptor 进入 SS */

} else {
  /* 拒绝访问,引发 #GP 异常 */
  goto do_#GP
}


  访问 stack 仅限于同级访问,RPL、CPL 以及 DPL 三者必须相等。即使 0 级代码也不能访问 3 级的 stack。

So:
   TSS segment 中为每个权限级为了相应的 stack pointer,就是基于这个原因,TSS 中设了 0 ~ 2 级的 stack pointer,但不包括 3 级的 stack pointer,3 级的 stack pointer 要么存放在 SS & RSP 中,要么存放在 0 ~ 2 级的 stack 中。
  若发生代码从 3 级切换到 0 级时,切换 stack 时,3 级的 stack pointer 被切换出来,存放在 0 级的 stack 中,而 0 级的 stack pointer 被加到 SS & RSP 中。0 级代码返回 3 级代码时,3 级 stack pointer 被重新加载到 SS & RSP 中。


通过检查的后续处理:
  和 DS 一样,stack segment descriptor 会被加载到 SS 寄存器中,SS.RPL 就代表当前运行 stack 的权限级别。当发生 stack 切换时,SS.RPL 会被更新为新的权限级别。
  



7.1.2.1、 x64 下的 long mode 的 stack segment 访问
  
  long mode 的兼容模式与 x86 原有的模式一致。 64 bit 模式下的 stack segment 访问与前述的 data segment 访问一样,processor 不会对 stack segment 的访问进行权限检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值