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)。