Сборка модуля ядра Linux

avatar
Dhyan Deep A.K
8 апреля 2018 в 08:43
834
1
1

Я программист драйверов Windows, новичок в разработке ядра Linux. Я установил заголовки ядра Linux. Я пробую свой модуль helloworld в ядре Linux.

#include <linux/init.h>
#include <linux/module.h>
/*MODULE_LICENSE("Dual BSD/GPL");*/
static int hello_init(void)
{
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}
static void hello_exit(void)
{
    printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);

следующий код для моего модуля. makefile для моей сборки

obj-m +=tryout.o

KDIR =/usr/src/linux-headers-4.13.0-37-generic

all:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
    rm -rf *.o *.ko *.mod.* *.symvers *.order

но я получаю «фатальная ошибка: linux/init.h: нет такого файла или каталога при создании этого модуля». Что может быть возможной причиной? и как я могу это решить?

Источник
0___________
8 апреля 2018 в 08:59
0

Именно то, что он говорит: такого файла нет в каталогах, которые он ищет для включаемых файлов. Ни больше ни меньше.

Dhyan Deep A.K
8 апреля 2018 в 09:12
0

Я обнаружил, что KDIR =/usr/src/linux-headers-4.13.0-37-generic/include/linux содержит заголовок, который я использую, и он существует.

0___________
8 апреля 2018 в 11:23
0

А также? Компилятор должен это знать. у вас есть опция gcc -I или измените файл env. Переменная.

Tsyvarev
8 апреля 2018 в 13:25
0

Точное сообщение об ошибке, пожалуйста. @PeterJ_01: Это система сборки ядра Linux, которая должна корректировать пути включения для заголовков ядра. Не следует делать это вручную.

0___________
8 апреля 2018 в 21:31
0

@Tsyvarev должен не значит будет.

Ahmed Masud
9 апреля 2018 в 02:55
0

@PeterJ_01 Нет. Файлы Makefile ядра предназначены для того, чтобы позаботиться об этом.

Ответы (1)

avatar
Ahmed Masud
9 апреля 2018 в 03:06
1

Ваш Makefile настроен неправильно. В частности, вы использовали SUBDIRS, тогда как вы должны использовать M и ваш $(PWD) не имеет смысла, вы должны использовать pwd для простоты (или $$PWD); Вот как это сделать:

    ifneq ($(KERNELRELEASE),)
    # kbuild part of makefile
    obj-m  := tryout.o
    # any other c files that you would like to include go into 
    # yourmodule-y := <here> e.g.:

    # tryout-y := tryout-1.o tryout-2.o 

    else
    # normal makefile
    KDIR ?= /usr/src/linux-headers-4.13.0-37-generic

    # you really should set KDIR up as:
    # KDIR := /lib/modules/`uname -r`/build

    all::
        $(MAKE) -C $(KDIR) M=`pwd` $@

    # Any module specific targets go under here
    # 

    endif

Настройка вашего make-файла таким образом позволит вам просто ввести make в каталоге вашего модуля, и он вызовет подсистему ядра kbuild, которая, в свою очередь, будет использовать kbuild часть вашего Makefile.

Прочитайте на https://www.kernel.org/doc/Documentation/kbuild/modules.txt все различные варианты того, как это сделать. Он поставляется с примерами.