zoukankan      html  css  js  c++  java
  • 操作系统中涉及到现场保留和恢复的点

    异常和中断

    • 保留现场:

      • 通过push指令将寄存器中的值都压入到栈中
    • 恢复现场:

      • 通过pop指令将栈中的值赋值给寄存器中

    进程间切换

    • 保留现场:

      • 通过创建并初始化一个结构体(struct pt_regs该结构体中的属性就是用来保存各个寄存器中的数据的), 将该结构体中的所有数据直接memcpy到栈中, 提高了效率
    • 恢复现场:

      • 也是通过pop指令将栈中的数据重新还原到各个寄存器中

    在应用层的代码通过系统调用访问内核空间

    • CPU在执行应用层的代码的时候, 遇到了系统调用, 那么就需要切换栈空间到内核的栈空间, 这里涉及到了特权的转换, 具体的执行流程如下
      • 当前esp, ss, eip等寄存器的值被保存到了CPU内部
      • CPU通过读取TSS结构, 从中提取出内核栈空间的栈段选择子和栈基地址, 将这个值更新到esp, ss中, 这个时候就是在了内核空间了, 因为我们的已经指向了内核的栈空间了
      • 将第一步保存的应用层代码的esp, ss等值压栈
      • 将调用者(应用层)的栈空间的参数复制到内核的栈中
      • 通过门描述符获取系统调用的入口地址, 将其更新到eip, cs寄存器中
      • CPU在内核空间执行程序
      • 执行完毕, 从系统调用中返回, 进行现场的恢复
  • 相关阅读:
    运输装备(codevs 1669)
    考前复习(codevs 2837)
    2014编程之美初赛第一场
    51系列小型操作系统精髓 简单实现
    数学----有趣的扑克牌《一》
    hadoop编程:分析CSDN注冊邮箱分布情况
    [动态规划]UVA437
    Swift学习笔记四:数组和字典
    [动态规划]UVA10285
    freemarker中的left_pad和right_pad
  • 原文地址:https://www.cnblogs.com/megachen/p/9819222.html
Copyright © 2011-2022 走看看