操作系統中涉及到現場保留和恢復的點
阿新 • • 發佈:2018-10-20
str 通過 壓棧 當前 調用 描述符 們的 內核 應用
異常和中斷
- 保留現場:
- 通過push指令將寄存器中的值都壓入到棧中
- 恢復現場:
- 通過pop指令將棧中的值賦值給寄存器中
進程間切換
- 保留現場:
- 通過創建並初始化一個結構體(struct pt_regs該結構體中的屬性就是用來保存各個寄存器中的數據的), 將該結構體中的所有數據直接memcpy到棧中, 提高了效率
- 恢復現場:
- 也是通過pop指令將棧中的數據重新還原到各個寄存器中
在應用層的代碼通過系統調用訪問內核空間
- CPU在執行應用層的代碼的時候, 遇到了系統調用, 那麽就需要切換棧空間到內核的棧空間, 這裏涉及到了特權的轉換, 具體的執行流程如下
- 當前esp, ss, eip等寄存器的值被保存到了CPU內部
- CPU通過讀取TSS結構, 從中提取出內核棧空間的棧段選擇子和棧基地址, 將這個值更新到esp, ss中, 這個時候就是在了內核空間了, 因為我們的已經指向了內核的棧空間了
- 將第一步保存的應用層代碼的esp, ss等值壓棧
- 將調用者(應用層)的棧空間的參數復制到內核的棧中
- 通過門描述符獲取系統調用的入口地址, 將其更新到eip, cs寄存器中
- CPU在內核空間執行程序
- 執行完畢, 從系統調用中返回, 進行現場的恢復
操作系統中涉及到現場保留和恢復的點