找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 17|回复: 2

请教:《x86 编写64位多处理器多线程操作系统》4.9

[复制链接]

10

主题

13

回帖

160

积分

至尊会员

积分
160

至尊会员

发表于 昨天 15:37 | 显示全部楼层 |阅读模式
本帖最后由 jetcan 于 2024-12-20 15:52 编辑

李老师,您好!


     4.9 快速系统调用的进入和返回
     
    为 syscall/sysret 手工切换栈时,必须防止:在栈切换期间产生中断而导致数据被压入旧栈,为此,必须清中断 cli。

    现在假设,没有清中断:
   
syscall 已从用户态进入内核态,没来得及切换栈,当前使用的仍是用户程序 3 特权级的栈,状态为: SS3:RSP3 (x, y, z);
        
        中断发生了,因 syscall_procedure CPL=0,中断处理例程代码段 DPL=0,所以中断不切换栈,仍然使用 SS3:RSP3 (x, y, z);
        中断过程在 IA-32e 模式下,无条件压入旧栈,这时中断使用的栈状态为:SS3:RSP3 (x, y, z, SS3:RSP3, RFLAGS, CS:RIP)

       当中断例程返回到 syscall_procedure,栈被切换回原来状态:SS3:RSP3(x, y, z)。
  
   这时,再手动为 syscall 切换栈;感觉中断对手工切换栈没影响啊?

   不知道我哪里理解的不对?

   请老师解惑,谢谢!

416

主题

315

回帖

3286

积分

管理员

积分
3286
发表于 昨天 16:04 | 显示全部楼层
在任何时候,CPL和栈的DPL必须一致,这是原则。
即使在通过syscall进入内核态之后依然使用RING 3的旧栈而不切换栈,也是可能的。但这不表明你可以不切换栈。
从ring 3进入ring 0之所以要切换栈,只是因为ring 3的栈不安全,万一溢出就影响内核。如果你因为自己的分析是一个完美的闭环,或者是不切换也没有发现出什么问题,说明你并不了解栈切换的根本原因。

10

主题

13

回帖

160

积分

至尊会员

积分
160

至尊会员

 楼主| 发表于 昨天 17:49 | 显示全部楼层
本帖最后由 jetcan 于 2024-12-20 17:52 编辑

谢谢老师透彻细致的讲解!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2024-12-21 23:52 , Processed in 0.221469 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表