Как скомпилировать модуль ядра Linux: пропавшие без вести printk?

Таким образом, я пытаюсь скомпилировать простой модуль ядра на 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' ошибка.

Таким образом, вопрос состоит в том, как точно я заставляю этот модуль наиболее простого ядра даже компилировать?

1
задан 12 October 2018 в 09:52

1 ответ

Проблема, решенная с парой извлеченных уроков:

  • "Необходимо использовать заголовки ядр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.

2
ответ дан 7 December 2019 в 13:21

Другие вопросы по тегам:

Похожие вопросы: