关于linux设备驱动程序的简单程序

时间:2013-10-25 10:10:20

标签: c linux makefile linux-kernel linux-device-driver

包括

#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?

3 个答案:

答案 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 对象文件。