《LINUX實(shí)戰(zhàn):u-boot 1.3.4源碼分析詳細(xì)教程》要點(diǎn):
本文介紹了LINUX實(shí)戰(zhàn):u-boot 1.3.4源碼分析詳細(xì)教程,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
每款MCU上電之后,并不是立即執(zhí)行到主程序的,而是最先初始化整個(gè)系統(tǒng)資源,俗稱“Boot loader”.所以,u-boot是一種普遍用于嵌入式系統(tǒng)中的Boot loader,Boot loader是在操作系統(tǒng)運(yùn)行之前執(zhí)行的一小段程序,通過(guò)它,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射表,從而建立適當(dāng)?shù)能浻布h(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做好準(zhǔn)備.Boot loader的主要運(yùn)行任務(wù)就是將內(nèi)核映象從硬盤上讀到RAM中,然后跳轉(zhuǎn)到內(nèi)核的入口點(diǎn)去運(yùn)行,即開始啟動(dòng)操作系統(tǒng).系統(tǒng)在上電或復(fù)位時(shí)通常都從地址0x00000000處開始執(zhí)行,而在這個(gè)地址處支配的通常就是系統(tǒng)的Boot Loader程序;所以了解了u-boot的啟動(dòng)流程,就可以清楚知道linux啟動(dòng)時(shí)打印的信息是什么意思.
那么在介紹u-boot之前,先來(lái)認(rèn)識(shí)一款軟件Source insight;由于從u-boot官網(wǎng)下載的u-boot1.3.4安裝包,它支持各大硬件平臺(tái),而且程序數(shù)據(jù)極多,在學(xué)習(xí)時(shí),必要挑重點(diǎn),找出符合字節(jié)硬件的程序;所以source insight是一款相當(dāng)不錯(cuò)的軟件,當(dāng)然像Slick edit也是一款很好的編輯器.
1 . Source Insight 使用
1.1 Source Insight工程創(chuàng)立
新建工程菜單
工程設(shè)置界面
工程設(shè)置完成
工程文件保留路徑設(shè)置界面(默認(rèn))
源碼添加界面
配置為添加子目次文件
添加文件完成界面
封閉源碼添加界面
文件同步菜單
同步設(shè)置裝備擺設(shè)
同步進(jìn)行中
同步完成后界面
1.2常用操作先容:
過(guò)濾文件(輸入要查看的文件名)
查看目的文件
查看文件中函數(shù),變量,宏界說(shuō):
對(duì)于整個(gè)工程中只一個(gè)一份代碼的函數(shù)或變量或宏,導(dǎo)航窗口會(huì)直接列出其界說(shuō),如下所示
對(duì)于有多個(gè)同名目標(biāo),則會(huì)以列表形式呈現(xiàn),讓用戶選擇:
搜索功效:
給工程添加非默認(rèn)類型文件:
刪除文件:
反向刪除:
同樣辦法刪除CPU目錄下無(wú)關(guān)文件.
2.? u-boot目錄布局
board:存放文件夾的是具體開發(fā)板相關(guān)文件夾,有的目錄是公司名,里面存放具體開發(fā)板的文件夾.有的直接開發(fā)板文件夾.此中存放的是板級(jí)相關(guān)文件.
common:通用文件,存放的是所有CPU共用的文件,大部門是u-boot命令支持文件.
像bootm, go,tftpboot ,help 等命令便是在這些文件中實(shí)現(xiàn).
CPU:存放芯片構(gòu)架相關(guān)的文件,一個(gè)文件夾代表一個(gè)類型的CPU核心.此中的文件夾存放整個(gè)核心通用的代碼文件以及具體的SOC文件夾.
Disk? ? ? ? ? ? ? :硬件相關(guān)的支持代碼.不消修改.
Doc? ? ? ? :u-boot的使用說(shuō)明書.不消修改.
Drivers? :u-boot裝備驅(qū)動(dòng)代碼.
Fs? ? ? ? ? :文件系統(tǒng)代碼,不消修改.
include:u-boot頭文件,包括有公用頭文件,設(shè)備驅(qū)動(dòng)相關(guān)頭文件,以及分體系構(gòu)架相關(guān)的頭文件.
其中有一個(gè)文件夾是configs,比擬重要,存放開發(fā)板配置頭文件,每個(gè)開發(fā)板對(duì)應(yīng)一個(gè)頭文件,頭文件的名字就是開發(fā)板的名字.
lib_generic:通用庫(kù)文件代碼,整個(gè)u-boot共用文件.不消修改.
lib*:? ? 其他以lib開頭的是具體體系架構(gòu)相關(guān)的庫(kù)文件,整個(gè)個(gè)芯片構(gòu)架共用的文件.不消修改.
nand_spl:nand 驅(qū)動(dòng).
net:網(wǎng)絡(luò)協(xié)議代碼,一般不消修改.
post:一些開發(fā)板上電檢測(cè)代碼,一般不消修改.
tool:編譯u-boot必要的一些工具代碼,不用修改.
README:文本文檔,u-boot的編譯,配置闡明.
Makefile: 管理u-boot的Makefile文件—移植u-boot時(shí)候要在這個(gè)文件 添加一個(gè)本身的開發(fā)板配置選項(xiàng).
3. u-boot 的啟動(dòng)進(jìn)程
3.1? u-boot 啟動(dòng)階段
? ? ? 分兩部門:
1)匯編部門—啟動(dòng)代碼;入口: cpu/構(gòu)架文件夾/start.S
2) C語(yǔ)言代碼部門.u-boot復(fù)雜功能都是這個(gè)階段實(shí)現(xiàn).
進(jìn)口:lib_*/board.c 中void start_armboot (void)函數(shù).
任何一個(gè)開發(fā)板的u-boot都是從cpu/構(gòu)架文件夾/start.S 文件開端執(zhí)行.
start.S:?jiǎn)?dòng)代碼,負(fù)責(zé)異常向量表界說(shuō),初始化CPU時(shí)鐘,存儲(chǔ)器配置,堆棧配置,復(fù)制代碼到內(nèi)存中,跳到到C代碼階段.
3.2 start.S闡發(fā)
以xyd2440為例子闡發(fā)
進(jìn)口文件:start.S (cpu\arm920t)? .
事情內(nèi)容:
1.? ? ? ? 異常向量表界說(shuō)
2.? ? ? ? 關(guān)看門狗
3.? ? ? ? 關(guān)中斷
4.? ? ? ? 設(shè)置裝備擺設(shè)時(shí)鐘
5.? ? ? ? 配置存儲(chǔ)器節(jié)制器
6.? ? ? ? 設(shè)置裝備擺設(shè)棧
7.? ? ? ? 復(fù)制代碼到內(nèi)存
8.? ? ? ? 清BSS段
9.? ? ? ? 跳轉(zhuǎn)到C代碼執(zhí)行.
3.2.1 彌補(bǔ):GNU 匯編知識(shí)
1)可以使用C的辦法包含C語(yǔ)言頭文件,例如:
2).globl 關(guān)鍵字:聲明一個(gè)全局的標(biāo)號(hào),全局標(biāo)號(hào),其他可見,可以使用這個(gè)標(biāo)記.
.globl _start? :把_start標(biāo)號(hào)聲明為全局的,其他的文件 ,C,鏈接文件,其他匯編文件都可見.
?
3)標(biāo)號(hào)定義: “標(biāo)號(hào):” ,如: _start: ,定義一個(gè)_start標(biāo)號(hào).一個(gè)標(biāo)號(hào)代表一個(gè)地址.
4).balignl關(guān)鍵字:在當(dāng)前位置以指定對(duì)齊方式存放數(shù)字.
? .balignl 16,0xdeadbeef? 在當(dāng)前代碼所在的地址開始找到第一個(gè)16的整數(shù)倍地址存放0xdeadbeef
5).word關(guān)鍵字:在當(dāng)前位置存放一個(gè)數(shù)值.如:
_TEXT_BASE:
?.word?TEXT_BASE
代表在當(dāng)前地址存放 TEXT_BASE 所代表的數(shù)值.
6)可以使用C語(yǔ)言的預(yù)處理功能.
#if defined(CONFIG_xyd2440_LED_DEBUG)
…..
#endif
上面代碼意思是如果定義了CONFIG_xyd2440_LED_DEBUG宏,就編譯其中包括的代碼段.
#define S_FRAME_SIZE?72
#define S_OLD_R0?68
上面使用C語(yǔ)言的宏界說(shuō)功能界說(shuō)數(shù)值.
7)? 注釋:和C語(yǔ)言一樣.同時(shí)支持使用@注釋.? 可用:// ,? /*? */,? @
8)匯編代碼專用宏界說(shuō):以 .macro 開頭 后接宏名,中間宏代碼,最后是 .endm 做為結(jié)束.
?.macro?bad_save_user_regs
?sub?sp, sp, #S_FRAME_SIZE
?stmia?sp, {r0 - r12}? ?@ Calling r0-r12
?ldr?r2, _armboot_start
?sub?r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
?sub?r2, r2, #(CFG_GBL_DATA_SIZE+8)? @ set base 2 words into abort stack
?ldmia?r2, {r2 - r3}? ?@ get pc, cpsr
?add?r0, sp, #S_FRAME_SIZE? @ restore sp_SVC
?add?r5, sp, #S_SP
?mov?r1, lr
?stmia?r5, {r0 - r3}? ?@ save sp_SVC, lr_SVC, pc, cpsr
?mov?r0, sp
?.endm
9) .align關(guān)鍵字: 控制代碼對(duì)齊方式
ARM的.align 5便是2的5次方對(duì)齊,也便是4字節(jié)對(duì)齊,
3.3 闡發(fā) :
//異常向量表定義
.globl _start? //把 _start 聲明為全局標(biāo)號(hào)? ? ? ? ? ? ? ?
_start:?b? start_code? ? ? ? ? ? //第1條指令,復(fù)位異常
?ldr?pc, _undefined_instruction //未定義異常
?ldr?pc, _software_interrupt? ? //軟中斷異常
?ldr?pc, _prefetch_abort? ? ? ? //預(yù)取指中止異常
?ldr?pc, _data_abort? ? ? ? ? ? //數(shù)據(jù)中止異常
?ldr?pc, _not_used
?ldr?pc, _irq? ? ? ? ? ? ? ? ? //IRQ中斷異常
?ldr?pc, _fiq? ? ? ? ? ? ? ? ? //FIQ中斷異常
_undefined_instruction:?.word undefined_instruction
_software_interrupt:?.word software_interrupt
_prefetch_abort:?.word prefetch_abort
_data_abort:? .word data_abort
_not_used:? .word not_used
_irq:? ?.word irq
_fiq:? ?.word fiq
當(dāng)整個(gè)u-boot流程走完之后,就真正進(jìn)入linux的啟動(dòng)體系了.
所以,如果對(duì)u-boot整理流程通過(guò)軟件來(lái)認(rèn)識(shí)一邊的話,就完全知道linux在啟動(dòng)時(shí),干了哪些事.就像window啟動(dòng)時(shí),會(huì)呈現(xiàn)一些信息,告訴你當(dāng)前執(zhí)行到哪里,執(zhí)行了什么事,一目了然.
本文永遠(yuǎn)更新鏈接地址:
《LINUX實(shí)戰(zhàn):u-boot 1.3.4源碼分析詳細(xì)教程》是否對(duì)您有啟發(fā),歡迎查看更多與《LINUX實(shí)戰(zhàn):u-boot 1.3.4源碼分析詳細(xì)教程》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/10530.html