【发布时间】:2015-10-23 22:29:39
【问题描述】:
我正在编写一个内核模块,它将成为我的中文 Arduino 的驱动程序。
我已经阅读了很多关于它的指南,其中的 Makefile 完全不同。其中一些只是不工作。我想了解如何以及为什么:)
比如我有一个简单的初学者代码:
#define MODULE
#define __KERNEL__
#include <module.h> // определения для модуля
#include <init.h> // module_init и module_exit
#include <kernel.h> // printk
MODULE_AUTHOR("...");
MODULE_DESCRIPTION("Test module for linux kernel");
int module_start()
{
printk("This is a test module startup message\n");
return 0;
}
void module_stop()
{
printk("Module is dead\n");
return;
}
module_init(module_start);
module_exit(module_stop);
我还有一个在手册中找到的 Makefile:
CC=gcc
MODFLAGS:= -O2 -Wall -DLINUX
module.o: module.c
$(CC) $(MODFLAGS) -c module.c
所以,据我所知,我的系统使用 .ko 文件作为模块。这是第一个问题。第二个是这个makefile 不起作用。
当我制作时,我收到错误“缺少 module.h”。但我当然安装了标题。它们位于/usr/src/linux-headers-(3.2.0-4-686-pae) 和/usr/src/linux-headers-(3.2.0-4-common)。
*pae 目录下没有module.h,但它在*common 目录下(大部分文件都在那里)。所以,我不能用 gcc 和 makefile 编译它。
感谢您的回答。
【问题讨论】:
-
我建议您尝试通过从命令行调用
gcc来构建模块。当它完美运行时,您可以编写一个 makefile 来自动化该过程。 -
嗯,看起来我不知道如何正确编译它...我收到错误“缺少 module.h”。使用 gcc 编译,带有这些参数 (gcc -O2 -W -Wall -Wstrict-prototypes -Wmissing-prototypes -isystem /lib/modules/
uname -r/build/include -c -o ard_module.o ard_module.c) -
而且,是的。我通过 apt-get install linux-headers-$(uname -r) 在 /usr/src 中安装了头文件 也许问题是我的系统是 x64 并且 gcc 试图在不同的目录中查找文件?那么,我应该怎么做才能解决它?
-
尝试在
gcc命令中添加“-I /usr/src”。 -
它没有帮助:c命令安装的头文件(apt-get install linux-headers-$(uname -r))在两个文件夹中:/usr/src/linux-headers-3.2 .0-4-686-pae 和 /usr/src/linux-headers-3.2.0-4-common。那么,如果你需要编译这个模块,你会使用什么命令,@Beta?
标签: c linux makefile driver kernel-module