資源描述:
《20121020linux內(nèi)核啟動(dòng)內(nèi)核自解壓分析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、內(nèi)核自解壓過程分析本章代碼的主要工作是將zlmage解壓,并把解壓后的內(nèi)核拷貝的正確的執(zhí)行位置。在解壓之前cpu有幾項(xiàng)工作要完成:1.將bootloard傳入的參數(shù)保存起來2.進(jìn)入管理模式,并將中斷關(guān)閉3.判斷各段代碼指針是否有偏移,有偏移的話就要更改指針地址4.清楚bass段,打開髙速緩存,設(shè)置棧的開始地址和結(jié)束地址,大小為64k5.接下來要判斷解壓后各段數(shù)據(jù)是否有重疊,具體做法是(比較解壓后內(nèi)核的開始地址(執(zhí)行內(nèi)核的首地址)是否比設(shè)置的棧的結(jié)束地址大,如果大則跳轉(zhuǎn)到vvont.overwrite,否則比較解壓后內(nèi)核的結(jié)束地址是否比Image的開始地址小,如果小則跳轉(zhuǎn)到wont_ov
2、erwrite。Wont_overwrite的作用是設(shè)置參數(shù)解壓內(nèi)核、運(yùn)行解壓后的內(nèi)核)如果有重疊的話,做一些工作(這些工作很簡(jiǎn)單在代碼中能見到)然后解壓內(nèi)核,解壓之后要重新搬移內(nèi)核到正確的位置,在搬移過程中可能有解壓內(nèi)核和搬移內(nèi)核的代碼相重疊,所以在搬移之前要將這段代碼搬移到一個(gè)安全的地址,然后可以開始內(nèi)核的搬移,搬移完內(nèi)核之后要刷新cache,之后關(guān)閉cache然后開始運(yùn)行內(nèi)核。下面是內(nèi)核自解壓過程的完整代碼和分析:*linux/arch/arm/boot/compressed/head.S氺*Copyright(C)1996-2002RussellKing*Copyright(C
3、)2004HyokS.Choi(MPUsupport)*Thisprogramisfreesoftware;youcanredistributeitand/ormodify*itunderthetermsoftheGNUGeneralPublicLicenseversion2as*publishedbytheFreeSoftwareFoundation.*/#include/**Debuggingstuff氺*Notethatthesemacrosmustnotcontainanycodewhichisnot*100%relocatable(重定位).
4、Anyattempttodosowillresultinacrash.*Pleaseselectoneofthefollowingwhenturningondebugging.*/#ifdefDEBUG/*調(diào)試宏中間層#ifdefined(CONFIG_DEBUG_ICEDCC)/*使用內(nèi)部調(diào)試協(xié)處理器*/#ifdefCONFIG_CPU_V6.macroloadsp,rb5、teb,ch,rbmcrpl4,0,ch,c8,c0,0.endm#else?macroloadsp,rb?endm.macrovvriteb,ch,rbmcrpl4,0,ch,cl,c0,0.endm#endif#else#include/*包含架構(gòu)相關(guān)的調(diào)試宏的匯編文件調(diào)試宏?底層*/.macrowriteb,ch,rbsenduartch,rb.endm#ifdefined(CONFIG_ARCH_SAHOO).macroloadsp,rbmovrb,#0x8⑽00000@physicalbaseaddress#ifdefCONF
6、IG_DEBUG_LL_SER3addrb,rb,#0x00050000@Ser3#elseaddrb,rb,#0x00010000@Seri#endif.endm#elifdefined(CONFIG_ARCH_S3C2410)?macroloadsp,rbmovrb,#0x50000000addrb,rb,#0x4000*CONFIG_S3C_LOWLEVEL_UART_PORT.endm#else.macroloadsp,rbaddruartrb?endm#endif#endif#endif.macrokputc,valmovrO,valblputc?endm.
7、macrokphex,val,IenmovrO,valmovrl,#lenblphex.endm.macrodebug_reloc_start#ifdefDEBUGkputc#ffkphexr6,8/*processorid*/kputc#*:*kphexr7,8/*architectureid*/#ifdefCONFIG_CPU_CP15kputcr:1mrcpl5,0,rO,cl,cOkphexr0,8/*controlreg*/#