首页
社区
课程
招聘
Linux内核Makefile执行流程
2023-4-24 20:17 18036

Linux内核Makefile执行流程

2023-4-24 20:17
18036

1. 必备知识

1.1. Makefile基础语法

  如果还不熟悉Makefile语法,建议先系统的学习一下,特别是以下几点:
  (1) Makefile哪些部分包含的是shell语句:
   编译规则中的指令部分
   ${shell XX},var != XX中的XX部分
   $(if …, XX, XX)中的XX部分
  (2) 变量展开:
   =(延迟赋值)、:=(立即赋值)、!=(值为shell命令)、?=(条件赋值)、+=(追加)
  (3) include:将指定的其它Makefile内容,展开到当前Makefile
   -f/-C:嵌套执行指定(目录中的)Makefile
   执行一个Makefile,并不是从第一行开始执行,而是从指定或默认的编译目标开始执行(位置目标编译规则之前的赋值语句,只在相应变量需要被使用时才会执行),其中,Makefile(包括include内容)中的第一个目标,为默认目标,如果make命令行中没有指定编译目标,则执行默认目标。
  (4) 自动推导依赖文件
  (5) 根据文件时间戳、中间文件(.d、.cmd),判断依赖更新,决定是否需要重新编译
  (6) 重要的内置函数:
   $(wildcard pattern)
   $(patsubst pattern, replacement, text)
   $(strip string)
   $(filter pattern, text)
   $(filter-out pattern, text)
   $(call func, args..)
   …
  (7) 自动推导变量:
   $@:编译目标
   $<:依赖列表中的第一个依赖对象
   $^:依赖列表中的所有对象
   $?:依赖文件列表中所有有更新的文件

 

  Makefile教程可以参考以下这2个:
  深入解析Makefile系列:https://zhuanlan.zhihu.com/p/362640343(简约,直指核心)
  跟我一起写makefile(陈皓):https://blog.csdn.net/whitefish520/article/details/103968609(精典,超级详细)

1.2. Kbuild内置函数

  Linux内核源码包含一套Makefile程序,本文基于Linux-5.2.5内核源码分析,其中包括top Makefile,scripts/目录下的Makefile、Makefile.build、Makefile.lib、Kbuild.include、Makefile.modpost、kconfig/Makefile等,以及其它目录下的很多子Makefile,统称为Kbuild。Kbuild是按照框架设计思路实现的,使得内核自身包含或外部提供的大量驱动模块,只需要按照Kbuild框架的约定,各自提供一个简单的Makefile即可编译。
  所以,理解内核或驱动文件的编译过程,其实就是要理解Kbuild这套Makefile程序的实现逻辑,既然是程序,就免不了会定义一些函数,由于很多关键的流程,都使用了$(build)和$(if_changed),所以以下先单独介绍(本文分析的Makefile内容,来自Linux-5.2.5内核源码):

1.2.1. $(build)

  • 使用形式:$(Q)$(MAKE) $(build)=xx目录 [编译目标]
  • build内部过程
  • build作用概括
    以下是$(build)的使用形式,以及每个部分的作用:

    1.2.2. $(if_changed)

  • 使用形式:$(call if_changed, xx)
  • if_changed内部过程
  • if_changed作用概括
    以下是$(if_changed)的使用形式,及其参数的含义:

2. 编译外部模块

2.1. 涉及Makefile内容

2.2. 概要流程

2.3. 详细流程

3. make menuconfig

3.1. 涉及Makefile内容

3.2. 概要流程

3.3. 详细流程

4. Make [all/_all/modules]

4.1. 涉及Makefile内容

  make命令行指定all/_all/modules目标,或者不指定目标时,是为了生成vmlinux文件,而vmlinux目标间接依赖prepare目标,且prepare目标编译规则展开内容比较多,所以以下分开介绍:

  • vmlinux目标
  • prepare目标

4.2. 概要流程

  • vmlinux目标
  • prepare目标

4.3. 详细流程

  • vmlinux目标
  • vmlinuz目标
  • prepare目标

5. 参考

 linux Kbuild详解系列:https://zhuanlan.zhihu.com/p/362640343
 跟我一起写makefile:https://blog.csdn.net/whitefish520/article/details/103968609


 

附件:文中部分图片,根据"执行流程.txt"内容截取,其余已经打包到"图.zip"文件


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞13
打赏
分享
最新回复 (4)
雪    币: 19244
活跃值: (28872)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-4-26 09:23
2
1
感谢分享
雪    币: 3160
活跃值: (872)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Jmsrwt 2023-4-26 09:40
3
0
mark
雪    币: 12051
活跃值: (15374)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2023-4-26 17:32
4
0
感谢分享
雪    币: 188
活跃值: (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
吃汉堡 2023-5-10 11:42
5
0
谢谢
游客
登录 | 注册 方可回帖
返回