#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);
Makefile:
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 =&gt;在做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和目标模块,并且目标是clean。 什么是obj-m?
答案 0 :(得分:2)
您最好阅读 Linux设备驱动程序,第3版(可在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)。
答案 1 :(得分:1)
您可以更改Makefile规则:
aoll:
(cd /usr/src/linux-headers-3.2.0-25-generic-pae/;echo $(PWD);make m=$(PWD) module)
答案 2 :(得分: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 对象文件。