Вот очень простой демонстрационный модуль, который вызывает 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);
Makefile :
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()
для освобождения выделенного блока.