資源描述:
《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ù),查找鏈接器建立的支持的處理器表。此時此刻