
最近在研究
Jserv大師 所寫的 "OrzMicroKernel", 果然是霧裡看花...有看沒有懂的地步,很多地方還是要靠 Google 來找答案...XD, 不過最重要的核心部份, 我想應該是 Schedule 摟. 可參考
OS Kernel 相關閱讀與實作心得﹝一﹞,裡面會定義哪個 task 有使用權,是 Preemptive/Non-preemptive type, 以現今的 real time 系統下, 應該都有 support Preemptive 的架構.
底下我們就用 c 來實作個 Schedule emulator.
1.task 架構
利用 pthread 來模擬 task request os kernel 的型式.
分別會定義 task id, priority, time_out, work_time
priority : 為 task 的使用優先權. 0>1>2....
time_out : 為 task 的 requirement time,表示這個 task 最低的容忍時間,
一但 time_out =0 時, 表示目前的 task 要立刻被執行, 可以 interrupt high priority 的 task.
work_time : 為 task 所要 run 的時間.
2. queue 架構
normal queue : 為 task 存取的 queue
emergency queue : 一但有 task 的 time_out=0, 立刻從 normal queue 中移入 emergency queue.
emulator os 會先判斷 emergency queue是否為空, 如果為空的, 就 access normal queue. 做 一般 priority 判斷的結果. 如果不為空的, 則處理 emergency queue.

Results:
@iOS work on normal queue -> id @,0
@NORMAL queue
queue :: id 0,time_out : 9,priority : 0,work_time : 2
queue :: id 1,time_out : 2,priority : 1,work_time : 3
queue :: id 2,time_out : 4,priority : 2,work_time : 3
@EMERGENCY queue
@iOS work on normal queue -> id @,0
@NORMAL queue
queue :: id 0,time_out : 8,priority : 0,work_time : 1
queue :: id 1,time_out : 1,priority : 1,work_time : 3
queue :: id 2,time_out : 3,priority : 2,work_time : 3
@EMERGENCY queue
@iOS work on emergency queue -> id @,1
@NORMAL queue
queue :: id 2,time_out : 2,priority : 2,work_time : 3
queue :: id 0,time_out : 7,priority : 0,work_time : 1
@EMERGENCY queue
queue :: id 1,time_out : 0,priority : 1,work_time : 2
@iOS work on emergency queue -> id @,1
@NORMAL queue
queue :: id 2,time_out : 1,priority : 2,work_time : 3
queue :: id 0,time_out : 6,priority : 0,work_time : 1
ps: 應該要好好認真的把 OS 看熟才是...XD
project @ https://github.com/funningboy/SOC_c_model/tree/master/iOS/
Refs:
OS Kernel 相關閱讀與實作心得﹝一﹞
http://en.wikipedia.org/wiki/X86_memory_segmentation
x86 Instruction Set Reference
x86 Disassembly/Loop Examples
OrzMicrokernel tasks.asm 工作排程器的切換執行權函式註解,