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

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

[复制链接]

10

主题

13

回帖

162

积分

至尊会员

积分
162

至尊会员

发表于 昨天 21:17 | 显示全部楼层 |阅读模式
本帖最后由 jetcan 于 2024-12-21 23:22 编辑

老师,您好

        书中 4.10.2,在单处理环境下,外壳任务与普通用户任务切换
        
        昨天您指教我在栈操作方面基础差,所以特别留意栈操作。
        
        当前任务是外壳任务 (旧任务),就绪任务是用户任务 (新任务,准备第 1 次运行)
   
        开始认为:新任务模拟构造 iretq 时,压栈 SS:RSP, RFALGS, CS:RIP,压入外壳任务的 0 特权级栈;然后弹栈,控制转移到新用户任务的入口点。
   
        但,后来在 rtm_interrupt_handle 打印测试,发现却并非这样:

                (1) 在备份旧任务到 PCB 阶段,打印 rsp 的值:0xFFFF 8000 0021 0208 (外壳任务的虚拟地址高端,0 特权级栈指针)

                (2) 在新任务恢复状态阶段,构造 iretq 压入 PCB 的 RSP,马上打印 rsp (还未调用模拟的 ireq):0x0000 0000 0000 FFF8 (用户任务的虚拟地址低端,3 特权级栈指针)
                     原因:新任务第 1 次运行,直接从 PCB:120 先恢复了 3 特权级的栈指针 RSP,导致在内核态使用 3 特权级栈
        
       疑惑:用户任务 (新任务),在 rtm_interrupt_handle 中,处于内核态,不应该使用 0 特权级栈吗
               
               采用以下 2 个方案可以吗?
                                 
               (1) 新任务恢复时,从 PCB:32 取出 RSP0 恢复 RSP,然后再压栈 PCB:120 - 3 特权级的用户固有的栈

               (2) 或借助外壳任务 0 特权级的栈,构造 iretq 时,将 PCB:120 - 3 特权级 RSP,压入外壳任务的 0 特权级栈中;执行 iretq 后,出栈恢复了用户任务 3 特权级的栈,同时外壳任务 0 特权级栈保持了栈平衡。

     恢复新任务环境时:直接恢复 3 特权级指针,或恢复 0 特权级指针,不恢复栈指针 -> 直接压栈 3 特权级 SS:RSP到外壳任务 0 特权级栈中;这 3 种哪种更符合规范?
            
        烦请老师抽时间答疑,谢谢!



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 02:51 , Processed in 0.237973 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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