Компиляция модуля: файл asm/linkage.h не найден

Я пытаюсь скомпилировать пример модуля "hello world" Kernel, проблемы, обнаруженные на ubuntu 11.04, ядро ​​3.2.6, gcc 4.5.2 и fedora 16, ядро ​​3.2.7, gcc 4.6.7.

код:

#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");

static int __init hello_init (void)
{
printk("Hello module init\n");
return 0;
}
static void __exit hello_exit (void)
{
printk("Hello module exit\n");
}
module_init(hello_init);
module_exit(hello_exit);

скомпилирован с помощью:

gcc -D__KERNEL__ -I /usr/src/linux/include/ -DMODULE -Wall -O2 -c hello.c -o hello.o

Ошибка:

В файле, включенном в /usr/src/linux/include/linux/kernel.h:13:0,                  из /usr/src/linux/include/linux/cache.h:4,                  из /usr/src/linux/include/linux/time.h:7,                  из /usr/src/linux/include/linux/stat.h:60,                  из /usr/src/linux/include/linux/module.h:10,                  от hello.c: 1:/usr/src/linux/include/linux/linkage.h:5:25: фатальная ошибка: asm/linkage.h: файл не найден

то я нашел в/usr/src/linux/include/нет папки с именем "asm", но "asm-generic"; поэтому я сделал мягкую ссылку "asm" на "asm-generic" и скомпилировал агил:

на этот раз ошибка:

В файле, включенном в /usr/src/linux/include/linux/preempt.h:9:0,                  из /usr/src/linux/include/linux/spinlock.h:50,                  из /usr/src/linux/include/linux/seqlock.h:29,                  из /usr/src/linux/include/linux/time.h:8,                  из /usr/src/linux/include/linux/stat.h:60,                  из /usr/src/linux/include/linux/module.h:10,                  от hello.c: 1:/usr/src/linux/include/linux/thread_info.h:53:29: фатальная ошибка: asm/thread_info.h: файл не найден

Итак, я понял, что ошибаюсь, но почему? Т_Т

Ответ 1

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

- это правильный способ создания модулей, см. документацию kbuild

И чтобы увидеть разницу между вашим вызовом компилятора, вы могли бы

cat /lib/modules/$(shell uname -r)/build/Makefile

И проанализируйте вывод

Ответ 2

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Здесь hello.c - ваш исходный файл ядра. просто используйте make, чтобы создать свой модуль hello.ko.

Ответ 3

asm должна быть ссылкой на фактическую архитектуру, которую вы компилируете, а не на asm-generic.
Вы не можете скомпилировать общий модуль ядра, который будет работать на общей архитектуре. Вы должны скомпилировать его для конкретной архитектуры, которую вы собираетесь использовать.

Я не знаю, почему asm не существует. Он должен быть создан как часть процесса настройки.
Вы можете получить другие ошибки позже, если конфигурация является неполной другими способами.

Ответ 4

Asm включает (например, linkage.h) специфические для архитектуры. Должен быть набор каталогов:

    /usr/src/kernels/(kernel version goes here)/arch

которые предусматривают конкретные компоненты для конкретной архитектуры процессора, на которую вы нацеливаете свой код для компиляции.

Попробуйте добавить это в свой файл Makefile:

    KVERSION :=R(shell uname -r)

и добавьте ядро и архитектуру (x86 в этом примере):

    INCDIRS = -I./include -I/usr/src/kernels/$(KVERSION)/include -I/usr/src/kernels/$(KVERSION)/arch/x86

Ответ 5

компиляция модуля: файл asm/linkage.h не найден

Это означает, что этот конкретный файл не был найден в указанном DIR, который указывается при использовании опции -I с make.

Мы можем связать это asm-generic с asm, если все заголовки присутствуют в asm-generic или мы можем использовать make utility.

Сделать утилиту предпочтительной в случае создания модулей ядра.

Создайте "Makefile" в рабочем DIR.

obj-m += hello.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Использование опции -C изменится на DIR, указанный перед чтением make файлов или что-то еще.

Итак, чтобы избежать этой ошибки, используйте параметр -C с DIR /lib/modules/$(shell uname -r)/build

Таким образом, ваша программа сможет найти необходимые файлы, вы получите файл hello.ko.

Вы можете добавить это в модули ядра с помощью

sudo insmod hello.ko

Аналогичным образом вы можете удалить

sudo rmmod hello