模块测试函数基于linux2.6

#include <linux/init.h>

#include <linux/module.h>

#include <linux/kernel.h>

static int hello_init(void)

{

   printk("....\n");

   return 0;

}

static void hello_exit()

{

   printk("...");

}

module_init(hello_init);

module_exit(hello_exit);

 

MODULE_LICENSE("Dual BSD/GPL);

 

Makefile文件:

obj-m := test.o

KDIR := /lib/modules/$(shell uname -r)/build    $(KDIR)指定了内核源码的路径,"M="表示这是个外部模块,M=$(PWD) 指定了该模块文件所在的路径。

PWD :=$(shell pwd)

default:

    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:

   rm -rf *.ko

    rm -rf *.mod.*

    rm -rf .*.cmd

    rm -rf *.o

insmod test.ko,rmmod test.ko

 如果是多个源文件编译出一个模块,假设模块名是test.ko,那么源文件名不能有test.c。注:2.6下编译模块的详细方法请参考linux/Documentation/kbuild/modules.txt。


 

 ifneq ($(KERNELRELEASE),)

  obj-m := mytest.o

  mytest-objs := file1.o file2.o file3.o

  else

  KDIR := /lib/modules/$(shell uname -r)/build

  PWD := $(shell pwd)

  default:

  $(MAKE) -C $(KDIR) M=$(PWD) modules

  endif

  解释为:

  KERNELRELEASE

  是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,

  所以make将读取执行else之后的内容。如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C

  $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD)

  表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去

  解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句,

  指明模块源码中各文件的依赖关系,以及要生成的目标模块名。mytest-objs := file1.o file2.o

  file3.o表示mytest.o 由file1.o,file2.o与file3.o 连接生成。obj-m :=

  mytest.o表示编译连接后将生成mytest.o模块。

Linux内核的Makefile分为5个部分:
        
     Makefile                 顶层Makefile
     .config                  内核配置文件
     arch/$(ARCH)/Makefile    具体架构的Makefile
     scripts/Makefile.*       通用的规则等。面向所有的Kbuild Makefiles。
     kbuild Makefiles         内核源代码中大约有500个这样的文件

顶层Makefile阅读的.config文件,而该文件是由内核配置程序生成的。
顶层Makefile负责制作:vmlinux(内核文件)与模块(任何模块文件)。制作的过程主要是
通过递归向下访问子目录的形式完成。并根据内核配置文件确定访问哪些子目录。顶层
Makefile要原封不动的包含一具体架构的Makefile,其名字类似于 arch/$(ARCH)/
Makefile。该架构Makefile向顶层Makefile提供其架构的特别信息。
每一个子目录都有一个Kbuild Makefile文件,用来执行从其上层目录传递下来的命令。
Kbuild Makefile从.config文件中提取信息,生成Kbuild完成内核编译所需的文件列表。
scripts/Makefile.*包含了所有的定义、规则等信息。 

目标定义是Kbuild Makefile的主要部分,也是核心部分。主要是定义了要编译的文件,所有的选项,以及到哪些子目录去执行递归操作。
        最简单的Kbuild makefile 只包含一行:
        例子:
          obj-y += foo.o
        该例子告诉Kbuild在这目录里,有一个名为foo.o的目标文件。foo.o将从foo.c或foo.S文件编译得到。
        如果foo.o要编译成一模块,那就要用obj-m了。所采用的形式如下:
        例子:
          obj-$(CONFIG_FOO) += foo.o
        $(CONFIG_FOO)可以为y(编译进内核) 或m(编译成模块)。如果CONFIG_FOO不是y和m,那么该文件就不会被编译联接了 

 

 Kbuild能够识别用于组成目标文件的后缀-objs和后缀-y。这就让Kbuild Makefile可以通过使用 CONFIG_ 符号来判断该对象是否是用来组合对象的。

 在 obj-* 中所列文件是用来编译模块或者是联接到特定目录中的 built-in.o。同样,也可以列出一些将被包含在lib.a库中的文件。在 lib-y 中所列出的文件用来组成该目录下的一个库文件。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章