有许多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下)。