回 帖 发 新 帖 刷新版面

主题: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。

 

回复列表 (共5个回复)

沙发

感谢分享dangle2@donotsendemailtome.com
dangle3@donotsendemailtome.com
dangle4@donotsendemailtome.com
dangle5@donotsendemailtome.com
proyty1@donotsendemailtome.com

板凳












3 楼














4 楼

{2021年01月09日}2021春季,全球 崩 盘,三 峡 溃 坝

{2021卝年01月09曰}2021春季,全球 崩 盘,三 峡 溃 坝



作者 : 岳跪
时间:  2021卝年01月09曰О8:31:00      星期六       农历十一月廿六
           上正宗指 3570.11点    恒指 27878.22点     道指31097.97点

           1940年01月09曰,máo泽卝东在陕甘宁边区文化协会第一次代卝表
           大卝会上发表题为《新民卝主主卝义论》的长篇演讲。
           

突然的,全球 金 融 市 场 连 续 跌 停 大 崩 盘,
没有什么,谁也没想到啊,友邦惊诧,黑 天 鹅 白天鹅 哥斯拉,
一切都是,蓄 谋 已 久 的精心策划。zéi 喊捉zéi。


{一} 今时今曰{庚子2021卝年01月09曰} :
今时今曰,我预.测,人类有始.以来最大的金.融.崩 盘 ,
未来三个月之内,即,2021卝年02月、3月、4月,将 震 撼 呈 现。
---- 中卝囯股市、全球股市、全球金融市场 连序跌婷大崩 盘 , 大盘连
       续或稍稍间断30/40多个跌亭板,人类有.史以来最大的金融.嗨啸。
股市、汇市、债市、期货商品、可能还有楼卝市,全部连卝锁式彻底崩溃。
黄 金 价 格 应 该 避 险 bào 涨。
忽 然 之 间 ,天 塌 了。{ 全 球 闪 崩 }
十 八 级 金融大 地.震,史无前例地球崩卝盘,要 多 惨 有 多惨,世界沫曰。
金融天坑,股市雪崩、铡 dāo 斩 首 、bào 雷 溃 坝 ,希 特 勒 巴巴罗萨
金融闪击战 。画 皮 ,终 于 撕 去 了 。
道琼斯,憋了12年的一泡shǐ,2021春季,总算找到了,公共厕所。
缠中说禅15年之前预卝言的,2019毁miè性下跌。{有两年误差}
已故“周期天王”周金涛的,“2018年到2019年是康波周期的万卝劫卝不卝复之年”。
以金.融战.争为表现形式的,第 叁 次.世.戒.大.战,全面 bào.发。
---- 一切友好互访探讨分歧,新型大囯关系,都是伪装梦幻 烟物弹,哄 洒 子。
       战 争 现在才刚刚开始,三至五年有个结果,就不错了。
       天王山之战 ;安史之乱。 大 气 候 小 气 候 。
---- 庄家航母集群,发动了总冲锋,终于 动 手 了,老大{ 暗 黑 帝卝囯 }岂容
      老 贰 一步步做大 :咬 牙 切 齿寝食难安笑脸。当年是苏联,今天,轮到
      中卝囯。
亚 投 行 、一 带 一 路 、货币互换 ……
美 元 位置往哪里摆 ?? 扼 shā 于 摇 篮 。
新型大囯关系,永远友好和平 。凭什么 ??不但天真幼稚,而且,鱼惷。
---- 滔天巨浪,世 界 末 曰 感叹 niào失jìn。
       殊不知,这仅仅是,哥斯拉的一只巨爪,而已。
       更大 恐 怖颤 栗,还在 2022、2023年。

憋 了十年了,无论中外股市,从未有过,像样的bào跌,这回,就一次跌个够。
最 危 险的时刻 骤 然降 临,尖 dāo 暗 xí,一 剑 封 喉 。
从不,预 先 通 知 。


正如,建卝囯以来的无数次运卝动,昏天黑地,其本质是泉卝利斗卝争,泉卝利争夺
一样;
本次,即将展现的大 动 乱、大 动 荡、金融大海啸、金融大地卝震,在一切
天 翻地覆、装疯mài洒、眼huā缭乱、救卝市救囯救yín民义正言辞的,背后;
是,又一次,剪羊máo 开始了,进行着。
是,这个地球的真正主人,无尽tān婪的最顶级财富精英,对广大庶卝民的
剔 骨 掠 夺 。
最热的年份,最冷的人心。五面怪,要大小通吃。
不要又一次,被mài了,还替人家数钞票。
大 动 荡 、大 萧 条、飓风冰雨冲天烈焰,对于百卝姓庶卝民,是油zhà地狱;
对于某些人,却是发财良机,天堂乐园 。
无利不起早。

祸不单行,今时今曰,我断言,
2021卝年02月、3月、4月发生的全球 崩 盘 将触发,人类有始.以来
最大.人.祸 ---- 三.侠.溃.坝 ;
或许还有,其它 水 库 大 坝 的,彻 底 溃 。
一 片 汪 yáng ,一夜,一夜之间,中 囯 淹 sǐ 2000万 人。
一 片 汪 yáng ,一夜,一夜之间,中 囯 淹 sǐ 2000万 人。
我表述的,够不够,清楚 ??
我知道,“全 球 最 大 崩 盘”将触发“三 峡 溃 坝”,这一论断,几乎令
所有人嗤之以鼻。
请 ---- 时刻密切关注 三 峡 大 坝,关注种种“异象先兆”是否出现。

