一个简单的内核模块Makefile语法讲解

本文阅读 3 分钟
首页 Linux,系统 正文

1.dmeo

这里给出一个最简单的内核模块。 这个模块定义了两个函数: 一个在模块加载到内核时被调用 :hello_init 一个在模块被移除时被调用:hello_exit

//helloworld.c
#include <linux/kernel.h>
#include <linux/module.h>

//内核模块初始化函数
static int __init hello_init(void)
{ 
    printk(KERN_EMERG "Hello World\n");
    return 0;
}

//内核模块退出函数
static void __exit hello_exit(void)
{ 
    printk(KERN_DEBUG "exit\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
//Makefile
obj-m := helloworld.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

2. Makefile

(1)

obj-m := helloworld.o   (GNU make 提供的扩展语法)

表明有一个模块要从目标文件helloworld.o 建立, 在从目标文件建立后结果模块命名为 helloworld.ko。 如果源文件不止一个( 比如 file1.c 和 file2.c )

obj-m := helloworld.o 
helloworld-objs := file1.o file2.o

或者

obj-m += helloworld.o 
helloworld-objs += file1.o 
helloworld-objs += file2.o

这样file1.c 和 file2.c 就一起被编译和链接到helloworld.ko模块中去了。 (2)

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

执行shell命令 uname -r img 等价于:

make -C /lib/modules/5.13.0-52-generic/build M=$(PWD) modules

让我们来看看 /lib/modules/5.13.0-52-generic/build 文件: img 可以看出这是一个符号链接(类似于windows下的快捷方式) 执行下面这条命令就可以创建上面的一个符号链接:

ln -s /usr/src/linux-headers-5.13.0-52-generic /lib/modules/5.13.0-52-generic/build

(3) -C dir, --directory=dir:在读取 Makefile 或执行任何其他操作之前更改为目录 dir。 由上面我们可以知道make -C 就是到 /usr/src/linux-headers-5.13.0-52-generic提供的目录下去找Makefile. 那就让我们看看 /usr/src/linux-headers-5.13.0-52-generic目录下是啥: img 该目录下的文件是内核头文件,注意这不是内核源码,同时我们也看到了内核头文件中的顶层Makefile,make实际执行的就是内核头文件的顶层 Makefile。 内核头文件下的各个目录基本都只有Kconfig和Makefile文件: img img

我们注意到每个内核版本都有一个带 -generic 和不带 -generic 的内核头文件,对于同一版本内核的这两个文件夹都只是头文件,并不是源代码。 img 带有 -generic 的目录里面均是指向不带 -generic 文件夹内容的符号链接: img 注意:编写内核模块不需要内核源码,只需要内核头文件即可。 (4) 下载内核源码,上面我们看到/usr/src/目录下都只是不同版本的内核头文件,我们可以通过命令下载内核源码:sudo apt-get install linux-source 我这里下载 linux-source-5.4.0:

sudo apt-get install linux-source-5.4.0

img img img 删除源码:

sudo apt-get remove linux-source-5.4.0

(5) M= 选项使 makefile 在试图建立模块目标前, 回到你的模块源码目录: img 我们的helloworld.c和Makefile就是在/home/yl/study/test 目录下。 执行make后,ko模块也就生成在该目录下: img

上述环境:vmware + ubuntu20.04

今天的内容比较简单啦。 编写内核模块不需要内核源码,只需要内核头文件(和相应的Makefile)即可。 如果要开发内核,则需要修改内核源码。

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/weixin_45030965/article/details/124413885
-- 展开阅读全文 --
BUUCTF Web [极客大挑战 2019]Knife
« 上一篇 06-24
安全面试之XSS(跨站脚本攻击)
下一篇 » 07-24

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复