Linux设备驱动初探_多源文件Makefile

来源:互联网 发布:企业网络安全管理方案 编辑:程序博客网 时间:2024/04/29 03:44

首先介绍一下__init这个标志在驱动源文件中的作用吧。

内核中带“__”的函数:内核API函数具有这种名称的,通常都是一些接口的底层函数,应该谨慎使用。实质上,这里的双下划线就是要告诉程序员:谨慎调用,否则后果自负。以__init为例,__init表明该函数仅在初始化期间使用。在模块被装载之后,模块装载器就会将初始化函数扔掉,这样可以将函数占用的内存释放出来,已做它用。注意,不要在结束初始化之后仍要使用的函数(或者数据结构)上使用__init、__initdata标记。这里摘抄网上的一段总结,如下。

__init, __initdata等属性标志,是要把这种属性的代码放入目标文件的.init.text节,数据放入.init.data节──这一过程是通过编译内核时为相关目标平台提供了xxx.lds链接脚本来指导ld完成的。
   对编译成module的代码和数据来说,当模块加载时,__init属性的函数就被执行;
   对静态编入内核的代码和数据来说,当内核引导时,do_basic_setup()函数调用do_initcalls()函数,后者负责所有.init节函数的执行。
   在初始化完成后,用这些关键字标识的函数或数据所占的内存会被释放掉。
1) 所有标识为__init的函数在链接的时候都放在.init.text这个区段内,在这个区段中,函数的摆放顺序是和链接的顺序有关的,是不确定的。 
2) 所有的__init函数在区段.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些__init函数指针,并在整个初始化完成后,释放整个init区段(包括.init.text,.initcall.init等),注意,这些函数在内核初始化过程中的调用顺序只和这里的函数指针的顺序有关,和1)中所述的这些函数本身在.init.text区段中的顺序无关。 


接下来说明一下如果有多个源文件来编译链接组成最终的驱动.ko文件,那么他们的Makefile该如何书写。

内核模块的编译与应用程序的编译有些区别,此hello world模块的编译命令为:

make -C /xxx/xxx/kernel_src/ M=$(PWD) modules

其中/xxx/xxx/kernel_src/ 为已经配置编译过的内核源码路径,ubuntu下一般在/lib/modules/$(shell uname -r)/build目录下。

在编写应用程序时,我们一般都是由多个源文件组成的,这个时候编译肯定就不能继续使用命令行编译了,就要使用到Makefile。同样,驱动模块的编译也需要使用的makefile,下面就是一个在编译含有多个源码文件的驱动模块时可以参考的Makefile文件。


在编写应用程序时,我们一般都是由多个源文件组成的,这个时候编译肯定就不能继续使用命令行编译了,就要使用到Makefile。同样,驱动模块的编译也需要使用的makefile,下面就是一个在编译含有多个源码文件的驱动模块时可以参考的Makefile文件。


  1. ifndef CROSS_COMPILE  
  2. export CROSS_COMPILE ?=arm-none-linux-gnueabi-  
  3. endif  
  4.   
  5. ARCH ?= arm  
  6.   
  7. SRC_DIR := /home/XXX/XXX  
  8. OBJ_DIR  := $(SRC_DIR)/obj  
  9. PWD := $(shell pwd)  
  10.   
  11. LINUX_SRC ?= /home/XXX/kernel  
  12.   
  13. CFG_INC = -I$(SRC_DIR) \  
  14.     -I$(DIR_A) \  
  15.     -I$(DIR_B)  
  16.   
  17. CFG_FLAGS += -O2  
  18. EXTRA_CFLAGS  += $(C_FLAGS) $(CFG_INC) $(CFG_INC)  
  19.   
  20. obj-m := mymodule.o  
  21.   
  22. mymodule-objs := a.o  
  23. mymodule-objs += b.o  
  24. mymodule-objs += c.o  
  25.   
  26. modules:  
  27.     @make ARCH=$(ARCH) -C $(LINUX_SRC) M=$(PWD) modules  
  28.   
  29. clean:  
  30.     @echo "cleaning..."  
  31.     rm -f mymodule.ko mymodule.o mymodule.mod.* modules.order Module.symvers  
  32.     rm -f $(mymodule-objs)  

0 0
原创粉丝点击