我们首先看下vmlinux的规则定义如图3.1,它的依赖除了FORCE以外还有三个,scripts/link-vmlinux.sh是一个用于链接的脚本,我们将在具体讲到该部分内容时再详细分析它。

                                    图3.1
    vmlinux_prereq的定义如图3.2,仔细一看它的依赖vmlinux-deps就是vmlinux的另一个依赖。除此之外它还有三个命令,但它们都是在配置了某些选项后才会执行的,与我们构造普通的vmlinux没有什么关系,故这里不再展开。

                                    图3.2
    最后我们来看第三个依赖vmlinux-deps,它的定义如图3.3。它包含了三部分,KBUILD_LDS是其链接脚本,该脚本在每个架构下是不同的,主要是用于定义链接时的规则,比如各个段的布局等
    KBUILD_VMLINUX_INIT为初始化相关的目标,如在arm64架构下head-y目标的定义位于arch/arm64/kernel/Makefile中,其值为head.o,我们都知道linux的入口函数就定义在head.S中,它既是head.o的源文件。至于怎么使head.o成为vmlinux的入口,其实就是KBUILD_LDS定义的链接脚本里定义的。init-y的定义在顶层makefile中,根据图3.4和图3.5可知,其值为init/built-in.o,我们知道该目标就是子目录目标,会由makefile.build脚本进入该目录,然后包含进该目录下的makefile,并递归编译生成最终的built-in.o。

                                    图3.3
    KBUILD_VMLINUX_MAIN中各变量的定义同样如下图3.4和3.5,它们都是kernel源码下的一级子目录。同样这些目录下的Makefile会被makefile.build递归调用,并最终根据配置生成相应的目标文件以及built-in.o。除了libs-y,它由两个部分lib.a和built-in.o。

                        图3.4

                                图3.5
    我们再看下vmlinux-deps的依赖,如图3.6所示它依赖于vmlinux-dirs。

                            图3.6
    其中vmlinux-dirs的定义位于图3.5中,它们就是将诸如init/,core/等目录最后的/去掉后的值。我们再看下vmlinux-dirs的规则如图3.7:

                            图3.7
    它依赖于prepare和scripts,prepare目标是由一个多层次的依赖关系构成的。其中数字大的prepare是数字小的prepare的依赖,它们的关系如图3.8所示。它们主要为其后实际的编译做一些准备工作,如prepare3就用于检查当前环境的配置是否是clean的。

                                 图3.8
    scripts目标的规则如图3.9,其中scripts_basic目标的生成我们在第六章会有介绍,另外两个依赖都是配置文件,我们看下include/config/auto.conf目标是如何生成的。

                                 图3.9
    它的定义如图3.10,其中KCONFIG_CONFIG的定义如图3.11,即其依赖于.config和auto.conf.cmd。.config和auto.conf.cmd都是make xxxconfig生成的,若它们比auto.conf新,则运行下面的命令以构建目标silentoldconfig,它定义在scripts/kconfig/Makefile中,执行该命会生成include/config/auto.conf和include/generate/autoconf.h文件。

                                 图3.10

                图3.11
    asm-generic的定义如图3.12,它会调用Makefile.asm-generated,它的主要功能是生成一些头文件。

                                 图3.12
    scripts目标调用的命令我们已经很熟悉了,即调用makefile.build,并包含进scripts目录中的makefile,然后执行递归编译。
    好了,终于到正题了。我们看下vmlinux-dirs目标生成的命令:
    $(MAKE) $(build)=$@
    $@是目标vmlinux-dirs的值,根据上面的分析可知它就是一些kernel的顶层子目录,因此该命令就是进入各个子目录,并且执行递归编译,直到所有定义的目标都编译完成。
    让我们再回到vmlinux目标上来,现在它的依赖都已准备好,是时候分析它调用的
命令了。我们回到图3.1中的call命令:
    +$(call if_changed,link-vmlinux)
    根据第六章的分析,我们知道该命令展开后就是cmd_link_vmlinux,它在图3.1中被定义为两个shell命令,其中第二个命令只有在ARCH_POSTLINK有值时才会调用,其定义如图3.13所示,即需要在源码相应架构的目录下存在Makefile.postlink文件,我们通过查看arm64架构下的该目录,没有找到这个文件,故该命令不会被执行。

                                 图3.13
    接下来我们看第一个命令,这里重写如下:
    $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux)
    其中CONFIG_SHELL表示用相应的shell解释器执行该命令,$<表示第一个依赖,它的值为scripts/link-vmlinux.sh。因此它的作用是调用link-vmlinux.sh脚本来执行链接,后面都是传给脚本的参数,包括所用的链接器以及链接flags。
    该脚本比较简单,主要通过vmlinux_link函数来链接vmlinux,用mksysmap脚本创建System.map符号表文件等(它其实是通过调用nm命令获取符号的)。

