探讨内核的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

linux内核 kconfig_内核管理器_内核kconfig

按照.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 电子书,何必把这些配置都写在同一个文件里,便捷更改和管理。

内核管理器_linux内核 kconfig_内核kconfig

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

内核管理器_linux内核 kconfig_内核kconfig

#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编辑:刘遄,审核员:暂无