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/

 

posted @ 2022-04-20 22:30  robotech_erx  阅读(223)  评论(0编辑  收藏  举报

本文版权归作者robotech_erx,转载请注明出处:https://www.cnblogs.com/robotech/