電子工程網
標題: Arm linux 內核構建 [打印本頁]
作者: ludi 時間: 2017-11-15 11:26
標題: Arm linux 內核構建
一、概述
本文基于Linux Kernel 4.10版本講解。
Linux內核采用類似于GNU Make的kbuild構建而成,關于內核的構建系統kbuild,可以先看本公眾號內以前的文章:
Kbuild結構簡介
arm linux 內核的構建分為三次編譯鏈接,一次組合。三次鏈接的中間結果分別是:
1.arch/arm/boot/compressed/vmlinux
2.arch/arm/boot/vmlinux.bin
3.arch/arm/boot/setup.bin
最后的組合就是將vmlinux.bin和setup.bin組合成arch/arm/boot/zImage:
二、vmlinux的構建
vmlinux的構建在頂層的Makefile中:
cmd_link-vmlinux = \
$(CONFIG_SHELL) $<$(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) ; \
$(if $(ARCH_POSTLINK), $(MAKE) -f$(ARCH_POSTLINK) $@, true)
vmlinux: scripts/link-vmlinux.sh vmlinux_prereq$(vmlinux-deps) FORCE
+$(callif_changed,link-vmlinux)
其中,call是make的內置函數,用于調用用戶自己定義的帶有參數的函數,這里調用的是if_changed,參數是link-vmlinux。
if_changed是scripts/Kbuild.include里定義的一個函數,定義如下:
if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
@set -e; \
$(echo-cmd) $(cmd_$(1)); \
echo 'cmd_$@ :=$(make-cmd)' > $(dot-target).cmd)
any-prereq檢查是否有依賴比目標新,或者依賴還沒有創建;arg-check檢查編譯目標的命令相對上次是否發生變化。set –e 命令表示make出錯時直接退出,加個@符號表示不顯示該set命令。cmd_$(1)中的1表示傳給if_changed的第一個參數。嵌入式物聯網智能硬件企鵝意義氣嗚嗚吧久零就易,在這里傳給if_changed的實參是link-vmlinux,所以cmd_$(1)展開后為cmd_link-vmlinux。
注意cmd_link-vmlinux中的$<表示規則中的第一個依賴,即scripts/link-vmlinux.sh。這個腳本用于vmlinux的鏈接,內容如下:
# Link of vmlinux
# ${1} - optionalextra .o files
# ${2} - output file
vmlinux_link()
{
locallds="${objtree}/${KBUILD_LDS}"
local objects
if [ "${SRCARCH}" !="um" ]; then
if [ -n"${CONFIG_THIN_ARCHIVES}" ]; then
objects="--whole-archivebuilt-in.o ${1}"
else
objects="${KBUILD_VMLINUX_INIT} \
--start-group \
${KBUILD_VMLINUX_MAIN} \
--end-group \
${1}"
fi
${LD} ${LDFLAGS}${LDFLAGS_vmlinux} -o ${2} \
-T ${lds} ${objects}
else
... ...
fi
}
如果平臺不是“um”,就將變量KBUILD_VMLINUX_INIT和KBUILD_VMLINUX_MAIN中的目標文件鏈接為vmlinux;否則就直接編譯為vmlinux,也就是式中的${2}。
接下來以core-y來分析變量KBUILD_VMLINUX_MAIN:
Linux-4.10/Makefile:
exportKBUILD_VMLINUX_INIT := $(head-y) $(init-y)
exportKBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y) $(virt-y)
exportKBUILD_LDS :=arch/$(SRCARCH)/kernel/vmlinux.lds
… …
core-y := usr/
… …
core-y += kernel/ certs/ mm/ fs/ ipc/security/ crypto/ block/
… …
core-y := $(patsubst %/, %/built-in.o,$(core-y))
make 的內置函數patsubst用于查找模式匹配的字符串,并進行替換。在上面這句語句里,就是將所有‘/’替換成‘/built-in.o’。因此core-y最終變為:
core-y :=user/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.osecurity/ built-in.o crypto/ built-in.o block/ built-in.o
再看其他幾個類似的賦值語句:
init-y := $(patsubst %/,%/built-in.o, $(init-y))
drivers-y :=$(patsubst %/, %/built-in.o, $(drivers-y))
net-y := $(patsubst %/,%/built-in.o, $(net-y))
libs-y1 := $(patsubst %/, %/lib.a,$(libs-y))
libs-y2 := $(patsubst %/, %/built-in.o,$(libs-y))
libs-y := $(libs-y1) $(libs-y2)
virt-y := $(patsubst %/,%/built-in.o, $(virt-y))
不難看出,vmlinux就是由這些目錄下的built-in.o和lib.a鏈接而成。
vmlinux的另一個依賴是vmlinux-deps,其構建規則也在頂層Makefile中定義:
Linux-4.10/Makefile:
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y)$(init-m) \
$(core-y) $(core-m) $(drivers-y)$(drivers-m) \
$(net-y) $(net-m) $(libs-y) $(libs-m)$(virt-y)))
vmlinux-deps :=$(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
… …
# The actual objectsare generated when descending,
# make sure noimplicit rule kicks in
$(sort$(vmlinux-deps)): $(vmlinux-dirs) ;
… …
$(vmlinux-dirs):prepare scripts
$(Q)$(MAKE) $(build)=$@
目標vmlinux-deps的構建規則下沒有命令可執行,只依賴于另外一個目標vmlinux-dirs, 該變量的賦值語句里的filter表示過濾掉不以‘/’結尾的字符串。而filter的這些輸入變量,如core-y,其子目錄都是以‘/’結尾。因此vmlinux-dirs是一個多目標規則,相當于:
init: prepare scripts
$(Q) $(MAKE) $(build) =$@
kernel: preparescripts
$(Q) $(MAKE) $(build) =$@
… …
規則中的命令展開為:
Make –f script/Makefile.buildobj=$@
Make的自動變量$@表示規則的目標,這里就是要構建的子目錄init,kernel等。
總結一下,kbuild依次構建Makefile中指定的子目錄,生成built-in.o、lib.a等文件,然后鏈接為vmlinux。
歡迎光臨 電子工程網 (http://m.qingdxww.cn/) |
Powered by Discuz! X3.4 |
主站蜘蛛池模板:
恐怖星球在线观看完整版免费
|
一本大道香焦在线视频
|
国产在线观看高清精品
|
婷婷久久综合九色综合98
|
日韩精品亚洲人成在线观看
|
婷婷尹人香蕉久久天堂
|
欧美日韩亚洲综合在线一区二区
|
国产极品一区
|
日韩毛片最新看
|
欧美国产日韩在线
|
九色精品视频在线观看
|
欧美一区二区三区不卡视频
|
四虎影视永久费观看在线
|
一级成人|
两个人免费观看高清在线
|
久久精品国产福利国产秒
|
中文字幕一区二区在线视频
|
天天靠天天擦天天摸
|
天堂最新版资源www在线
|
亚洲精品高清国产一久久
|
欧美另类69xxxxx 视频
|
淫插|
日本中文在线观看
|
第一福利在线观看
|
99视频在线免费看
|
天天做天天爱天天影视综合
|
久久精品国产亚洲麻豆小说
|
四虎黄色影视库
|
一级特黄aaa大片大全
|
亚洲成人福利
|
精品久久久久久免费影院
|
青青草华人在线视频
|
久久成人免费播放网站
|
国产精品99久久免费黑人
|
欧美日韩国产一区三区
|
国产精品综合一区二区三区
|
黄色片在线免费观看视频
|
狼伊千合综网中文
|
国产大片91精品免费观看不卡
|
欧美日韩第一区
|
天天操天天摸天天干
|