linux 内核模块问题的 Makefile
Makefile for linux kernel module issue
我正在编写一个内核模块,它将成为我的中文 Arduino 的 driver。
我读过很多关于它的指南,它们中的 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 根本不起作用。
当我创建时,出现错误 "missing module.h"。但是我确实安装了headers。它们在 /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 编译它。
感谢您的回答。
我无法回答 .ko 模块问题。我不确定问题到底是什么。
但至于缺少分隔符错误,这是一个常见的Makefile问题。 Makefile 中的命令(下面的 $CC 行)必须以制表符开头。
要修复,只需在 $(CC) 行之前添加一个 TAB,如下所示:
CC=gcc MODFLAGS:= -O2 -Wall -DLINUX
module.o: module.c
$(CC) $(MODFLAGS) -c module.c
/ \
|
|
TAB
模块构建的 "standard 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 )
唯一使用的 headers 是 /lib/modules/uname -r
/build/include/.
并且没有``module.h´´:请输入#include <linux/module.h>
(或asm/module.h)。
我正在编写一个内核模块,它将成为我的中文 Arduino 的 driver。
我读过很多关于它的指南,它们中的 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 根本不起作用。
当我创建时,出现错误 "missing module.h"。但是我确实安装了headers。它们在 /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 编译它。
感谢您的回答。
我无法回答 .ko 模块问题。我不确定问题到底是什么。
但至于缺少分隔符错误,这是一个常见的Makefile问题。 Makefile 中的命令(下面的 $CC 行)必须以制表符开头。
要修复,只需在 $(CC) 行之前添加一个 TAB,如下所示:
CC=gcc MODFLAGS:= -O2 -Wall -DLINUX
module.o: module.c
$(CC) $(MODFLAGS) -c module.c
/ \
|
|
TAB
模块构建的 "standard 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 )
唯一使用的 headers 是 /lib/modules/uname -r
/build/include/.
并且没有``module.h´´:请输入#include <linux/module.h>
(或asm/module.h)。