核心:学习过数据结构的童鞋应该知道,对于一棵非标准树,还是有办法将其进行遍历的,只是算法比较复杂而已。那么在Linux内核源码的这棵树,就是通过Kconfig文件建立各层子目录之间的连接,通过Makefile文件来选择各个目录下的对应的文件是否被编译,而.config文件就像是作为总控制台吧,控制着Makefile文件去编译指定的程序代码文件(主要是C和汇编)。而这一切控制关系是由Kconfig文件建立起来的。
名词解释
在Linux内核中,添加驱动代码一般有3部:
- 将代码拷贝到Linux内核代码恰当的地方
- 新建或者修改对应的kconfig文件—涉及到Kconfig的语法
- 新建或修改对应的Makefile文件–涉及到Makefile的语法
1.deconfig 文件
一般由平台厂商提供,内核编译用做.config的参考,注意:如果,缺少该文件,无法进行编译。
文件位于:\kernel…\arch\arm\configs\xxx_defconfig
2.kconfig文件
- Linux内核如此庞大(几万个文件),目录又分为很多层,它是如何将各层目录下的文件关联起来的?
- 分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。
3.makefile
分布在各个目录下,用于集成编译。
4.config 文件
-
在内核编译时,主Makefile调用这个.config,用于或者用于的内核编译配置。当我们在内核源码目录下输入make menuconfig时,在出现的菜单界面中选择一项时,它会自动更新.config相应项的值。如果我们没有选择,则会在.config问下插入一行注释(# CONFIG_TOUCHSCREEN_GT9xx is not set)
-
基于firefly-rk3288-linux_defconfig文件生成了基础的,默认的.config配置文件,此文件的内容就包含了架构相关的东西,所以在进行Linux内核源码的编译时,根据.config文件的基本配置,寻找架构相关的代码进行编译和设备相关的代码进行编译。总之一起而已.config这个控制台为准。
几个遇到问题
1、在编译内核前,执行命令:make menuconfig的意义为何?
- make menuconfig就是以菜单的形式打开内核源码的树形结构,然后程序员在默认配置的基础上自行配置和选择需要编译的模块代码。
2、问题4.编译内核时,执行命令:make zImage的意义为何?
- 执行编译命令后,通过.config文件、Kconfig文件和Makefile文件,就可以有规律有选择的去编译源代码了。
3、内核中各层目录下的Makefile文件和Kconfig文件是如何编写的
- 首先我们先确定一点,在Linux内核源码的各层目录下。都存在一个Kconfig文件和一个Makefile文件,.config文件存在顶层目录
可以参照下面博主的步骤做下小demo(自己写驱动的方式)
参考链接1
参考链接2
其实大部分的驱动都是已经写好的驱动,且makefile和kconfig都写好了,你需要做的,就是最后的一步啦!
选择驱动编译的形式:
1、不编译N
2、编译成镜像文件(编译成内核)Y
3、编译成单独的模块M(一般都是单独的驱动模块调试好,才驱动文件把它放在内核源码下,接着编译成镜像文件)
最后的最后在你make menuconfig完成配置后,你会在顶层的目录下的.config文件里查找到你是否配置好的信息,(牛掰的你也许可以直接一步到胃,直接干.config文件,只要你足够强~~~~)