Linux内核开发-最简单的Makefile
Linux内核开发-最简单的Makefile
时间:20220418,版本:V0.1
作者:robotech_erx
最简单的linux驱动程序代码至少需要一个makefile,一份源代码,本文简单解释makefile中的各个make target的意义。这里只是介绍一个简单的基础的makefile,生产环境需要更好的Makefile模板和构建工具。
简单的驱动Makefile
示例:
obj-m += helloword.o
PWD := $(shell pwd)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build/
all:
make -C $(KERNELDIR) M=$(PWD) modules
install:
make -C $(KERNELDIR) M=$(PWD) modules_install
clean:
make -C $(KERNELDIR) M=$(PWD) clean
一个target的基本语法是:
target: [dependent-source-file(s)]
rule(s)
The rule(s) instances are always prefixed with a [Tab] character, not white space.
obj-m:以内核模块的形式单独编译。
以all为例,展开后的编译规则是:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
-C 参数告诉make把工作目录切换到 /lib/modules/$(shell uname -r)/build/目录,然后首先解析该目录下的makefile。这保证了当前编译的模块与内核是适配的——使用相同的编译连接参数。然后是M参数M=$(PWD),内核使用这个变量来确定要构建的外部模块的目录,完成内核的编译配置的读取后,在这个目录里完成模块的编译。
预编译的内核头文件
头文件的路径要提供给makefile,让make知道去哪里找到他们。所以得先准备头文件。Linux发行版一般都会准备好头文件。查看当前已安装的内核头文件:
$ dpkg -l | grep linux-headers | awk '{print $1, $2}'
ii linux-headers-5.13.0-37-generic
ii linux-headers-5.13.0-39-generic
ii linux-headers-5.4.0-107
ii linux-headers-5.4.0-107-generic
ii linux-headers-generic (这是个啥)
ii linux-headers-generic-hwe-20.04
$ apt search linux-header #a long list
$ sudo apt install linux-headers-generic
$ sudo apt install linux-headers-$(uname -r) #安装当前内核版本的头文件
安装完成的内核文件可以在/lib/modules/$(uname -r)/build
$ ls -l /lib/modules/$(uname -r)/
total 5552
lrwxrwxrwx 1 root root 39 Nov 12 16:16 build -> /usr/src/linux-headers-
5.0.0-36-generic/
[...]
可见是一个符号链接,真正的安装地址是/usr/src/
如果是自己编译的内核,编译完成后,在源代码目录:
$ make headers_install
或者直接引用源码目录。
引用的内核文件能直接引用“原始状态”的源码包么?不能,因为编译驱动时需要根据具体的内核选项来决定一些代码如何编译,cpu架构,大端还是小端等,这些都要依赖内核的配置。编译前当然要配置一下内核,生成默认配置 .config ,这个文件是设置 cpu 架构,及很多其他驱动选项的,没有个这个文件无法编译的。
参考
Linux设备驱动开发
http://fastbitlab.com/linux-device-driver-programming-lecture-24-how-to-create-makefile/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人