(一)exception vector到底在**?
struct arm_high是被wince5 kernel安放在0xfffd,0000位址的乙個結構體。這個結構體非常大,我說它大不是因為它的 member很多,而是它的每個member都是乙個非常大的陣列。主要是為了對齊到一些特殊的位址。
我們知道在
core中0xffff,0000是high address exception vector的位置,而它就包含在struct arm_high中。對應於exvectors成員變數。
同時我們從這個結構體可以看出wince核心的一些精心安排。
0xfffd,0000存放mmu第一級頁表。第一級頁表的位址要對齊到16kb,也就是[13~0]是零。0xfffd,0000是滿足這個要求的。
0xffff,2400是interrupt processer mode用到的stack。
0xffff,4900是abort processer mode用到的stack。
0xffff,6800是fast interrupt processer mode用到的stack。
0xffff,c000是kernel mode用的stack。kernel mode 其實也就是supervisor processer mode。
值得注意的是stack是由高位址向低位址增長。經查證,上面4個stack位址。其實是stack的高位址。這些stack在使用時,stack會向reserved6這個member延伸。
我想問你的是:arm processer mode中的undefined mode,他的stack為什麼沒有定義?
有的!既然kernel stack用的是的reserved6,那麼kstack[0x800]這個空間就沒人用了,它就是undefined mode的stack空間。
(二) 系統呼叫
kernelinit
是mmu
啟用以後,一段軟體結構的初始化函式。它負責
system call
函式表的建立,和
nk.exe
這個程序的構建,當然也包括
nk.exe
的第一次以程序的身份排程執行。就此乙個類似於《黑客帝國》的虛擬環境就被建立起來了。或者說由單一執行緒啟動的環境,轉為乙個多執行緒併發執行的環境。不過
kernelinit
只是完成建立這個環境,真的虛擬環境開始不是這個函式的內容。
這個函式最值得看的地方是
system call
函式表的建立。因為其他的部分是
call
相應的函式,還看不見具體實現。
systemapisets
是個32
元素的結構體陣列。可以看出微軟將系統呼叫函式分成了
32組,而每組
apt set
有乙個函式表。
const cinfo *systemapisets[num_system_sets];
這就是systemapisets
這個全域性變數的宣告。它是指標陣列。
typedef struct cinfo cinfo;/* cinfo */
cinfo
最重要的成員變數就是
ppfnmethods
,它是真正的函式列表。
看看我們最常用的一些函式在**?
systemapisets[sh_win32] = &cinfwin32;
而cinfwin32
如下這樣定義:
const cinfo cinfwin32 = ;
真正的函式列表是
win32methods,
const pfnvoid win32methods = {
(pfnvoid)sc_nop,
(pfnvoid)sc_notsupported,
(pfnvoid)sc_createapiset,//2
(pfnvoid)ext_virtualalloc,//3
(pfnvoid)ext_virtualfree,//4
(pfnvoid)ext_virtualprotect,//5
(pfnvoid)ext_virtualquery,//6
(pfnvoid)sc_virtualcopy,//7
(pfnvoid)0,//8 was sc_loadlibraryw
(pfnvoid)sc_freelibrary,
//9
(pfnvoid)sc_getprocaddressw,// 10
(pfnvoid)sc_threadattachordetach,// 11 was sc_threadattachalldlls
(pfnvoid)0,// 12 was sc_threaddetachalldlls
(pfnvoid)sc_gettickcount,// 13
******xx
還有很多就不一一枚舉了。
將系統呼叫分組的乙個重要原因是
dispatch_i_kpsl
這個定義,它定義了這些函式在什麼程序空間裡,以什麼方式呼叫到。
(三) 程序控制塊(pcb)的初始化
(四) 重新整理啟動過程
擴充套件wince5物理中斷
我的開發環境是s3c2450 wince5,需要用到eint20做鍵盤中斷,但是因為wince5 預設只支援64個物理中斷,而且bsp用到的irq last是eint16。因為eint4到eint16 都有用處,想通過將eint20移到64 以內並新增靜態對映的方法就行不通了,只能用動態分配的方法,...
wince5下directdraw初體驗
因專案下一步應用的需求,需要用directdraw來實現相應功能,因此先行做初步嘗試,建立乙個感性的認識。眾所周知wince5支援directdraw,只是和pc下的還是有所不同的,在學習directdraw的時候就以public下的mosquito為例子進行學習,要讓這個程式在wince5下跑起來...
Wince讀核1 啟動流程1
寫在前面 將近一年前,做過一段時間windows mobile,當時忙於專案,精力放在bsp的除錯上,對widnows ce系統了解不深刻,後來忙別的專案就把ce放下了。時隔將近一年,這幾天難得有點清閒,看了一點ce的源 發現自己記性大不如前,正好這個blog很久沒有更新了,因此寫點東西吧。以下內容...