我写了一个简单的模块:
#define __KERNEL__
#define MODULE
#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");
}
并使用此命令进行编译:
cc -c hello.c
但是我收到了这个错误:
linux/module.h: No such file or directory
有什么建议吗?
编辑: 我用过这个commad:
cc -I/usr/src/linux-headers-3.0.0-17-generic/include -c hello.c
它向前迈出了一步,现在我收到了这个错误:
In file included from /usr/src/linux-headers-3.0.0-17-generic/include/linux/kernel.h:13:0,
from hello.c:3:
/usr/src/linux-headers-3.0.0-17-generic/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory
compilation terminated.
答案 0 :(得分:10)
首先你需要 kernel sources 。许多人混淆了用户空间头和内核空间头,因为其中许多头具有相同的文件夹结构。大多数发行版只有用户空间标题而不是内核空间标题。
通常 make
用于构建内核模块,而不是裸cc
。按照给出here
Hello World
内核模块
答案 1 :(得分:4)
源文件名是basic.c
#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);
=====================================
首先在你的终端上键入$(uname -r)然后你将得到版本.. 在你的系统上使用
obj-m +=basic.o
KDIR =//usr/src/linux-headers-3.13.0-44-generic
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.* *.symvers *.order
=============================================== =
$sudo insmod basic.ko
$dmesg
u will get the output
$sudo rmmod basic.ko
$dmesg
答案 2 :(得分:3)
你需要内核头文件;如果安装,它们通常在/usr/include/
。
除非你使用基于源代码的发行版或构建自己的内核,否则它们很有可能在默认情况下没有安装;使用您的发行版包管理器来安装它们。该包通常称为linux-headers
。
答案 3 :(得分:3)
你需要内核构建环境(选择脚本,头文件和Makefile),如果安装了内核,通常可以通过/ lib / modules / 版本 / build(它的符号链接)访问它已经。否则,该目录是构建目录(System.map所在的目录)。完整的来源不需要(智能发行版认识到这一点),也不是/ usr / include / whatever。
你必须使用kbuild;调用cc -I
是不够的,并且已经超过10年了。您从Kbuild
文件开始:
obj-m += mymodule.o
和Makefile
:
kdir=/lib/modules/$(shell uname -r)/build
all:
make -C ${kdir} M=$$PWD
modules_install clean:
make -C ${kdir} M=$$PWD $@
然后使用make
。
#defining __KERNEL__
和MODULE
也毫无意义,因为如果需要,已经由kbuild设置了。
答案 4 :(得分:2)
大多数Linux发行版都不会默认安装内核头文件。查找包kernel-headers或类似的东西。