Таким образом, я пытаюсь скомпилировать простой модуль ядра на Ubuntu 18.04, ядро 4-15.32 универсальных:
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void){
printk("<1> Hello,World\n");
return 0;
}
void cleanup_module(void){
printk("<1> Goodbye.\n");
}
Заметьте, что я действительно имею <linux/kernel.h>
, с тех пор существуют ссылки на форумах, что это - частый пропуск, когда ошибка, которую я имею, происходит, но в этом случае у меня нет той проблемы. Компиляция этого с gcc -o hello.o hello.c
результаты в implicit declaration of function 'printk'
ошибка.
Таким образом, вопрос состоит в том, как точно я заставляю этот модуль наиболее простого ядра даже компилировать?
Проблема, решенная с парой извлеченных уроков:
"Необходимо использовать заголовки ядрa ядра, против которого Вы компилируете. Используя значение по умолчанию /usr/include/linux
не будет работать" (источник)
Компиляция с gcc
непосредственно не рекомендуется - Ядро имеет kbuild систему: "Автор внешнего модуля должен предоставить make-файл, который скрывает большую часть сложности, таким образом, одно единственное должно ввести, "делают" для создания модуля".
$(PWM)
по некоторым причинам не работает, но $(shell pwm)
работы. (найденный здесь). Это также играло роль потому что M=$(PWM)
дал бы
make[2]: *** No rule to make target 'arch/x86/entry/syscalls/syscall_32.tbl', needed by 'arch/x86/include/generated/asm/syscalls_32.h'. Stop.
ошибка. Кроме того, на документацию ядра можно было также сделать
make -C /lib/modules/`uname -r`/build M=$PWD
но не попробовали это.
Make-файл я использовал:
obj-m += hello.o
KDIR := /lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(KDIR) M=$(shell pwd) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
Получающиеся работы модуля как ожидалось и могут быть вставлены и удалены с хорошими сообщениями" <1> Привет Мир" и" <1> До свидания" распечатанный к dmesg
.