我将在Ubuntu 10.10(内核2.6.35-28-generic)中编写Hello World模块。标题位于:
/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
制作:
时出错hello.c:1:致命错误:linux / kernel.h:没有这样的文件或目录 编译终止。
我该如何解决这个问题?
答案 0 :(得分:7)
你不能只使用传统风格的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
。每一个新内核都会让我失去小时的生产力。
答案 1 :(得分:2)
你有/ 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
答案 2 :(得分:2)
对我来说,这个文件(“linux / kernel.h”)位于linux-libc-dev包中(Kubuntu 10.10)。
答案 3 :(得分:2)
正如@sarnold所说,你应该使用不同的Makefile.Just如下:
obj-m + = hello.o
所有: make -C / lib / modules / $(shell uname -r)/ build M = $(PWD)modules
并使用命令:
insmod hello.ko
安装此模块。