WINCE Launch函数分析
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時間:2010.12.12
類別:WINCE bootloader開發
********************************LoongEmbedded********************************
?
備注:基于WINCE6.0+2443的系統
?
我們知道Eboot中的BootloaderMain會OEMLaunch函數來跳轉到OS的入口地址轉而開始OS的啟動,而OEMLaunch函數會調用Launch函數跳轉,見下圖
圖1
?
Launch在/Src/Bootloader/Eboot/util.s中定義,因為Launch用匯編語言來來實現的,那么圖1中傳遞進來的物理地址會保存到寄存器r0中,下面是Launch的函數體:
圖2
下面就來分析這個函數
???????? LEAF_ENTRY Launch
/***************************************************************/
因為此時MMU還沒有關閉,eboot的程序在RAM中運行,所以PhysicalStart還是一個虛擬地址,注意了,這里的PhysicalStart不是跳轉之前的跳轉虛擬地址啊,而是編譯器分配為后面PhysicalStart符號表示的地方的安排的地址,具體是多少我不知道,但知道是在0x80038000~ 0x80078000(0x80038000+0x0004000)范圍內,這是由eboot/boot.bib下面的內容指定的
MEMORY
;?? Name???? Start???? Size????? Type
……………………………….
EBOOT 80038000 00040000 RAMIMAGE
所以ldr?? r2, = PhysicalStart就是把PhysicalStart的虛擬地址保存在讓寄存器中。
/***************************************************************/
???????? ldr??? r2, = PhysicalStart
/***************************************************************/
計算出虛擬地址和物理地址的差值=0x50000000
/***************************************************************/
???????? ldr???? r3, = (VIR_RAM_START - PHY_RAM_START)
/***************************************************************/
計算出虛擬地址PhysicalStart對應的物理地址值,假如r2=0x80060000,那么進行sub運算之后r2=0x30060000。
/***************************************************************/
???????? sub???? r2, r2, r3
/***************************************************************/
關閉MMU,為什么在ebot中先打開MMU,現在卻要關閉呢?因為eboot中藥用到微軟提供的oal_blcommon.lib,這就是eboot的主控制流實現的函數的庫,而這個庫的函數是要用到虛擬地址的,所以在eboot中需要打開MMU,但eboot中的MMU只建立了一級頁表,而WINCE操作系統后面需要建立二級頁表,所以從eboot跳轉到oal.exe的入口之前先關閉MMU,然后oal.exe的入口函數Starup接著跳轉到的內核函數KernelStart將建立二級頁表。
/***************************************************************/
???????? mrc???? p15, 0, r1, c1, c0, 0
???????? bic???? r1, r1, #0x0001???????????? ; Disable MMU
???????? mcr???? p15, 0, r1, c1, c0, 0
/***************************************************************/
關閉MMU后,跳轉到PhysicalStart對應的物理地址繼續執行,也就是到PhysicalStart標號的地方處接著執行,所以r2的內容必須是要物理地址了。
/***************************************************************/
???????? nop
???????? mov???? pc, r2????????????????? ; Jump to PStart
???????? nop
?
???????? ; MMU & caches now disabled.
?
PhysicalStart
/***************************************************************/
在跳轉到oal.exe的入口地址前,還需要flush TLB操作 ,所以就先跳到PhysicalStart處,做完其他操作之后再跳轉到oal.exe的入口函數Starup中。為什么要清除TLB呢?首先要知道TLB(Translation Lookaside Buffer)是MMU中的一塊高速緩存,也就是一種cache,是CPU內核和物理內存之間的cache,它緩存了最近查找過的VA對應的頁表項,這是在eboot中使用的(eboot只建立了一級頁表),現在關閉了MMU,所以在跳轉到內核之前(操作系統的內核函數KernelStart來建立二級頁表)就需要先flush TLB,因為操作系統后面將使用二級頁表,保存著ebot的一級頁表的VA對應的頁表項的TLB中的內容以沒有意義,所以要清除,見下圖,這是ARM920T數據手冊中的相關描述
圖3
/***************************************************************/
???????? mov???? r2, #0
???????? mcr???? p15, 0, r2, c8, c7, 0?? ; Flush the TLB
???????? mov???? pc, r0????????????????????????? ; Jump to program we are launching.
?
相關帖子:
http://topic.csdn.net/u/20081217/11/f15fa8e3-6215-4f92-b294-17af5b9b38cb.html
總結
以上是生活随笔為你收集整理的WINCE Launch函数分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++从入门到高手所有必备PDF书籍
- 下一篇: 黄金积存业务