2007年12月14日 星期五

OrzMicrokernel main.asm 核心啟動主結構

Standard
作業系統核心的運作分兩個階段,第一個階段是初始化,第二個階段是規律的活下去。從第一階段到第二階段的流程和主結構都清楚地寫在 main.asm,而工作排程、記憶體規劃等設計都是由此再延伸出去。

main.asm 原始碼:
%include "defines.asm"
%include "orzmicro.inc"
%include "16bit.asm"
%include "32bit.asm"

;-----------------------------------------------------------------------------------
; Now, we are under 32 bit protected mode. Starting...

mov al,1 ; 設定為 320x200 的圖形模式
call SetVideoMode ; 呼叫 video.asm 的子程式設定顯示模式

call InitTasks ; 呼叫 tasks.asm 的子程式初始化工作狀態記錄表

mov eax, Ts1 + 0x10 ; 設 EAX 為工作記憶體開始位址
mov ebx, Ts2 - Ts1 - 0x10 ; 設 EBX 為工作所佔記憶大小
mov ecx, [Ts1 + 8] ; 設 ECX 為工作二進位檔的第 8 個 bytes 所設定的堆疊大小
mov edx, [Ts1 + 12] ; 設 ECX 為工作二進位檔的第 12 個 bytes 所設定的資料大小
mov esi, ts1Name ; 設 ESI 為工作名稱
call CreateTask ; 呼叫 tasks.asm 的 CreateTask 子程式建立工作

mov eax, Ts2 + 0x10 ; 設 EAX 為工作記憶體開始位址
mov ebx, Ts3 - Ts2 - 0x10 ; 設 EBX 為工作所佔記憶大小
mov ecx, [Ts2 + 8] ; 設 ECX 為工作二進位檔的第 8 個 bytes 所設定的堆疊大小
mov edx, [Ts2 + 12] ; 設 ECX 為工作二進位檔的第 12 個 bytes 所設定的資料大小
mov esi, ts2Name ; 設 ESI 為工作名稱
call CreateTask ; 呼叫 tasks.asm 的 CreateTask 子程式建立工作

mov eax, Ts3 + 0x10 ; 設 EAX 為工作記憶體開始位址
mov ebx, Ts4 - Ts3 - 0x10 ; 設 EBX 為工作所佔記憶大小
mov ecx, [Ts3 + 8] ; 設 ECX 為工作二進位檔的第 8 個 bytes 所設定的堆疊大小
mov edx, [Ts3 + 12] ; 設 ECX 為工作二進位檔的第 12 個 bytes 所設定的資料大小
mov esi, ts3Name ; 設 ESI 為工作名稱
call CreateTask ; 呼叫 tasks.asm 的 CreateTask 子程式建立工作

mov eax, Ts4 + 0x10 ; 設 EAX 為工作記憶體開始位址
mov ebx, Ts5 - Ts4 - 0x10 ; 設 EBX 為工作所佔記憶大小
mov ecx, [Ts4 + 8] ; 設 ECX 為工作二進位檔的第 8 個 bytes 所設定的堆疊大小
mov edx, [Ts4 + 12] ; 設 ECX 為工作二進位檔的第 12 個 bytes 所設定的資料大小
mov esi, ts4Name ; 設 ESI 為工作名稱
call CreateTask ; 呼叫 tasks.asm 的 CreateTask 子程式建立工作

mov eax, Ts5 + 0x10 ; 設 EAX 為工作記憶體開始位址
mov ebx, Ts6 - Ts5 - 0x10 ; 設 EBX 為工作所佔記憶大小
mov ecx, [Ts5 + 8] ; 設 ECX 為工作二進位檔的第 8 個 bytes 所設定的堆疊大小
mov edx, [Ts5 + 12] ; 設 ECX 為工作二進位檔的第 12 個 bytes 所設定的資料大小
mov esi, ts5Name ; 設 ESI 為工作名稱
call CreateTask ; 呼叫 tasks.asm 的 CreateTask 子程式建立工作

mov eax, Ts6 + 0x10 ; 設 EAX 為工作記憶體開始位址
mov ebx, Ts7 - Ts6 - 0x10 ; 設 EBX 為工作所佔記憶大小
mov ecx, [Ts6 + 8] ; 設 ECX 為工作二進位檔的第 8 個 bytes 所設定的堆疊大小
mov edx, [Ts6 + 12] ; 設 ECX 為工作二進位檔的第 12 個 bytes 所設定的資料大小
mov esi, ts6Name ; 設 ESI 為工作名稱
call CreateTask ; 呼叫 tasks.asm 的 CreateTask 子程式建立工作

jmp Schedule ; 啟動工作排程器,核心初始化到此為止

; Default tasks (entries)
; 將磁碟機、FAT12、Console、鍵盤等操作處理服務併入
; Orz MicroKernel 的設計,讓所有的硬體驅動等服務和核心分開。
; 雖然這些服務會被併入核心的程式檔內,但其實它們是個別的程式且獨立於核心架構之外。
; 被核心載入記憶體時,會被當成一般 User Mode 的工作執行。
; 所以,要是這些所謂的『驅動程式』出問題,不會導致核心崩潰當機。
Ts1: incbin "tasks/bin/exec_library.bin"
Ts2: incbin "tasks/bin/floppy_device.bin"
Ts3: incbin "tasks/bin/fat12_handler.bin"
Ts4: incbin "tasks/bin/init.bin"
Ts5: incbin "tasks/bin/console_library.bin"
Ts6: incbin "tasks/bin/keyboard_handler.bin"
Ts7:

; Default task names
ts1Name db "exec.library",0
ts2Name db "floppy.device",0
ts3Name db "fat12.handler",0
ts4Name db "init",0
ts5Name db "console.library",0
ts6Name db "keyboard.handler",0

;-------------------------------------------------------------------------------

%include "helper.inc"
%include "globals.asm"
%include "video.asm"
%include "mm.asm"
%include "tasks.asm"

%include "realmode.asm"
%include "irqs.asm"
%include "kprint.asm"
%include "gpfault.asm"
%include "except_fault.asm"
%include "irq_handlers.asm"
%include "messages.asm"

%include "tables.asm"



後記

其實我應該先寫 main.asm 的註解才對,畢竟這才是 Orz MicroKernel 的根。而其他枝芽,都是這之後的事了。

遺忘 Orz MicroKernel 有一陣子了,因為碰到期中考,又碰到很多事要忙,所以就只好擱著了。