ядро Linux.ч: нет такого файла или каталога

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

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

Здравствуйте.c:

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

int init_module(void)
{
    printk("Hello, worldn");
    return 0;
}

void cleanup_module(void)
{
    printk("Goodbyen");
}

и 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

ошибка сделать:

Здравствуйте.c: 1: фатальная ошибка: linux/kernel.ч : нет такого файла или каталога компиляция завершена.

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

4 ответов


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

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

вы не можете просто использовать традиционном стиле 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 была введена инфраструктура. Каждое новое ядро заставляло меня терять часа производительности.


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

obj-m += Здравствуйте.o

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

и с помощью команды:

insmod Здравствуйте.ко

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


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