WinCE5讀核筆記

2021-05-21 18:27:25 字數 2674 閱讀 5203

(一)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很久沒有更新了,因此寫點東西吧。以下內容...