探讨内核的Makefile、Kconfig和.config文件
Linux内核源码文件繁杂,搞不清Makefile、Kconfig、.config间的关系,不了解内核编译体系,编译更改内核有问题无从下手,自己写的驱动不晓得如何编进内核,不晓得如何配置内核,这种问题都和Makefile、Kconfig、.config有关,下边简单说说Makefile、Kconfig和.config。希望对你有启发。
二者的作用:
简单来说就是去餐厅点菜:Kconfig是菜单linux内核 kconfig,Makefile是做法,.config就是你点的菜。
Makefile:一个文本方式的文件,编译源文件的方式。
Kconfig:一个文本方式的文件linux内核 kconfig,内核的配置菜单。
.config:编译内核所根据的配置。
二者的句型
Makefile
参考:linux-3.4.2/drivers/Makefile
作用:拿来定义什么内容作为模块编译,什么条件编译等。子目录Makefile被顶楼Makefile包含。
(1)直接编译
obj-y+=xxx.o
表示由xxx.c或xxx.s编译得到xxx.o并直接编进内核。
(2)条件编译
obj-$(CONFIG_HELLO)+=xxx.o
按照.config文件的CONFIG_XXX来决定文件是否编进内核。
(3)模块编译
obj-m+=xxx.o
表示xxx作为模块编译,即执行makemodules时就会被编译。
2、Kconfig
每位config菜单项都有类型定义:bool布尔类型、tristate三态(内建、模块、移除)、string字符串、hex十六补码、integer整型。
作用:决定makemenuconfig时展示的菜单项,
参考:linux-3.4.2/drivers/leds/kconfig:
configLEDS_S3C24XX
tristate"LEDSupportforSamsungS33CC2424XXGPIOLEDs"
dependsonLEDS_CLASS
dependsonARCH_S3C24XX
help
ThisoptionenablessupportforLEDsconnectedtoGPIOlines
onSamsungS33CC2424XXseriesCPUs,suchastheS3C2410andS3C2440.
LEDS_S3C24XX:配置选项的名称,省略了前缀"CONFIG_"
Tristate:
表示该项是否编进内核、编成模块。显示为,如果选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,选择Y就是直接编进内核,会在.config中生成一个CONFIG_HELLO_MODULE=y的配置项。Tristate后的字符串是makemenuconfig时显示的配置项名称。
bool:
这种型只能选中或不选中,makemenuconfig时显示为[],即难以配置成模块。
dependon:
该选项依赖于另一个选项,只有当依赖项被选中时,当前配置项的提示信息就会出现,才会设置当前配置项。
select:
反向依赖关系,该选项选中时linuxtar,同时选中select前面定义的那一项。
help:
帮助信息。
目录层次迭代:
Kconfig中有类似句子:source"drivers/u***/Kconfig",拿来包含(或嵌套)新的Kconfig文件,促使各个目录管理各自的配置内容linux 电子书,何必把这些配置都写在同一个文件里,便捷更改和管理。
3、.config
参考:linux-3.4.2/.config
通过前俩个文件的剖析,.config的涵义已然很清晰:内核编译参考文件,查看上面内容可以晓得什么驱动被编译进内核。
配置内核方法有3种(任选其三):
(1)makemenuconfig
(2)makexxx_defconfig
(3)直接更改.config
注意:倘若直接更改.config,不一定会生效,由于有些配置可能存在依赖关系,make时会依照依赖关系,进行规则的检测,直接更改.config有时无效,所以不推荐直接更改。
以上可能有点具象,下边举例说明:
写一个简单的入口函数输出helloworld的驱动并编译进内核。
步骤:
(1)在drivers目录下新建hello文件夹,上面实现hello.c、Makefile、Kconfig。
hello.c:
#include
#include
#include
staticintfirst_drv_init(void)
printk("------------------helloworld!--------------------");
return0;
staticvoidfirst_drv_exit(void)
printk("------------------exithelloworld!--------------------");
module_init(first_drv_init);
module_exit(first_drv_exit);
MODULE_LICENSE("GPL");
Makefile:
obj-$(CONFIG_HELLO)+=hello.o
Kconfig:
configHELLO
tristate"HelloWorldforfengyuwuzu"
help
Helloforfengyuwuzu
configHELLO决定名子:CONFIG_HELLO。
HelloWorldforfengyuwuzu:决定了在makemenuconfig时显示的名子
(2)更改上一级(Linux-3.4.2/drivers下)的Makefile、Kconfig。
Makefile:
obj-y+=hello/
Kconfig:
source"drivers/hello/Kconfig"
(3)makemenuconfig
(4)makeuImage再烧讲到开发板。
查看内核启动Log,伟大的helloworld下来了!说明hello.c成功编进内核
欢迎参考本文实验,相信你对内核的组织结构会有更清晰的认识。
本文原创地址://gulass.cn/gdmkcqsbyxgl.html编辑:刘遄,审核员:暂无