Makefile语法学习

Makefile 遵循一套被称为 Kbuild 的规范,并使用一些关键变量来告诉构建系统如何处理当前目录的代码。

| 变量 | 作用 | 示例 |

| :--- | :--- | :--- |

| `obj-y` | 将目标编译进内核主镜像 (`vmlinux`)。这些文件最终会被打包成一个 `built-in.o` 文件。 | `obj-y := main.o utils.o` |

| `obj-m` | 将目标编译为可加载的内核模块 (`.ko` 文件)。 | `obj-m := mydriver.o` |

| `obj-(CONFIG_FOO)\` \| 条件编译。根据 \`.config\` 中的配置项 (\`CONFIG_FOO\`) 来决定是否编译。如果 \`CONFIG_FOO=y\`,则等同于 \`obj-y\`;如果为 \`m\`,则等同于 \`obj-m\`。 \| \`obj-(CONFIG_EXT4_FS) += ext4/` |

| `<target>-objs` | 当一个模块或内置目标由多个源文件组成时使用。它指定了链接成最终目标文件所需的依赖项。 | `mydriver-objs := core.o hw_ops.o` |

最终链接:生成 vmlinux

当所有子目录都完成了各自的编译任务(生成了各自的 built-in.o 或 .ko 模块)后,顶层 Makefile 会进行最后的链接工作,生成最终的内核可执行文件 vmlinux。

链接顺序大致如下:

head-y: 首先链接由 arch/$(ARCH)/Makefile 指定的启动代码。

核心文件: 接着链接 init/main.o 等初始化代码。

各子系统: 然后按照 core-y, drivers-y, net-y, libs-y 的顺序,将所有生成的 built-in.o 文件链接在一起。

最终,这些目标文件和库文件被链接成一个完整的 vmlinux 二进制文件。之后,通常会通过工具(如 objcopy)将其压缩并添加自解压头,生成最终用于引导的镜像(如 zImage 或 uImage)。

为每个进程保存一个页表

Page Table

页表基址寄存器PTBR

Frame Number、Protection(Protection、Status)、Status(Present/Valid、Dirty\Accessed)

现在CPU都支持硬件MMU,MMU如何配置?

TLB Entry,32~1024个条目

PT Entry

rc-service sshd start

将驱动编译成模块(.ko),在linux内核启动后使用insmod命令加载驱动模块。

module_init(xxx_init); // 注册模块加载函数

module_exit(xxx_exit); // 注册模块卸载函数

insmod drv.ko

modprobe drv.ko // 提供模块的依赖性分析、错误检查、错误报告等功能

NAND,EMMC,

使用NXP官方提供的MfgTool工具通过USB OTG扣来烧写系统。

firmware文件夹

编译出来的zImage、u-boot.imx和imx6ull-ljk-emmc.dtb

files文件夹

编译出来的zImage、u-boot.imx和imx6ull-ljk-emmc.dtb,rootfs文件

ucl2.xml文件烧录分析文件

make工具:找出修改过的文件,根据依赖关系,找出受影响的相关文件,最后按照规则单独编译这些文件。

Makefile文件:记录依赖关系和编译规则。

Makefile三要求:目标、依赖、命令

自定义变量:

= 延迟赋值

:= 立即赋值

?= 空赋值

+= 追加赋值

自动化变量:

$< 第一个依赖文件

$^ 全部的依赖文件

$@ 目标

模式匹配

% 匹配任一多个非空字符

* 通配符

默认规则

.o文件默认使用.c文件来进行编译

条件分支

ifeq()

else

endif

ifneq()

else

endif

常用函数

https://www.gnu.org/software/make/manual

patsubst:模式替换函数

$(patsubst %.c, %.o,x.c bar.c)

notdir:取文件名函数

$(notdir src/foo.c hacks)

wildcard:获取匹配模式文件名函数

$(wildcard *.c)

foreach:返回值为当前目录下所有.c源文件列表

foreach:$(foreach VAR,LIST,TEXT)

$(ARCH)

相关推荐
极客先躯1 小时前
高级java每日一道面试题-2025年11月15日-行业专题[LangChain4j]-如何实现热点事件的实时分析和推送?
java·数据库·langchain·突发性与不可预测性·信息碎片化与多源重复·情绪驱动与谣言风险·推送的精准性与合规性
小张小张爱学习1 小时前
Mybatis高频面试题
java·spring·mybatis
拾贰_C1 小时前
【OpenAI | Ubuntu | bigmodel】 openai规范配置bigmodel(zhipu)大模型api
linux·运维·ubuntu
遇见你的雩风1 小时前
Java --- 网络原理(三)
java·开发语言·网络
itzixiao1 小时前
L1-058 6翻了(15分)[java][python]
java·开发语言·python·算法
计算机安禾1 小时前
【Linux从入门到精通】第22篇:Shell变量与数据类型——数字与字符串处理
linux·运维·chrome
晓得迷路了1 小时前
栗子前端技术周刊第 126 期 - Rspack 2.0、TypeScript 7.0 Beta、Git 2.54...
前端·javascript·ai编程
小小码农Come on1 小时前
单例 QtObject 全局配置
开发语言·前端·javascript
摸鱼仙人~1 小时前
HTTP状态码全量详解(定义+核心区别+业务场景+前端常见诱因+排查方案+工程处理)
前端·网络协议·http
直奔標竿1 小时前
Java开发者AI转型第十三课!知识库终局方案:Spring AI Vector Store架构演进与ETL全链路入库实战
java·人工智能·后端·spring