来源:Baiwen Technology有大量的Linux内核源文件。
我不了解Makefile,Kconfig和.config之间的关系。
我不了解内核编译系统。
如果在编译和修改内核时遇到问题,我将无法开始。
知道如何配置内核,这些问题与Makefile,Kconfig,.config有关,下面简单介绍一下Makefile,Kconfig和.config。
希望能激发您的灵感。
三个功能:简单地说,去餐厅点餐:Kconfig是菜单,Makefile是方法,.config是您点的食物。
Makefile:文本文件,一种编译源文件的方法。
Kconfig:一个文本文件,内核的配置菜单。
.config:编译内核所基于的配置。
这三个语法:1. Makefile参考:linux-3.4.2 / drivers / Makefile功能:它用于定义将哪些内容编译为模块,哪些条件编译等。
顶层Makefile包含子目录Makefile。
(1)直接编译obj-y + = xxx.o表示xxx.o由xxx.c或xxx.s编译并直接编译到内核中。
(2)条件编译obj-$(CONFIG_HELLO)+ = xxx.o根据.config文件的CONFIG_XXX,确定是否将该文件编译到内核中。
(3)模块编译obj-m + = xxx.o表示xxx被编译为模块,即在执行make模块时将其编译。
2. Kconfig每个config菜单项都有一个类型定义:布尔类型,三态(内置,模块,已删除),字符串字符串,十六进制十六进制,整数。
功能:确定make menuconfig时显示的菜单项。
参考:linux-3.4.2 / drivers / leds / kconfig:config LEDS_S3C24XX三态“ Samsung S3C24XX GPIO LED的LED支持”;取决于LEDS_CLASS取决于ARCH_S3C24XX帮助该选项启用对连接到Samsung S3C24XX系列CPU(例如S3C2410和S3C2440)上的GPIO线的LED的支持。
LEDS_S3C24XX:配置选项的名称,前缀为“ CONFIG_”。
省略。
Tristate:指示该项目是被编程到内核还是模块中。
显示为:如果选择编译为内核模块,则将在.config中生成CONFIG_HELLO_MODULE = m的配置,如果选择Y,则将其直接编译到内核中,并使用CONFIG_HELLO_MODULE =的配置项y将在.config中生成。
Tristate之后的字符串是在make menuconfig期间显示的配置项目的名称。
bool:只能选择或不选择此类型。
它在make menuconfig中显示为[],这意味着它不能配置为模块。
Dependon:此选项取决于另一个选项。
仅选择从属项时,将出现在当前配置项目的提示消息,并将当前配置项可以被设置。
选择:反向依赖。
选择此选项时,将同时选择在选择之后定义的项目。
help:帮助信息。
目录层次结构迭代:Kconfig中有一个类似的语句:源“ drivers / usb / Kconfig”,用于包含(或嵌套)新的Kconfig文件,以便每个目录管理自己的配置内容,而不必编写所有文件这些配置在同一文件中,方便修改和管理。
3. .config参考:linux-3.4.2 / .config通过分析前两个文件,.config的含义非常清楚:内核编译参考文件,检查其中的内容以了解哪些驱动程序被编译到内核中。
有3种配置内核的方法(选择一种):(1)make menuconfig(2)make xxx_defconfig(3)直接修改.config注意:如果直接修改.config,它可能不会生效,因为某些配置可能具有依赖关系,Make将根据依赖关系检查规则,有时直接修改.config无效,因此不建议直接修改它。
上面的内容可能有点抽象,下面的示例说明了这一点:编写一个简单的入口函数以输出hello world的驱动程序并将其编译到内核中。
步骤:(1)在驱动程序目录中创建一个新的hello文件夹,该文件夹实现了hello.c,Makefile和Kconfig。
hello.c:#include #include #include static int first_drv_init(void)printk(" ------------------ hello world!--------- ----------&“;); return 0;} static void first_drv_exit(void){printk(“ ------------------退出hello world!------------- -------");} module_init(first_drv_init); module_exit(first_drv_exit); MODULE_LICENSE(“ GPL”);生成文件:obj-$(CONFIG_HELLO)+ = Hello.o Kconfig:配置HELLO三态“ Hello World for fengyuwuzu”;帮助fengyuwuzu的配置帮助HELLO确定名称:CONFIG_HELLO。
fengyuwuzu的Hello World:确定在make menuconfig中显示的名称(2)修改上层的Makefile和Kconfig(在Linux-3.4.2 / drivers下)