stack segment 的访问

理解x64下长模式下栈段访问控制
本文详细解析了x64架构下长模式下栈段访问控制的原理,包括权限检查机制、访问限制以及切换过程。重点讨论了同级访问规则和不同权限级间的访问控制差异。

转自:点击打开链接

基于 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 的访问进行权限检查。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值