u-boot分析之编译体验(零)
目錄
u-boot分析之編譯體驗
1. 嵌入式系統與pc系統的啟動對比概述
2.如何應用補丁文件生成uboot.bin文件,步驟:
3. uboot里要實現的功能
3.1 uboot最終目的是啟動內核
3.2 為達到最終目的uboot要實現的功能(核心目的):
3.3 雖然uboot最終目的是啟動內核,但是在開發階段我們想增加更多的功能方便開發(次要目的):
4.u-boot功能,結構,結合Makefile進行分析
4.1.分析配置過程make 100ask24x0_config 命令
4.2.分析編譯過程make all命令
u-boot分析之編譯體驗
?
1. 嵌入式系統與pc系統的啟動對比概述
2.如何應用補丁文件生成uboot.bin文件,步驟:
①解壓縮? ? ??
? ? ? ? ? ? tar -xjvf u-boot-1.1.6.tar.bz2
②打補丁? ? ?
? ? ? ? ? ? cd u-boot-1.1.6/
? ? ? ? ? ??patch -p1 < ../u-boot-1.1.6_jz2440.patch? //patch -p? <? ../補丁文件
③配置
? ? ? ? ? ? make 100ask24x0_config
④編譯
? ? ? ? ? ? make all
在編譯得到u-boot.bin文件之后,我們就可以將文件下載到開發板nor flash上去,啟動板子串口3秒內按任意鍵輸出界面如下,出現的命令菜單選項并非uboot自帶,而是后續添加上去的,如何添加命令菜單后續有介紹。uboot支持很多的命令,輸入'q'退出菜單模式,進入命令行模式,在命令行輸入?或者help查看支持的所有命令。特別的,輸入menu回到菜單模式。菜單的功能是通過usb(usb device線)下載uboot,內核,文件系統。
3. uboot里要實現的功能
3.1 uboot最終目的是啟動內核
1.從flash讀出內核放到sdram
2.啟動內核
3.2 為達到最終目的uboot要實現的功能(核心目的):
1.關看門狗
2.初始化時鐘(開發板上電,時鐘的運行頻率是12M,2440最大的頻率是400M)
3.初始化SDRAM
4.從讀Flash讀出內核
5.啟動內核
其中1,2,3等步是硬件相關初始化。
3.3 雖然uboot最終目的是啟動內核,但是在開發階段我們想增加更多的功能方便開發(次要目的):
1.初始化串口
2.燒寫flash(這樣就可以通過網絡,串口下載將uboot,kenel,filesystem下載到flash上去)
3.網卡,usb等等
4.u-boot功能,結構,結合Makefile進行分析
4.1.分析配置過程make 100ask24x0_config 命令
1.在uboot頂層目錄下的makefile中搜索100ask24x0_config 結果如下
100ask24x0_config ? : ? unconfig
100ask24x0_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0MKCONFIG定義為
MKCONFIG ? ?:= $(SRCTREE)/mkconfig所以輸入make 100ask24x0_config命令相當于執行:
./mkconfig? ?100ask24x0? ?arm? ?arm920t? ?100ask24x0? ?NULL? ? s3c24x0
#? ?$0? ? ? ? ? ? ? $1? ? ? ? ? ? ?$2? ? ? ?$3? ? ? ? ? ? ? ? $4? ? ? ? ? ? ??$5? ? ? ? ?$6
mkconfig的作用,在mkconfig文件開頭第六行給出了它的用法:
06 # Parameters: Target? ?Architecture? ?CPU? ?Board? ?[VENDOR]? ?[SOC]
分步驟分析mkconfig的作用:
(1)確定開發板名稱BOARD_NAME
? ? ?BOARD_NAME等于$1
(2)創建到平臺/開發板相關的頭文件的鏈接
? ? ? ln -s asm-$2 asm
? ? ? ln -s arch-$6?asm-$2/arch
? ? ? ln -s proc-armv asm-$2/proc? ? ? ??#如果$2不是arm的話,此行沒有
(3)創建頂層Makefile包含的文件include/config.mk,內容追加為:
? ? ? ? ARCH ? = $2
? ? ? ??CPU ? ?= $3
? ? ? ? BOARD ?= $4
? ? ? ? VENDOR = $5? ? ? ? ? ? ? ? ? ?#$5為空,或者是NULL的話,此行沒有
? ? ? ??SOC ? ?= $6? ? ? ? ? ? ? ? ? ? ? ? #$6為空,或者是NULL的話,此行沒有
(4)創建開發板相關的頭文件include/config.h,內容追加為:
/* Automatically generated - do not edit */
#include <configs/100ask24x0.h>
從這4個結果可以知道,如果要在board目錄下新建一個開發板<board_name>的目錄,則在include/configs目錄下也要建立一個文件<board_name>.h,里面存放的就是開發板<board_name>的配置信息。
-----------------------------------------------------------------------------------------------------------------------
擴展:?Shell腳本中$?、$!、$$、$*、$#、$@、$-、$0、$1~$n等的意義說明
$?
最后運行的命令的結束代碼(返回值)。
$!
Shell最后運行的后臺Process的PID(后臺運行的最后一個進程的進程ID號)。
$$
Shell本身的PID(ProcessID,即腳本運行的當前進程ID號)。
$*
所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數,此選項參數可超過9個。
$#
添加到Shell的參數個數。
$@
所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。$@ 跟$*類似,但是可以當作數組用。
$-
顯示shell使用的當前選項,與set命令功能相同。
$0
Shell本身的文件名。
$1~$n
添加到Shell的各參數值。$1是第1參數、$2是第2參數…。
-----------------------------------------------------------------------------------------------------------------------
4.2.分析編譯過程make all命令
1.incldue $(OBJTREE)/include/config.mk
2.ifeq($(ARCH),arm) CROSS_COMPLIE = arm-linux-
3.include $(TOPDIR)/config.mk
4.OBJS、OBJS、LIBS等變量:
OBJS = cpu/arm920t/start.o
OBJS = lib_genertic/libgeneric.a
LIBS+=board/100ask24x0/lib100ask24x0.a
LIBS+=cpu/arm920t/libarm920t.a
5.在執行make 的時候如果不指定目標,他就執行第一個目標
? ? ? ?(1)? all: $(ALL)? ? ? ? ? ? ? ? # all依賴于ALL
? ? ? ?(2)? ALL = (obj)u?boot.srec(obj)u-boot.bin(obj)System.map(U_BOOT_NAND)
? ? ? ?(3)? 我們的目的是生成u-boot.bin
? ? ? ?(4)? (obj)u?boot.bin:(obj)u-boot? ? ? ?#u-boot.bin又依賴于elf格式的u-boot
? ? ? ?(5) (obj)u?boot:dependversion(SUBDIRS) (OBJS)(LIBS)$(LDSCRIPT)……? ?#u-boot又依賴于OBJS,?LIBS,鏈接腳本等
6.不想那么麻煩的分析makefile,可以輸入make命令后查看最后面的打印信息
7.通過查看打印信息,可以看到這樣一句話。arm-linux-ld -Bstatic -T /work/sysytem/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33f80000 $UNDEF_SYM cpu/arm920t/start.o #鏈接的時候依賴兩個東西,原材料和鏈接腳本。鏈接腳本指示映像文件的組織結構。
8.分析u-boot.lds文件(.=0x00000000 0x00000000要加上0x33f80000=uboot運行地址)一開始運行的文件是cpu/arm920t/start.o文件
9.鏈接地址(運行地址)由連接文件board/100ask24x0/u-boot.lds和board/100ask24x0/config.mk TEXT_BASE共同指定,TEXT_BASE在頂層目錄的config.mk LDFLAGS中被引用。
?
轉載:https://blog.csdn.net/wenxiHuang/article/details/72510243
總結
以上是生活随笔為你收集整理的u-boot分析之编译体验(零)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u-boot分析之启动简介(一)
- 下一篇: u-boot分析之小结(六)