2007年10月15日 星期一

OrzMicrokernel tasks.asm 初始化多工機制和工作狀態的資料結構

Standard
main.asm 在設定完顯示模式後,緊接著就是開始初始化多工機制。我們將配置一塊記憶體來存放所有工作的名稱、執行狀態﹝包括各種暫存器的內容﹞,在 Orz Microkernel 中,工作數量被限制為 64 個,它被定義在 define.asm 裡頭。

程式碼和詳細註解:
InitTasks:
mov ecx, MAX_TASKS ; 設 ECX 為最大工作數量﹝定義在 define.asm﹞
mov ebp, tasks ; 設定工作狀態記錄所在位址﹝定義在tables.asm﹞
xor eax, eax ; 將 EAX 歸零

InitTasks0:
mov [ebp + s_task.taskID], eax ; 初始化工作狀態記錄編號
add ebp, s_task.msize ; 移到下一個工作狀態記錄的開頭
loop InitTasks0 ; 重覆工作狀態記錄初始化 ecx 次
ret



從上面程式碼看到的 s_task,是工作狀態記錄的資料結構,它被定義在 task.asm 的開頭:
; 使用虛擬指令 RESB、RESD 宣告不含初值的資料結構 s_task
struc s_task
.taskID: resd 1 ; 工作編號 Dword(2 Bytes)
.state: resb 1 ; 工作狀態 Dword(1 Byte)
.newTick: resd 1 ; need for state=STATE_SLEEP

.queue: resd (MAX_TASKS + 1)
.qFirst: resd 1
.qLast: resd 1

.s_taskID: resd 1
.s_message: resd 1
.s_dataPtr: resd 1
.s_dataSize: resd 1

.taskPageAddr: resd 1
.taskPages: resd 1

; 工作執行時的各項暫存器設定
.r_eflags: resd 1
.r_eax: resd 1 ; EAX 累積暫存器
.r_ebx: resd 1 ; EBX 基底暫存器
.r_ecx: resd 1 ; ECX 計數暫存器
.r_edx: resd 1 ; EDX 資料暫存器
.r_esi: resd 1 ; ESI 來源索引暫存器
.r_edi: resd 1 ; EDI 目的索引暫存器
.r_ebp: resd 1 ; EBP 基底指標暫存器
.r_esp: resd 1 ; ESP 堆疊指標暫存器
.r_eip: resd 1 ; EIP 指標暫存器

.taskName: resb (MAX_TASK_NAME + 1) ; 工作名稱

.msize:
endstruc ; 資料結構結尾



後記

在資料結構的中間一段我尚未註解,因為我偷懶 :)
但我卻厚臉皮的還是要強辯,因為那部份牽涉到日後工作的執行,所以之後再補上註解就好了,現在只是初始化資料會用到的記憶體,暫時不用理解到這麼多。

我現在好像都是在夜深人靜的時候,才來註解一下 Orz Microkernel。不過說真的,這工作當睡前腦部運動真是不錯的選擇﹝笑﹞。