操作系統 Lab1(2)
阿新 • • 發佈:2018-10-04
發現 任務 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)