日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

WINCE Launch函数分析

發(fā)布時間:2025/4/16 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WINCE Launch函数分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

********************************LoongEmbedded********************************

作者:LoongEmbedded(kandi)

時間:2010.12.12

類別:WINCE bootloader開發(fā)

********************************LoongEmbedded********************************

?

備注:基于WINCE6.0+2443的系統(tǒng)

?

我們知道Eboot中的BootloaderMainOEMLaunch函數(shù)來跳轉到OS的入口地址轉而開始OS的啟動,而OEMLaunch函數(shù)會調用Launch函數(shù)跳轉,見下圖

1

?

Launch/Src/Bootloader/Eboot/util.s中定義,因為Launch用匯編語言來來實現(xiàn)的,那么圖1中傳遞進來的物理地址會保存到寄存器r0中,下面是Launch的函數(shù)體:

2

下面就來分析這個函數(shù)

???????? 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,現(xiàn)在卻要關閉呢?因為eboot中藥用到微軟提供的oal_blcommon.lib,這就是eboot的主控制流實現(xiàn)的函數(shù)的庫,而這個庫的函數(shù)是要用到虛擬地址的,所以在eboot中需要打開MMU,但eboot中的MMU只建立了一級頁表,而WINCE操作系統(tǒng)后面需要建立二級頁表,所以從eboot跳轉到oal.exe的入口之前先關閉MMU,然后oal.exe的入口函數(shù)Starup接著跳轉到的內核函數(shù)KernelStart將建立二級頁表。

/***************************************************************/

???????? mrc???? p15, 0, r1, c1, c0, 0

???????? bic???? r1, r1, #0x0001???????????? ; Disable MMU

???????? mcr???? p15, 0, r1, c1, c0, 0

/***************************************************************/

關閉MMU后,跳轉到PhysicalStart對應的物理地址繼續(xù)執(zhí)行,也就是到PhysicalStart標號的地方處接著執(zhí)行,所以r2的內容必須是要物理地址了。

/***************************************************************/

???????? nop

???????? mov???? pc, r2????????????????? ; Jump to PStart

???????? nop

?

???????? ; MMU & caches now disabled.

?

PhysicalStart

/***************************************************************/

在跳轉到oal.exe的入口地址前,還需要flush TLB操作 ,所以就先跳到PhysicalStart處,做完其他操作之后再跳轉到oal.exe的入口函數(shù)Starup中。為什么要清除TLB呢?首先要知道TLB(Translation Lookaside Buffer)MMU中的一塊高速緩存,也就是一種cache,是CPU內核和物理內存之間的cache,它緩存了最近查找過的VA對應的頁表項,這是在eboot中使用的(eboot只建立了一級頁表),現(xiàn)在關閉了MMU,所以在跳轉到內核之前(操作系統(tǒng)的內核函數(shù)KernelStart來建立二級頁表)就需要先flush TLB,因為操作系統(tǒng)后面將使用二級頁表,保存著ebot的一級頁表的VA對應的頁表項的TLB中的內容以沒有意義,所以要清除,見下圖,這是ARM920T數(shù)據(jù)手冊中的相關描述

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函数分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。