2015年9月28日 星期一

進入保護模式
  1. 準備 GDT(在 16 bit mode)
  2. lgdt
  3. open Address line 20
  4. set cr0 的 PE
  5. 跳入保護模式(32 bit )
過去(16 bit ) segment addressing 主要是為了提供更大的定址空間

 但到了32 bit 的暫存器, 則是用來區隔不同用途的記憶體範圍,還有提供各區段的屬性設定

如權限 stack point 的 size 設定等

從保護模式回到真實模式
  1.  無法直接從32 bit 的 code segment 跳回16bit
  2. 所以要先提供 align 32 的16bit程式碼段
  3. 再從該 code segment 跳至真實模式
  4. close A20
  5. 開中斷
 jump 跟 call 可以進行幾種轉移
  1. operand 包含 target code segment selector
  2. operand 指向 target code segment selector 的 call gate descriptor
  3. operand 指向 target code segment selector 的 TSS
  4. operand 指向 task gate descriptor,此 descriptor 包含 target code segment selector 的 TSS
IPC好處
  1. 不用另外維護正在傳送的 message buffer
  2. 不用保存訊息副本
  3. 不用維護接收 buffer
  4. sender 跟 recv-er 都能清楚知道訊息是否送達
使用權限轉移的save()

  1.  保存暫存器
  2. 設定進入 kernel mode flag
  3. 檢查是不是已經進到 kernel stack
  4. 如果已經進到 kernel stack 則將第一步保存的暫存器 pop 出來
  5. 否則要重新載入新的 LDT ,轉移 stack 至即將執行 process 所用的 stack
  6. 將目前正在執行的process stack保存至TSS最上方
虛擬機器使用
  1. Floppy Disk 必須是1.44MB freedos才能正常讀取
  2. 可以使用 qemu-img create -f raw name.img 1440K 取代 bximage的功能
  3. 啟動 freedos
  4. qemu-system-i386 -fda ./freedos.img  -fdb ./name.img
    
  5. 產生出來的 image 要 format 成msdos
address 轉移的權限
  1. 透過LDT設定在ldtr,再跳轉
  2. 直接設定call gate設定該 segment的權限(只限低至高)
  3.  設定要跳躍的segment的權限(ring),再把address放入stack,利用ret,達成特權變換

0 意見:

張貼留言