驱动模块的编译
2015-12-05 23:19
741 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gchy99/article/details/50190373
驱动模块编译的Makefile分析
【个人总结】
构造内核源码树
内核源码树也就是内核源代码的逻辑结构,通俗的说就是编译过的内核。
要想为2.6.X以后的内核构造模块,必须在自己的系统中配置并构造好内核树(从编译模块的Makefile中可以看到,需要内核树定层面目录中的Makefile)。这一要求与先前的版本的内核不同,先前的内核只需要有一套内核头文件就够了。但因为2.6内核的模块要和内核源代码树中的目标文件连接,通过这种方式可以得到更加健壮的模块装载器,需要这些目标文件存在于内核目录树中。或者可以为运行的Linux系统加载模块,这在后续的Makefile中分析。
图1 模块所在目录的Makefile
当在驱动程序所在目录执行make时,输出结果如下:
linux@ubuntu:~/system_tran/drivers/hello$ make Makefile:1: KERNELRELEASE= make -C /lib/modules/3.2.0-23-generic-pae/build M=/home/linux/system_tran/drivers/hello modules make[1]: Entering directory `/usr/src/linux-headers-3.2.0-23-generic-pae' /home/linux/system_tran/drivers/hello/Makefile:1: KERNELRELEASE=3.2.0-23-generic-pae CC [M] /home/linux/system_tran/drivers/hello/hello.o Building modules, stage 2. /home/linux/system_tran/drivers/hello/Makefile:1: KERNELRELEASE=3.2.0-23-generic-pae MODPOST 1 modules CC /home/linux/system_tran/drivers/hello/hello.mod.o LD [M] /home/linux/system_tran/drivers/hello/hello.ko make[1]: Leaving directory `/usr/src/linux-headers-3.2.0-23-generic-pae'
由此可分析此目录下的Makefile,当makefile从命令行调用时,它注意到KENRELRELEASE变量未设置,在已安装的模块目录中存在一个链接符号,本makefile使用的是安装在虚拟机上的Linux系统,它指向内核的构造树(查看build的指向),在找到内核的源代码树后,这个makefile就会调用modules:目标,这个目标再次运行make($(MAKE)),进入KERNELDIR所指定的目录中,其中保存有内核的顶层makefile文件(另需研究此makefile),M=选项让改makefile在构造modules目标之前返回到模块源代码目录。然后,modules目标指向obj-m变量中设定的模块,这便是运行内核构造系统。在第二次读取模块源代码目录下的makefile时,他设置了obj-m,内核的makefile负责真正构造模块。
需继续研究:内核源码顶层makefile(make modules和make modules_install)。
相关文章推荐
- 如何编译linux驱动模块(转)
- 在Eclipse里面如何编译驱动模块
- linux下 驱动模块编译步骤
- 编译arm版本驱动模块
- 驱动模块的编译与安装
- 如何编译一个linux下的驱动模块(转)
- Linux 驱动模块编译,加载过程
- 驱动模块编译错误提示--implicit declaration of function ‘kmalloc’
- Linux驱动模块编译进内核中
- 如何编译一个linux下的驱动模块
- linux2.6下驱动模块编译问题
- 编译arm版本驱动模块
- 编译驱动模块时,出现“stack protector enabled but no compiler support”[解决办法]【转】
- 驱动模块编译错误提示--implicit declaration of function ‘kmalloc’
- 利用Makefile单独编译驱动模块文件
- 如何编译一个linux下的驱动模块(1)
- 简单的Linux 驱动模块编译,加载过程
- linux第一个驱动模块编译
- openwrt 编译驱动模块(在openwrt源代码外部任意位置编写代码,独立模块化编译.ko)
- 简单的Linux 驱动模块编译,加载过程