Exynos4412 Uboot 移植(一)—— Uboot 编译流程分析
Uboot 所用版本 u-boot-2013.01
? ? ? u-boot-2013.01 中有上千文件,要想了解對(duì)于某款開(kāi)發(fā)板,使用哪些文件、哪些文件首先執(zhí)行、可執(zhí)行文件占用內(nèi)存的情況,最好的方法就是閱讀它的Makefile。
根據(jù)頂層Readme文件的說(shuō)明:
可以知道如果使用開(kāi)發(fā)板board/<board_name>,就先執(zhí)行“make <board_name>_config”命令進(jìn)行配置,然后執(zhí)行“make all”,?就可以生成如下3個(gè)文件:
U-Boot.bin:二進(jìn)制可執(zhí)行文件,它就是可以直接燒入eMMC中的文件。
U-Boot?: ELF格式的可執(zhí)行文件。
U-Boot.srec : 摩托羅拉格式的可執(zhí)行文件。
? ? ? ? 對(duì)于Exynos4412開(kāi)發(fā)板,這里用的其實(shí)是Fs4412,執(zhí)行“make fs4412_config"、“make all"后生成的u-boot-fs4412.bin可以燒入eMMC中執(zhí)行。
一、U-Boot 配置過(guò)程
1、在頂層Makefile中可以看到如下代碼:
假定在u-boot-2013.01的根目錄下編譯,則其中的MKCONFIG 就是根目錄下的mkconfig文件(mkconfig是shell腳本文件)。
%_config是GUNmake語(yǔ)法層,表示的是所有以".config"結(jié)尾的文件。$(@:_config=)的結(jié)果就是將“fs4412"中的“——config”去掉,結(jié)果為fs4412。
MKCONFIG 就是執(zhí)行mkconfig。
所以 “make fs4412_config"實(shí)際上就是執(zhí)行如下命令:
./mkconfig fs4412 arm armv7 fs4412 samsung exynos
2、mkconfig 的作用
前面已經(jīng)提到,mkconfig就是一shell腳本, 具體作用如下:
a -- 解析boards.cfg fs4412相關(guān)數(shù)據(jù)
這是我們自行添加的.確定開(kāi)發(fā)板名稱BOARD_NAME。
b -- 針對(duì)平臺(tái)作了一系列鏈接,創(chuàng)建到平臺(tái)、開(kāi)發(fā)板相關(guān)的頭文件的鏈接。
c --創(chuàng)建頂層Makefile包含的文件 include/ config.mk
inlucde / config.mk 內(nèi)容如下:
d -- 創(chuàng)建開(kāi)發(fā)板相關(guān)的頭文件inlucde/config.h
Include/config.h導(dǎo)出結(jié)果如下:
? ? ? U-Boot 還沒(méi)有類似Linux一樣的可視化配置界面(比如使用 make menuconfig 來(lái)配置),要手動(dòng)修改配置文件 inlucde/config/<board_name>.h 來(lái)裁剪、設(shè)置U-Boot.
配置文件中有以下兩類宏。
1) 一類是選項(xiàng)(Options),前綴為“CONFIG”,它們用于選擇CPU、SOC、開(kāi)發(fā)板類型,設(shè)置系統(tǒng)時(shí)鐘、選擇設(shè)備驅(qū)動(dòng)等。
2)另一類是參數(shù)(Setting),前綴為“CFG_”,它們用于設(shè)置malloc緩沖池的大小、U-Boot 下載文件時(shí)的默認(rèn)加載地址、Flash的起始地址等。
uboot 執(zhí)行通過(guò)宏來(lái)判斷:宏在頭文件中定義。
#ifdef CONFIG_TEST
run_test();
#endif
某頭文件
#define CONFIG_TEST
可以這樣認(rèn)為,“CONFIG_”除了設(shè)置一些參數(shù)外,主要用來(lái)設(shè)置U-Boot的功能、選擇使用文件中的哪一部分;而“CFG_”用來(lái) 設(shè)置更細(xì)節(jié)的參數(shù)。
二、U-Boot 的編譯、鏈接過(guò)程
?配uboot 編譯通過(guò)Makefile來(lái)判斷:
obj-y += xx.o xx.o ?在編譯時(shí),只編譯obj-y
? ? ? ? obj-$(CONFIG_XX) = xx.o xx.o 如果CONFIG_XX為y,則此文件會(huì)被編譯進(jìn)u-boot.bin置完后,執(zhí)行“make all” 即可編譯:
找第一個(gè)目標(biāo)all:
上面代碼是對(duì)u-boot進(jìn)行格式轉(zhuǎn)換,變成二進(jìn)制bin格式之后,再加一些校驗(yàn)與4412開(kāi)如平臺(tái)加密信息。
依賴u-boot:
先總結(jié)一下U-Boot 的編譯流程:
a -- 首先編譯 cpu /$(CPU)/start.S,對(duì)于不同的CPU,還可能編譯 cpu/$(CPU)下的其他文件;
b -- 然后,對(duì)于平臺(tái)/開(kāi)發(fā)板相關(guān)的每個(gè)目錄、每個(gè)通用目錄都使用它們個(gè)字的Makefile生成相應(yīng)的庫(kù);
c -- 將a、b 步驟生成的.o .a文件按照 board / $(BOARDDIR)/config.mk文件中指定的代碼段起始地址、board/$(BOARDDIR)/config.mk文件中指定的代碼段起始地址、board/$(BOARDDIR)/U-Boot.lds鏈接腳本進(jìn)行鏈接。
d -- 第c步得到的是ELF格式的U-Boot,后面的Makefile還會(huì)將它轉(zhuǎn)換成二進(jìn)制格式、S-Record格式。
總結(jié)
以上是生活随笔為你收集整理的Exynos4412 Uboot 移植(一)—— Uboot 编译流程分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux 文件系统与设备文件系统 (一
- 下一篇: 【转】Asp.net控件开发学习笔记整理