1. 程式人生 > >操作系統中涉及到現場保留和恢復的點

操作系統中涉及到現場保留和恢復的點

str 通過 壓棧 當前 調用 描述符 們的 內核 應用

異常和中斷

  • 保留現場:
    • 通過push指令將寄存器中的值都壓入到棧中
  • 恢復現場:
    • 通過pop指令將棧中的值賦值給寄存器中

進程間切換

  • 保留現場:
    • 通過創建並初始化一個結構體(struct pt_regs該結構體中的屬性就是用來保存各個寄存器中的數據的), 將該結構體中的所有數據直接memcpy到棧中, 提高了效率
  • 恢復現場:
    • 也是通過pop指令將棧中的數據重新還原到各個寄存器中

在應用層的代碼通過系統調用訪問內核空間

  • CPU在執行應用層的代碼的時候, 遇到了系統調用, 那麽就需要切換棧空間到內核的棧空間, 這裏涉及到了特權的轉換, 具體的執行流程如下
    • 當前esp, ss, eip等寄存器的值被保存到了CPU內部
    • CPU通過讀取TSS結構, 從中提取出內核棧空間的棧段選擇子和棧基地址, 將這個值更新到esp, ss中, 這個時候就是在了內核空間了, 因為我們的已經指向了內核的棧空間了
    • 將第一步保存的應用層代碼的esp, ss等值壓棧
    • 將調用者(應用層)的棧空間的參數復制到內核的棧中
    • 通過門描述符獲取系統調用的入口地址, 將其更新到eip, cs寄存器中
    • CPU在內核空間執行程序
    • 執行完畢, 從系統調用中返回, 進行現場的恢復

操作系統中涉及到現場保留和恢復的點