- 準備 GDT(在 16 bit mode)
- lgdt
- open Address line 20
- set cr0 的 PE
- 跳入保護模式(32 bit )
但到了32 bit 的暫存器, 則是用來區隔不同用途的記憶體範圍,還有提供各區段的屬性設定
如權限 stack point 的 size 設定等
從保護模式回到真實模式
- 無法直接從32 bit 的 code segment 跳回16bit
- 所以要先提供 align 32 的16bit程式碼段
- 再從該 code segment 跳至真實模式
- close A20
- 開中斷
- operand 包含 target code segment selector
- operand 指向 target code segment selector 的 call gate descriptor
- operand 指向 target code segment selector 的 TSS
- operand 指向 task gate descriptor,此 descriptor 包含 target code segment selector 的 TSS
- 不用另外維護正在傳送的 message buffer
- 不用保存訊息副本
- 不用維護接收 buffer
- sender 跟 recv-er 都能清楚知道訊息是否送達
- 保存暫存器
- 設定進入 kernel mode flag
- 檢查是不是已經進到 kernel stack
- 如果已經進到 kernel stack 則將第一步保存的暫存器 pop 出來
- 否則要重新載入新的 LDT ,轉移 stack 至即將執行 process 所用的 stack
- 將目前正在執行的process stack保存至TSS最上方
- Floppy Disk 必須是1.44MB freedos才能正常讀取
- 可以使用 qemu-img create -f raw name.img 1440K 取代 bximage的功能
- 啟動 freedos
- 產生出來的 image 要 format 成msdos
qemu-system-i386 -fda ./freedos.img -fdb ./name.img
- 透過LDT設定在ldtr,再跳轉
- 直接設定call gate設定該 segment的權限(只限低至高)
- 設定要跳躍的segment的權限(ring),再把address放入stack,利用ret,達成特權變換
0 意見:
張貼留言