这是一个非常简单的演示模块,调用kmalloc 和kfree:
demo.c:
#define pr_fmt(fmt) "demo: " fmt
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
MODULE_LICENSE("GPL");
static int __init demo_init(void) {
void *buf;
buf = kmalloc(1000, GFP_KERNEL);
pr_info("kmalloc returned %p\n", buf);
kfree(buf);
return 0;
}
static void __exit demo_exit(void) {
}
module_init(demo_init);
module_exit(demo_exit);
生成文件:
ifneq ($(KERNELRELEASE),)
# KBuild part of Makefile
obj-m += demo.o
else
# Normal part of Makefile
#
# Kernel build directory specified by KDIR variable
# Default to running kernel's build directory if KDIR not set externally
KDIR ?= "/lib/modules/`uname -r`/build"
all:
$(MAKE) -C "$(KDIR)" M=`pwd` modules
clean:
$(MAKE) -C "$(KDIR)" M=`pwd` clean
endif
您可以只运行make 为当前运行的内核版本构建模块:
$ make
或者您可以设置KDIR 为任意内核版本构建模块(在以下示例中由${KERNELVER} 定义):
$ make KDIR="/lib/modules/${KERNELVER}/build"
(如果未指定KDIR,Makefile 会将其设置为当前运行内核的构建路径:"/lib/modules/`uname -r`/build"。)
如果编译成功,那么你肯定已经安装了内核头文件!
要测试模块,请运行:
$ sudo /sbin/insmod demo.ko
$ sudo /sbin/rmmod demo
$ sudo dmesg
内核日志中应该有一条类似于此的消息,显示来自kmalloc() 调用的返回值:
[TIMESTAMP] demo: kmalloc returned xxxxxxxxxxxxxxx
该模块还调用kfree() 来释放分配的块。