2013-10-25 246 views
0

包括
#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); 

生成文件:在Linux设备驱动程序的简单程序

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 

使-C =>将做化妆, 在该路径/ 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有目标的所有:模块和目标模块,并有目标的清洁。 什么是obj-m?

回答

2

您最好阅读Linux设备驱动程序第3版(免费提供的http://oreilly.com/openbook/linuxdrive3/book/index.html)第24页的段落。

-C选项可以更改目录提供的一个。在那里,它找到了内核的顶层Makefile。然后,M =选项使得Makefile以试图建立模块目标($ PWD是包含了您当前目录的路径变量)之前移回模块的源目录。

OBJ-米是含有内核模块的清单,并建立(见https://www.kernel.org/doc/Documentation/kbuild/makefiles.txt)的变量。

1

你可以改变你的Makefile规则:

aoll: 
    (cd /usr/src/linux-headers-3.2.0-25-generic-pae/;echo $(PWD);make m=$(PWD) module) 
+0

感谢保罗·埃文斯。 – Angus

+0

为什么这被标记为“不是答案”?我看起来很好。 – LarsH

+0

@LarsH:我同意,这是一个答案,这只是错误的。 :-)问题在于'Makefile'中的三个单独的命令行由三个单独的shell命令运行。第一个'cd'运行,然后shell退出并返回到你所在的位置,第二个'echo'运行并打印工作目录,第三个'make'运行在错误的目录中。 – torek

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。

+0

感谢vinay hunachyal – Angus

相关问题