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