1. 程式人生 > >操作系統 Lab1(2)

操作系統 Lab1(2)

發現 任務 frame 由於 dispatch 空間 是把 沒有 而已

中斷很久,一看發現又多了一些內容。
打算完成了

Lab1 challenge 1

中斷像量表設置的時候我們需要設置一個用於系統調用的 trap門
也就是
利用中斷切換特權級
To kernel
調用 Tokernel 的時候由於由特權及的轉換,所以這裏會在 Tss 中取出當前函數的內核棧 並且做相應的切換

依次壓棧 eflags cs eip err trapno ds es sf gs tregs 等
將這個 調用棧壓入 棧中

最後執行 push esp 這樣是把 棧頂的指針放在棧頂作為tarp 的參數 tf 傳入

在dispatch 中 增加一個另外的空間將修改後的 trapframe 填入

將新的 指針入棧

這樣 Pop 的時候 也就返回的時候會使用新的 esp 棧作為返回
iret 的時候 會客而已進行正確的執行了
因為壓棧的時候壓棧了 esp 和 ss ,但是出棧的時候不需要 esp 和 ss 所以返回的棧幀 中沒有 esp 和 ss ??

To User
壓棧的時候壓棧了 調用棧幀 但是不完整
所以在另外一個地方申請一個棧幀 完整設置esp 和 ss 返回

解答:
就硬件來說,執行iret時存在兩種情況,一是棧上保存的CS的權限級別(內核態或用戶態)與當前一致,不考慮ss和esp;二是棧上保存的權限級別與當前不同,需要恢復ss和esp。OS的任務,是利用iret的功能,在修改CS的同時不改動其它寄存器的值。
(所以to kernel 的時候iret 會發現cs 的特權及一致(已經修改過了,從而沒有esp 和 ss))
(to user 同理)

附:lab1_prinit_cur_status
是輸出了當前幾個寄存器的置 cs 段的特權級位也被輸出用於檢查

操作系統 Lab1(2)