国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

電子工程網

標題: 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)
其中,callmake的內置函數,用于調用用戶自己定義的帶有參數的函數,這里調用的是if_changed,參數是link-vmlinux
if_changedscripts/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_INITKBUILD_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.olib.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精品免费观看不卡 | 欧美日韩第一区 | 天天操天天摸天天干 |