ARMlinux的啟動部分源代碼簡略分析

ARMlinux的啟動部分源代碼簡略分析

ID:47630337

大?。?36.05 KB

頁數(shù):23頁

時間:2019-09-27

ARMlinux的啟動部分源代碼簡略分析_第1頁
ARMlinux的啟動部分源代碼簡略分析_第2頁
ARMlinux的啟動部分源代碼簡略分析_第3頁
ARMlinux的啟動部分源代碼簡略分析_第4頁
ARMlinux的啟動部分源代碼簡略分析_第5頁
資源描述:

《ARMlinux的啟動部分源代碼簡略分析》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、ARMlinux的啟動部分源代碼簡略分析ARMlinux的啟動部分源代碼簡略分析以友善之臂的mini2440開發(fā)板為平臺,以較新的內(nèi)核linux-2.6.32.7版本為例,僅作說明之用。當(dāng)內(nèi)核映像被加載到RAMZ后,Bootloader的控制權(quán)被釋放。內(nèi)核映像并不是可直接運行的目標(biāo)代碼,而是一個壓縮過的zlmage(小內(nèi)核)。但是,也并非是zlmage映像中的-?切均被壓縮了,映像中包含未被壓縮的部分,這部分中包含解壓縮程序,解壓縮程序會解壓縮映像中被壓縮的部分。zlmage使用gzip壓縮的,它不僅僅是一個壓縮文件

2、,而且在這個文件的開頭部分內(nèi)嵌有g(shù)zip解壓縮代碼。當(dāng)zlmage被調(diào)用時它從arch/arm/boot/compressed/head.S的start匯編例程開始執(zhí)行。這個例程進(jìn)行一些基木的硬件設(shè)置,并調(diào)用arch/ann/boot/compressed/misc.c屮的decompress_kernel()解壓縮內(nèi)核。arch/arm/kernel/head.S文件是內(nèi)核真正的啟動入口點,一般是由解壓縮內(nèi)核的程序來調(diào)用的。首先先看下對于運行這個文件的耍求:MMU=off;D-cache=off;I-cache=無

3、所謂,開也可以,關(guān)也可以;rO=0;rl=機器號;r2=atags指針。這段代碼是位置無關(guān)的,所以,如果以地址0xC0008000來鏈接內(nèi)核,那么就可以直接用_pa(0xc0008000)地址來調(diào)用這里的代碼。其實,在這個(Linux內(nèi)核中總共有多達(dá)兒十個的以head.S命名的文件)head.S文件屮的一項重要工作就是設(shè)置內(nèi)核的臨時頁表,不然mmu開起來也玩不轉(zhuǎn),但是內(nèi)核怎么知道如何映射內(nèi)存呢?linux的內(nèi)核將映射到虛地址OxCxxxxxxx處,但他怎么知道在4GB的地址空間中有哪一片mm是可用的,從而可以映射過去

4、呢?因為不同的系統(tǒng)有不通的內(nèi)存映像,所以,LINUX約定,要調(diào)用內(nèi)核代碼,一定要滿足上面的調(diào)用要求,以為最初的內(nèi)核代碼提供一些最重要的關(guān)于機器的信息。內(nèi)核代碼開始的時候,R1存放的是系統(tǒng)目標(biāo)平臺的代號,對于一些常見的,標(biāo)準(zhǔn)的平臺,內(nèi)核已經(jīng)提供了支持,只要在編譯的時候選中就行了,例如對X86平臺,內(nèi)核是從物理地址1M開始映射的。好了好了,看下面的代碼。arch/arm/kernel/head.SENTRY(slcxl)是這個文件的入口點。最初的兒行是這樣的:setmodePSR_F_BIT

5、PSR_I_BIT

6、SVC_

7、MODE,r9@ensuresvcmode@andirqsdisabled〃設(shè)置為svc模式,關(guān)閉屮斷和快速屮斷//此處設(shè)定系統(tǒng)的工作狀態(tài)為SVC,arm有7種狀態(tài)每種狀態(tài)〃都有自己的堆棧,SVC為管理模式,具有完全的權(quán)限,可以執(zhí)行任意指令//訪問任意地址的內(nèi)存//setmode是一個宏,其定義為://.macrosetmode,mode,reg//msrcpsr_c,#mode//.endmmrcpl5,0,r9,cO,cO@getprocessoridbl_lookup_processor_type@r5=pr

8、ocinfor9=cpuidmovsrlO,r5@invalidprocessor(r5=0)?beq—error_p@yes,errorp*這兒行是查詢處理器的類型的,我們知道arm系列有很多型號,arm7>arm9sarmll>Cortex核等等類型,這么多型號要如何區(qū)分呢?其實,在arm的15號協(xié)處理器(其實ARM暫時也就這么一個協(xié)處理器)屮有一個只讀寄存器,存放與處理器相關(guān)信息?!猯ookup_processor_type是arch/arm/kernel/head-common.S文件中定義的一個例程,這個h

9、ead-common.S用include命令被包含在head.S文件中。其定義為:lookup_processor_type:adrr3,3fldmiar3,{r5-r7)subr3,r3,r7addr5,r5,r3addr6,r6,r3ldmiar5,{r3,r4}and『4,r4,r9teqr3,r4beq2faddr3,r3,#8@getoffsetbetweenvirt&phys@convertvirtaddressesto@physicaladdressspace@value,mask@maskwanted

10、bitsaddr5,r5,#PROC」NFO_SZ@sizeof(proc_info_Iist)cmpr5,r6biolb2:movpc,lrmovr5,#0@unknownprocessorENDPROC(—lookup_processor_type)這個例程接受處理器ID(保存在寄存器「9中)為參數(shù),查找鏈接器建立的支持的處理器表。此時此刻

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。