内核模块 (kernel module) 的编译环境配置会根据发行版的不同而不同,即使是 Ubuntu 和 Debian 也可能有细微的区别。

0x00 安装软件包
对于 Debian 来说,只需要安装 Linux Header 即可进行 module 的编译。

$ sudo apt-get install linux-headers-$(uname -r)

如果需要内核源码,可以参考链接 2。

0x01 编译 module
进行简单的编译测试。

准备 hello.c

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

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void){
    printk(KERN_ALERT "Hello, worldn");

return 0;
}
static void hello_exit(void){
    printk(KERN_ALERT "Exit, module.n");
}
module_init(hello_init);
module_exit(hello_exit);

内核模块的编译重点在 Makefile 上。需要注意的是,make 对应的 makefile 文件的名称必须为Makefile,全部小写的 makefile 是不行的。

# File name: Makefile

obj-m := hello.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) module

clean:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) clean

除了使用 modules 参数构建模块之外,我们还可以使用 clean 参数方便的配置清理函数。

在 hello.c 的所在目录执行make进行编译即可。

详细信息参考链接 3。《Linux 设备驱动程序》中的 Makefile 更认真一些。

0x02 其他
在更新内核版本后,uname -r会发生变动,导致 Makefile 使用的/lib/modules/$(shell uname -r)/build指向新的内核构建目录.

但是 linux-header 的安装包同样是使用uname -r安装的,并不会随着内核更新同步更新 (事实上你可以使用 apt 安装任意版本的 linux-header).

解决办法是安装新的 linux-header,即重新执行步骤 0x01 即可.
Referenced from:https://www.dazhuanlan.com/xthsky/topics/1197635

本文链接地址:https://const.net.cn/605.html

标签: none

添加新评论