OrzMicrokernel video.asm 切換顯示模式的註解

依照 Orz Microkernel 在 main.asm 的核心啟動流程來看,在轉換到保護模式並做了最基本的初始化之後,就會 call SetVideoMode 來切換顯示模式到 320x200。關於這部份,比較複雜的是牽涉到 BIOS 中斷,由於在保護模式之下無法使用 BIOS INT,所以特別額外在 realmode.asm 寫了在保護模式下處理此類中斷的呼叫函式﹝關於 realmode.asm 的註解日後補上﹞。

程式碼和詳細註解:
;------------------------------------------------------------------------------
; 文字模式﹝80x25,16色﹞:AL=0
; 圖形模式﹝320x200,256色﹞:AL=1

SetVideoMode:
and al, al
jnz SetVideoMode0 ; 若 AL 不為 0 則呼叫 SetVideoMode0

mov [rmode_ax], WORD 0x03 ; 文字模式
mov al, 0x10 ; 中斷 10H

; 在保護模式下舊有的中斷向量表已被 IDT 代替
; 導致 BIOS 中斷在保護模式下無法使用
; 故 BIOS 中斷得在真實模式執行
; 因此特別在 realmode.asm 中設計一個處理真實模式中斷的函式
jmp RmodeInt ; 呼叫在 realmode.asm 的 RmodeInt 處理中斷

SetVideoMode0:
dec al ; AL=AL-1
jnz SetVideoMode1 ; 若 AL 不為 0 則呼叫 SetVideoMode1 返回

mov [rmode_ax], WORD 0x13 ; 圖形模式
mov al, 0x10 ; 中斷 10H
jmp RmodeInt ; 呼叫在 realmode.asm 的 RmodeInt 處理中斷

SetVideoMode1:
ret



後記

從現在開始,我們將會慢慢感受到 Protect Mode 的複雜度,這也是作業系統核心設計最無聊煩悶的起步 :)

留言

  1. Thanks!

    補充,何以 SetVideoMode 僅處理 320x200 的低解析度呢?因為考慮到使用 qemu 作為模擬環境,不希望因此佔用過多畫面輸出,導致開發不便。

    回覆刪除

張貼留言

這個網誌中的熱門文章

有趣的邏輯問題:是誰在說謊

Web 技術中的 Session 是什麼?

淺談 USB 通訊架構之定義(一)

淺談 USB 通訊架構之定義(二)

Reverse SSH Tunnel 反向打洞實錄