1

包括

#include<linux/module.h>
#include<linux/init.h>

int my_init(void){
        printk("<1> Angus : Module Insertion is successful!");
        return 0;
}

void my_cleanup(void){
        printk("<1> Angus : Module unloading successful!");
}

module_init(my_init);
module_cleanup(my_cleanup);

生成文件:

obj-m:=simple.o
aoll:
        make -C /usr/src/linux-headers-3.2.0-25-generic-pae/ M=$(PWD) modules
clean:

        make -C /usr/src/linux-headers-3.2.0-25-generic-pae/ M=$(PWD) clean

make -C => 会在make之前切换到目录,在这个路径/usr/src/linux-headers-3.2.0-25-generic-pae/我有Makefile,为什么是M=$(PWD)需要吗?它有什么作用,我可以在哪里检查 $PWD ?/usr/src/linux-headers-3.2.0-25-generic-pae/ 中的 Makefile 具有目标 all:modules 和目标模块,并且目标干净。什么是 obj-m ?

4

3 回答 3

3

您最好阅读Linux Device Drivers, 3rd edition(可在http://oreilly.com/openbook/linuxdrive3/book/index.html免费获得)一书第 24 页的段落。

-C选项使其将目录更改为提供的目录。在那里,它找到了内核的顶级 Makefile。然后,M=选项会导致 Makefile 在尝试构建模块目标之前移回模块源目录($PWD是包含当前目录路径的变量)。

obj-m是一个包含要构建的内核模块列表的变量(参见https://www.kernel.org/doc/Documentation/kbuild/makefiles.txt)。

于 2013-10-25T10:20:25.363 回答
1

您可以更改 Makefile 规则:

aoll:
    (cd /usr/src/linux-headers-3.2.0-25-generic-pae/;echo $(PWD);make m=$(PWD) module)
于 2013-10-25T10:18:15.373 回答
1

why is the M=$(PWD) needed ?

M= option causes that makefile to move back into your module source directory before trying to build the modules target。_ 反过来,这个目标是指在 obj-m 变量中找到的模块列表。

What is obj-m ?

上面的赋值说明有一个模块要从目标文件 hello.o 构建。从目标文件构建后,生成的模块名为 hello.ko。

于 2013-10-25T10:19:19.387 回答