linux / kernel.h: нет такого файла или каталога - PullRequest
6 голосов
/ 10 апреля 2011

Я собираюсь написать модуль Hello World в Ubuntu 10.10 (с ядром 2.6.35-28-generic).Расположены заголовки:

/usr/src/linux-headers-2.6.35-28-generic

hello.c:

#include <linux/kernel.h> 
#include <linux/module.h>

int init_module(void)
{
    printk("Hello, world\n");
    return 0;
}

void cleanup_module(void)
{
    printk("Goodbye\n");
}

и Makefile:

CC = gcc
CFLAGS = -Wall -DMODULE -D__KERNEL__
hello.o: hello.c
    $(CC) $(CFLAGS) -c hello.c
    echo insmod hello.o to install
    echo rmmod to delete

Ошибка при make :

hello.c: 1: фатальная ошибка: linux / kernel.h: сборка таких файлов или каталогов не прекращена.

Как мне решить эту проблему?*

Ответы [ 4 ]

7 голосов
/ 10 апреля 2011

Вы не можете просто использовать традиционный стиль Makefile с модулями ядра Linux; в то время как вы могли бы быть в состоянии заставить что-то работать, это будет болезненный опыт.

Начните с чтения файла Documentation/kbuild/modules.txt; он точно опишет, что вам нужно делать при написании модуля Makefile, чтобы он мог аккуратно подключаться к среде Kbuild ядра. Ваш Makefile, вероятно, будет выглядеть примерно так:

ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m  := 8123.o
8123-y := 8123_if.o 8123_pci.o 8123_bin.o

else
# normal makefile
KDIR ?= /lib/modules/`uname -r`/build

default:
    $(MAKE) -C $(KDIR) M=$$PWD

# Module specific targets
genbin:
    echo "X" > 8123_bin.o_shipped

endif

Пожалуйста, поверьте мне на это; в то время как вы можете подумать, что вы «всего лишь одно небольшое изменение» от получения своего Makefile для работы, даже незначительные изменения в версии ядра полностью разрушат вашу сборку. Просто потратьте час, чтобы написать Kbuild -совместимую Makefile для вашего модуля. Я потратил несколько недель своей жизни, пытаясь сохранить ранее существовавший Makefile, когда была введена инфраструктура Kbuild. Каждое новое ядро ​​приводило к потере часов производительности.

2 голосов
/ 10 апреля 2011

Как и то, что сказал @sarnold, вы должны использовать другой Makefile.Just следующим образом:

obj-m + = hello.o

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

и использовать команду:

insmod hello.ko

для установки этого модуля.

2 голосов
/ 10 апреля 2011

Для меня этот файл ("linux / kernel.h") находится в пакете linux-libc-dev (Kubuntu 10.10).

2 голосов
/ 10 апреля 2011

Есть ли у вас / usr / src / linux символическая ссылка на ваш /usr/src/linux-headers-2.6.35-28-generic? Если нет, то создайте его, используя следующие команды

# cd /usr/src
# ln -sfn linux-headers-2.6.35-28-generic linux
...