我正在编写一个内核模块,它将作为我的中文 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”。但我确实安装了 header 。它们位于/usr/src/linux-headers-(3.2.0-4-686-pae) 和 /usr/src/linux-headers-(3.2.0-4-常见)
。
*pae目录下没有module.h,但在*common目录下(大部分文件都在那里)。所以,我无法使用 gcc 或 makefile 来编译它。
感谢您的回答。
最佳答案
模块构建的“标准 Makefile”是:
obj-m := hello-1.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.* *.symvers *.order
(从 hello-1.c 创建 hello-1.ko )
唯一使用的 header 是/lib/modules/uname -r
中的 header /构建/包含/。
并且没有“module.h”:请输入 #include <linux/module.h>
(或 asm/module.h )。
关于c - Linux内核模块的Makefile问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33312323/