栈的分配与管理

       

        硬件切换栈的情况有

1、用户态发生中断,从TSS中的SS0:esp0取出

2 、中断返回用户态,执行iret指令,从当前栈中弹出 SS:esp

3、执行sysenter 指令, 从MSR寄存器中取出 IA32_SYSENTER_SS、IA32_SYSENTER_ESP

4、执行sysexit指令,从ecx中取出

        软件主动切换栈的情况有

1、用户态调用FastSystemCall函数 进入系统态sysenter_entry函数, 执行sysenter 指令, 

2、内核态执行sysenter_entry完毕后退回用户态,   执行sysexit指令

3、系统态回调函数user_mode_callback 进入用户态UserModeCallback ,执行sysexit指令

4、用户态接收函数UserModeCallback 执行完后返回系统sysenter_entry函数,执行sysenter 指令

5、软中断,

        综合以上情况,可按以下方式分配栈:

        1、在TSS中保存一个系统态的栈,该栈的数据只在中断单一执行过程中临时使用,每次由用户态进入中断时,esp都指向栈底。执行完后有需要的数据需另行保存;

        2、系统线程只有一个状态,所以仅有一个内核栈。在系统内存空间中(高2G线性空间中),无论是中断还是正常执行,该空间都是平坦的;

        3、 用户线程有两个状态,需要两个栈,一个是内核栈,由创建线程的程序创建(高2G),主要用于线、进程初始化和sysenter 指令,另一个是用户栈,由线程初始化程序设置(位于低2G线性空间中)。

sysenter执行过程(运行在3层)

 1. 从IA32_SYSENTER_CS从取出段选择子加载到CS中。

2. 从IA32_SYSENTER_EIP取出指令指针放到EIP中

3. 将IA32_SYSENTER_CS的值加上8,将其结果加载到SS中。

4. 从IA32_SYSENTER_ESP取出堆栈指针放到ESP寄存器中

5. 切换到0层。

6. 若EFLAGS中VM标志已被置,则清除VM标志。

7. 开始执行选择的系统过程。

sysexit 执行过程(运行在0层)

   1.将IA32_SYSENTER_CS的值加上0x10+3,将其结果加载CS中。

    2.将IA32_SYSENTER_CS的值加上0x18+3,将其结果加载到SS中。

    3.从edx 取出指令指针放到EIP中

    4.从ecx取出堆栈指针放到ESP寄存器中

    5.切换到3层

中断

根据中断向量指向描述符中的特权级,决定中断特权级。

原程序运行在用户态,中断时处理器就要到TSS处找到0级的ss和esp,然后切换堆栈,然后处理器把被中断进程的ss,esp,EFLAGS,CS,EIP,压栈,如果有错误码的话,错误码将最后被压栈(iretd指令并不会自动弹出错误码。。。)

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麻雀123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值