12

我写了一个简单的模块:

#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

有什么建议么?

编辑:我使用了这个逗号:

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.
4

5 回答 5

11

首先你需要内核源代码。许多人混淆了用户空间标头和内核空间标头,因为它们中的许多具有相同的文件夹结构。大多数发行版只有用户空间头文件,而没有内核空间头文件。

并且通常 make用于构建内核模块而不是裸露的cc. 按照这里给出的简单的逐步解释的Hello World内核模块

于 2012-04-12T14:57:11.527 回答
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);

======================================

现在为ubuntu制作文件

首先在您的终端上键入 $(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
于 2015-03-04T20:16:40.760 回答
3

你需要内核头文件;/usr/include/如果安装,它们通常会在其中。

除非您使用基于源的发行版或构建自己的内核,否则它们默认情况下不会安装;使用发行版的包管理器来安装它们。该包通常称为linux-headers.

于 2012-04-12T14:55:07.573 回答
3

您需要内核构建环境(脚本、头文件和 Makefile 的选择),如果已经安装了内核,通常可以通过 /lib/modules/ version /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 已经设置了它。

于 2012-04-12T15:42:36.710 回答
2

大多数 Linux 发行版默认不安装内核头文件。寻找一个包 kernel-headers 或类似的东西。

于 2012-04-12T14:59:13.043 回答