(轉)Wince讀核1-啓動流程1

寫在前面
將近一年前,做過一段時間windows mobile,當時忙於項目,精力放在bsp的調試上,對widnows ce系統瞭解不深刻,後來忙別的項目就把ce放下了。時隔將近一年,這幾天難得有點清閒,看了一點ce的源代碼,發現自己記性大不如前,正好這個blog很久沒有更新了,因此寫點東西吧。
以下內容基於ce5.0,arm體系結構。

參考
1. ce5.0源代碼和幫助文檔
2. 《ARM Architecture Reference Manual》

索引
1. 從KernelStart開始
2. arm9虛擬地址到物理地址的轉換
3. ;;寫到再說

1. 從KernelStart()開始
事實上,kernel並不是從KernelStart()開始運行。eboot加載內核後,跳轉的地址是startup.s文件的StartUp()函數(此處忽略msipl)。這個文件一般位於bsp目錄中。這個函數會做一些預處理工作,之後跳到另一個startup.s文件的OALStartUp()函數,該函數做一些bsp級別的檢查工作,之後會跳轉到armtrap.s文件的KernelStart()函數。在跳轉前要注意兩點,一是此時mmu是關閉的,也就是cpu直接訪問的是物理地址;其次g_oalAddressTable的物理地址會保存在r0寄存器中。g_oalAddressTable定義了虛擬地址和物理地址的映射關係,由bsp提供,下面是270的一個實現。第一列是虛擬地址,第二列是物理地址,第三列是大小,單位MB。
     g_oalAddressTable

            DCD        0x80000000, 0xA0000000, 64         ; MAINSTONEII: SDRAM (64MB).
            DCD        0x84000000, 0x5C000000,     1         ; BULVERDE: Internal SRAM (64KB bank 0).
            DCD        0x84100000, 0x58000000,     1         ; BULVERDE: Internal memory PM registers.
            DCD        0x84200000, 0x4C000000,     1         ; BULVERDE: USB host controller.
            DCD        0x84300000, 0x48000000,     1         ; BULVERDE: Memory controller.
            DCD        0x84400000, 0x44000000,     1         ; BULVERDE: LCD controller.
            DCD        0x84500000, 0x40000000, 32         ; BULVERDE: Memory-mapped registers (peripherals).
            DCD        0x86500000, 0x3C000000, 64         ; BULVERDE: PCMCIA S1 common memory space.
            DCD        0x8A500000, 0x38000000, 64         ; BULVERDE: PCMCIA S1 attribute memory space.
            DCD        0x8E500000, 0x30000000, 32         ; BULVERDE: PCMCIA S1 I/O space.
            DCD        0x90500000, 0x2C000000, 64         ; BULVERDE: PCMCIA S0 common memory space.
            DCD        0x94500000, 0x28000000, 64         ; BULVERDE: PCMCIA S0 attribute memory space.
            DCD        0x98500000, 0x20000000, 32         ; BULVERDE: PCMCIA S0 I/O space.
            DCD        0x9A500000, 0xE0000000,     1         ; MAINSTONEII: Zero-bank (in reserved slot - no physical memory required).

            DCD        0x9AA00000, 0x00000000, 64         ; MAINSTONEII: nCS0: MCPII Module Boot Flash (64MB).
            DCD        0x9EA00000, 0x50000000,     1         ; BULVERDE: Camera peripheral interface.
         
            DCD        0x00000000, 0x00000000,     0         ; end of table

2. arm9虛擬地址到物理地址的轉換
在這裏有必要介紹一點arm體系結構的基礎知識。在mmu使能後,cpu“看到”的地址都是虛擬地址,mmu的功能之一就是把虛擬地址轉換成物理地址(此處暫時忽略FCSE),因爲電氣信號只認識物理地址。比如要訪問上面的虛擬地址0x80000000,在操作具體的地址總線時必須使用物理地址0xA0000000。
arm9系列cpu,有的不支持mmu而只有內存保護單元,有的支持mmu,後者還支持mmu的多種映射方式,具體可以參考文檔2。ce目前的arm實現不僅利用了cpu的mmu功能,還使用了兩種mmu映射方式:最高的1MB(0xFFF00000-0xFFFFFFFF),使用二級映射,並使用不同的page類型;而其餘地址空間,只使用一級映射。這樣做的原因是ce把高1MB空間用來給內核儲存內存映射表(page table),中斷向量表(exception vectors),不同模式下的stack和KDataStruct結構,而它們有不同的內存訪問方式(domains,C,B等,參考文檔2),需要用二級映射加以細分;而其它地址空間爲了簡化訪問,加快速度,採用一級映射。下面會結合代碼分析。
對於一級映射,參考下圖。


對於二級映射,參考下圖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章