Отсутствующий slab.h из Linux включает в себя - Ubuntu 16 VM - PullRequest
0 голосов
/ 05 марта 2019

Я работаю над драйвером ядра Linux и мне нужен доступ к функциям kmalloc и kfree. Из моего исследования они должны быть доступны в заголовке slab.h, но этот файл не существует в моей файловой системе.

Я попытался обновить свои включения, используя это решение: https://askubuntu.com/questions/75709/how-do-i-install-kernel-header-files, но это показывает, что у меня уже есть все соответствующие файлы.

Моя система представляет собой установку VMWare Ubuntu 16.04 с ядром 4.15.0.

Есть идеи?

1 Ответ

0 голосов
/ 06 марта 2019

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

...