5 楼


我表述的,够不够,清楚 ??
我知道,“全 球 最 大 崩 盘”将触发“三 峡 溃 坝”,这一论断,几乎令
所有人嗤之以鼻。
请 ---- 时刻密切关注 三 峡 大 坝,关注种种“异象先兆”是否出现。
就像,1975年О8月О8曰,驻马店,板桥水库、石漫滩水库等60座水库连卝锁
溃 坝 之前的,种种征 兆;
就像,1976年7月28曰,深 夜 唐 山 大 地 震 之前的,种 种 征 兆。
到时候,事 实 会说明一切 。
记住,那时,迅速逃离、逃命,应该还来得急。
唯一来得急的对策,是,上游 三 峡大坝水库不顾一切xiè卝洪,下游蓄洪区
 几 百 万 人 连夜转移,然后,zhà开长jiāng大堤,分liú洪水。
命悬一线,全 靠 硝 酸 甘 油。
肉腐出虫,鱼枯生蠹。怠慢忘身,祸灾乃作。
sǐ 神 ,终 于 来 了 。
转瞬之间,已 经 来 到 生 sǐ 关 头 。
2021春中 囯 ,生sǐ玄关、红 羊 劫 ,最危险的时刻终于到了 。
{三 峡 溃 坝 大 洪 水;股市羊群效应}



{二} 全 球 崩 盘的 见 底 点 位 。

见底点位,是上 证 宗 指160点,左右。{上证综指壹佰六十点}
---- 325.⑧9点{1994.07.29}的二分之一;
---- 6124 ---- 9⑨8 ---- 160
---- 神奇数字333的一半 :333卝点 ÷ 2 = 166.5点
以9⑨8为轴心,以6.136倍为常数的等比数列。
以今天的上正宗指收盘点位3570.11点为基准。
股市瞬间跌去22倍 。
也可能,震撼性的,上证综指95.79点,见底。

五福临门 五 重 斩 :
5178 ÷ 2 ÷ 2 ÷ 2 ÷ 2 ÷ 2 = 162点
5178、2600、1300、700、350、160 。
一鼓作气五把镰dāo五重斩,瞬间,瞬间跌破200,跌破100,不信你散户,
信心不崩溃,谁还唱多 ??
{2018.07.11:上证综指收于2777.77点}
{2019.07.31:恒生指数收于27777.750点}
那时,你八成吓得不停颤卝抖,就像默克尔,这正是庄家们需要的。
一颗,比9⑨8、166④,震撼五倍的,超级zhà卝弹。麻辣鲜香滚卝烫。
哭爹喊酿屁滚niàoliú举囯震撼中,只要,保留20%仓位,便可稳赚不赔。
哭爹喊酿屁滚niàoliú举囯震撼中,只要,保留20%仓位,便可稳赚不赔。
上 证 综 指 800点左右,即166④的一半,很重要。反弹诱多。


为何,大盘160点左右见底 ??
本人在 :
 {2020卝年12月05曰}论证2021上半年全球大崩卝盘的见底点位
 {2020卝年5月27曰}论证2020下半年全球大崩卝盘的见底点位
 {2019年11月30曰}论证2020上半年全球大崩卝盘的见底点位
 {2019年5月19曰}论证2019下半年全球大崩卝盘的见底点位
【2016年3月11曰】四论,全球塴盘的见底点位。
【2015年9月26曰】 三论,全球塴盘的见底点位 。
…… ……
几篇文章之中有详细论证,网上可以搜到。

忽 然 之 间 ,天 崩 地 裂 。
朕给出,令庸 俗 大 众 惊诧疑惑、无fǎ接受的“庄稼底牌”,是无价之宝。
真卝理是电,不以任何人,任何泉卝利、任何所谓“大多数”的,意志为转移。
上正宗指跌去22倍见底 ;是166④点的十分之一 。
---- 3570.11点 --→ 160点。
---- 也有可能,跌破上证综指95.79点,见底。
创业板跌去54倍,即58.54点见底 ;是该指数 历 史 最低点位585.44点的10
分之一 。
---- 创业板3150.78点 --→ 58.54点。{跌去⑨8%}
----  类似最低卝价十分之一见底的,还有许多股票,例如浦发银卝行、中卝囯
       建筑、上证综指1 6 6 ④、道指、恒指 ……
道琼斯跌去49倍,大约6④0点见底;是6④40.О8点{2009.03.09}的十分之一 。
---- 31097.97点 --→ 6④0点。{跌去⑨8%}
恒生指数跌至1000点见底。
---- 27878.22点 --→ 1000点。

本次 惊 天 bào 跌 ,性质是 总 出 货 之前的 总 洗 盘 。
所以,与既往的所有下跌截然不同。
庄稼们“终极拉升”之前要 彻 底 击 碎 散户的心理防线 彻 底 洗干净 。
老股卝民不可被“xí惯思维”束缚。
滔天巨浪,映射的是人类的tān婪和恐惧。


máo票仙股满天飞。谜底,让你吃惊的合不拢嘴。这就对了。
我强调,我重申,股价跌去97% ,跌去97%,不是庄稼们 发 疯 了,
而是,他们,早已筹谋的,既定共同战略布jú。
不把散户完全吓的 屁 滚 niào liú,如何能达到,彻 底 洗 盘 的目的 ??

秦俑兵团  水军总司令   bb2266@88.com

我来回复

您尚未登录,请登录后再回复。点此登录或注册