谈论内核的Makefile,Kconfig和.config文件

有许多Linux内核源文件。

我不了解Makefile,Kconfig和.config之间的关系。

我不了解内核编译系统。

如果在编译和修改内核时遇到问题,我将无法开始。

我不知道如何编译写入内核的驱动程序或如何配置内核。

这些问题都与Makefile,Kconfig和.config有关。

让我们简要地谈一下Makefile,Kconfig和.config。

希望能激发您的灵感。

三个角色:简单地说,去餐厅点餐:Kconfig是菜单,Makefile是练习,.config是您点的食物。

Makefile:文本文件,一种编译源文件的方法。

Kconfig:一个文本文件,内核的配置菜单。

.config:编译内核所基于的配置。

三个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菜单项都有类型定义:布尔类型,三态(内置,模块,已删除),字符串字符串,十六进制十六进制,整数整数。

功能:确定在进行menuconfig时显示的菜单项,请参阅:linux-3.4.2 / drivers / leds / kconfig:config LEDS_S3C24XX三态“ Samsung S3C24XX GPIO LED的LED支持”。

取决于LEDS_CLASS是否启用对LED的支持该ARCH_S3C24取决于与Samsung S3C24XX系列CPU(例如S3C2410和S3C2440)上的GPIO线连接的ARCH_S3C24。

LEDS_S3C24XX:配置选项的名称,前缀“ CONFIG_”。

被省略。

Tristate:指示该项目是被编程到内核还是模块中。

显示为:如果选择编译为内核模块,则将在.config中生成CONFIG_HELLO_MODULE = m的配置,如果选择Y,则将其直接编译到内核中,并使用CONFIG_HELLO_MODULE =的配置项y将在.config中生成。

Tristate之后的字符串是在make menuconfig期间显示的配置项目的名称。

布尔:只能选择或不选择此类型。

它在make menuconfig中显示为[],这意味着它不能配置为模块。

取决于:此选项取决于另一个选项。

仅选择从属项时,将出现在当前配置项目的提示消息,并将当前配置项可以被设置。

选择:反向依赖性。

选择此选项时,将同时选择在选择之后定义的项目。

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 Tristate“ Hello World for fengyuwuzu”帮助帮助配置HELLO确定名称:CONFIG_HELLO。

fengyuwuzu的Hello World:确定make menuconfig时显示的名称(2)修改上层的Makefile和Kconfig(在Linux-3.4.2 / drivers下)。

产品知识/行业、品牌资讯