2007年10月11日 星期四

OrzMicrokernel bit16.asm 核心前置動作並轉換到保護模式的註解

Standard
bit16.asm 是 OrzMicrokernel 從真實模式轉換到保護模式的部份。保護模式是作業系統必要的運作環境,因為保護模式支援了 4GB 的實體記憶體定址、可擴充的記憶體分頁機制、多重任務機制、特權級等多工作業系統會用到的各種機制。

詳細程式碼和註解:
[BITS 16]
[ORG KERNEL_START]

Start:
; 初始化暫存器區段
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax ; 初始化堆疊區段
mov sp, 0x0000 ; 堆疊指標暫存器歸零

; 準備開始切換到保護模式
cli ; 禁用中斷以免干擾初始化
cld ; 設定字串處理時由低住址往高位址
call PrepareIRQs ; 呼叫 irqs.asm 的副程式以初始化 IRQ

; A20 位址線控制器:
; 早期 8086 的 CPU 只有 20 bits 的位址匯流排,只能定址到 1MB 的記憶體
; 因此,如果試圖存取超過 1MB 的記憶體,將會回到位址零重新定位循環下去
; 所以,要打開 A20 位址線,讓電腦可以定址大於 1MB 的記憶體
call A20En ; 呼叫 irqs.asm 的副程式
; 以打開 A20 位址線

lgdt [_GDT - KERNEL_START] ; 載入 GDT:_GDT 在 tables.asm
lidt [_IDTR - KERNEL_START] ; 載入 IDT:_IDTR 在 tables.asm

; 切換到保護模式
; 切換成保護模式的方法:將 CR0 的 PE 欄位(Bit0)設為 1
;
; 控制暫存器 CR0 的結構:
; 位元編號 [31][30][29][28-19][18][ 17 ][16][15-6][05][04][03][02][01][00]
; 欄位名稱 [PG][CD][NW][保 留][AM][保 留][WP][保 留][NE][ET][TS][EM][MP][PE]

mov eax, cr0 ; 將 cr0 內容放入 eax 暫存器
; 設定 CR0 的 PE(Bit0) = '1'
or eax, 00000000000000000000000000000001b
and eax, 10011111111110101111111111111111b
mov cr0, eax ; 將 eax 回存設定至控制暫存器

; 將 kernel_code 程式段放入 CS 程式區段
; 然後立即切換到保護模式並執行在32bit.asm
; 的 Begin32c
jmp DWORD (kernel_code - _GDT):Begin32c


後記

boot.asm 還有一部份尋找系統核心的程式還未註解完成,我會在最近慢慢將它完成。不過講再多的 boot.asm,OrzMicrokernel 的作業系統核心還是沒有被啟動,未免令人感到煩悶,這篇換換口味來談談載入核心後,的核心初始化和保護模式轉換。