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