linux内核的Makefile和Kconfig,以及如何在内核中添加自己的代码
一、linux内核中是如何将各个 目录树 中的文件组织起来编译的?并且根据需要编译特定功能的内核?
在linux内核中,有这样两种文件:Makefile,Kconfig。这两种文件分布在内核目录的各个级目录内(每一级都对应都有),分布在各个级的Kconfig决定了内核要实现某一功能,每一步该怎么走,每个Kconfig描述了所属目录源文档相关的 内核配置菜单,就是我们执行make menuconfig命令后产生的配置菜单,这个菜单包含(连接)多层,每个层次都是由各个目录中的Kconfig产生的。我们可以根据需要来选择如何编译内核(裁剪),然后将配置的结果保存到“.config”文件内。最后在执行Makefile时根据 .config 的结果理实现内核的编译。
二、Kconfig
Kconfig用来加链接各个层的树枝
1、结构+格式:
a)、非最后一层:
menu "Device Drivers"
source "driver/heihei/Kconfig"(顶层到该层的目录/本层的Kconfig)
endmenu
b)、最后一层
menu “菜单描述”
config XXXXXX
bool “具体功能描述”---类型定义
depends on 依赖条件
default x(根据bool/int/hex/tristate/string而定)
help
解释说明
endmenu
2、变量定义:
bool(布尔类型) y/n;int;string;核心;tristate n/m/y(移除/模块/内建)
config HAHA
bool “HAHA test module”
bool类型只能选中和不选中;
tristate:多了一个编译成模块,当编译成内核模块,则会在.config文件内生成一个CONFIG_HAHA=m的配置最后编译后回生成一个在开发板上可执行的.ko文件;假如内建就直接编译成内核--在.config内生成CONFIG_HAHA=y。
3、依赖depends on
即一个限制条件,意识是 此菜单的出现是否依赖与另一个定义
效果是:如果 依赖菜单 没有被选到 则 该菜单不会出现
4、help解释说明该菜单的功能
四、Makefile:
1、做嵌入式开发,我们一般操作Makefile是操作drivers里面的东西,来达到对树枝的构建,将驱动做到菜单内
a)、非最后一层
obj-y += heihei/(+=目录)
b)、最后一层的
obj-$(CONFIG_XXX) += xxx.o(+=相当于增加树枝)
五、 .config
对与内核来说,.config的执行是编译的第一步。.config文件位于源代码根目录下,描述了所有内核配置选项。可以借助内核配置工具来选择这些选项。每个内核配置选项都有对应的名字和变量值--n/m/y。当配为y就会编译到内核 代码中(系统中),当配为m就会以模块的方式编译到内核中。
代码都有区分:对应到菜单
所有的配置都会产生在上述菜单中
六、向自己内核中添加程序
1:文件准备
1.1、将编写好的源代码复制到linux内核源代码相应的目录中。
1.2、在该目录中的Kconfig文件中增加新源代码对应的编译配置选项
1.3、在该目录中的Makefile文件中添加信代码的编译语句
2、在linux内核drivers/目录中增加目录和子目录
myDriver$ tree
|– Kconfig
|– Makefile
|– key
| |– Kconfig
| |– Makefile
| `– key.c
|– led
| |– Kconfig
| |– Makefile
| `– led.c
`— test.c
分别制作对应的Makefile和Kconfig文件