三 通用目标之make vmlinux的执行过程分析相关推荐

  1. 基于昇腾AI异构计算架构CANN的通用目标检测与识别一站式方案初体验

    前言 强大的社会粘性不断催温数字化发展,目标检测与识别作为计算机视觉领域的一项关键技术,应用场景广泛,前景十分广阔,从城市治理.楼宇园区.互联网等领域,延伸至智能家居.金融.医疗影像等更多创新领域.随 ...

  2. 链接装载与库:第三章——目标文件里有什么(ELF文件结构)

    文章目录 一.ELF文件的格式 二.ELF文件是什么样的 三.挖掘SimpleSection.o 3.1 代码段 3.2 数据段和只读数据段 3.3 BSS段 3.4 其他段 3.5 自定义段 四.E ...

  3. 基于CMMI模型实现自己的总体研发框架(1)——CMMI模型-前言+概念+通用目标通用实践

    一.前言 接触CMMI有12年了,09年开始接触CMMI,跟着咨询老师给自己公司做CMMI认证,自己负责公司的测试相关流程体系的建设.到19年自己负责公司的体系建设,初次也是CMMI过级,不过这次只是 ...

  4. 深度学习笔记 第四门课 卷积神经网络 第三周 目标检测

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

  5. ThunderNet:国防科大、旷视提出首个在ARM上实时运行的通用目标检测算法

    点击我爱计算机视觉标星,更快获取CVML新技术 今天跟大家分享一篇前天新出的论文<ThunderNet: Towards Real-time Generic Object Detection&g ...

  6. 第三周 目标检测(Object detection)

    第三周 目标检测(Object detection) 文章目录 第三周 目标检测(Object detection) 3.1 目标定位(Object localization) 3.2 特征点检测(L ...

  7. 通用目标检测开源框架YOLOv6在美团的量化部署实战

    基于美团目标检测模型开源框架 YOLOv6,本文介绍了一种通用的量化部署方案,在保持精度的同时大幅提升了检测的速度,为通用检测的工业化部署探索出一条可行之路,希望能给大家带来一些启发或者帮助. 1. ...

  8. 如何一个模型走天下?集成训练多数据集,打造通用目标检测模型方法详解

    在目标检测的实际应用中,常常会出现需要泛化的目标检测系统的情况.如城市安防中,需要目标检测系统能够检测足够多类别的目标,才能达到更好的安防效果. 但目前常用的目标检测数据集中包含的类别数量有限,使用单 ...

  9. 基于区域注意的通用目标检测

                                        Towards Universal Object Detection by Domain Attention Xudong Wa ...

最新文章

  1. RHEL5 kickstart 安装小结
  2. 年度重磅!中国《营销自动化应用基准报告 2021》正式发布!
  3. 循环控制_break语句
  4. Tomcat结合Apache、Nginx实现高性能的web服务器
  5. oracle输出查询返回多行,ORA-01427:单行子查询返回多行
  6. http:(2):http请求方法
  7. And(CF-1013B)
  8. 盛辉智能机器人安全吗_人工智能真的安全吗?快看这些已经发出的警告
  9. Mr.J-- jQuery学习笔记(四)--内容选择器
  10. ORA-01940: cannot drop a user that is currently connected
  11. JavaScript数据类型之逻辑运算符(9)
  12. 万维钢【思考的乐趣1:为学而学】
  13. 《软件体系结构》第三章 软件体系结构风格
  14. html签到页面的代码,签到页面.html
  15. arp表老化时间及其修改
  16. python爬虫携带cookie访问QQ空间
  17. 工控网络安全学习路线
  18. 商业价值(PgMP)
  19. 《读万卷书行万里路》国画大家罗建泉写生艺术
  20. 视频基础知识—720P/1080i/1080P

热门文章

  1. FilterListener
  2. NIPS 十大机器学习精选论文
  3. 如何快速上手抖音直播?这里有攻略
  4. 青龙面板【修改端口+修改密码】——简单版
  5. Java面试知识点(一)
  6. UWB测距原理及实现
  7. Android二维码原理与优化方向
  8. 高德地图 GPS定位 轨迹纠偏
  9. JS获取当前时间(年月日时分秒)
  10. html5div居中属性,html怎样让div居中