linux内核学习-编译架构-1.编译过程简单说说和kconfig文件介绍

随着学习的深入,有必要了解下编译的过程。寻找到一个出路。

前言
这篇文章知道C语言的“宏语句”的含义。

一、编译过程简单说说

从内核的编译过程,我们知道:
1.首先要有一个.config文件(这个文件通过Make menuconfig产生)。
2.make命令根据.config和Makefile文件,最终生成vmlilnux这个内核文件。
3.vmlinux压缩成zImage。

二、.config文件来龙去脉

在源码的编写时候,程序员需要写一个叫Kconfig的文件。在整个kernel源码中有很多的Kconfig文件并且他们是以“树状”的形式,层层联系起来(是联系,不是依赖)。
kbuild工具(源码中的一个程序)会从某些指定的目录(源码的顶级目录结构是规范好的)开始,搜索源码中的所有Kconfig文件,然后配合Make menuconfig将内核可以配置的东西都呈现出来,用户根据自己的需求,配置好内核。最终保存为.config文件。

当然这里提一点:整个内核很大,所有选项一项一项的配置完,然后再生成.config文件是非常难的事情。所以供应商一般都会给一个样板.config文件,make menuconfig会自动加载相关配置。我们只需要做小修改就行。

三、.config文件

打开.config文件,会发现,里面都是一些类似的“宏定义”内容。没错,它就类似一种开关的作用。告诉make我要什么功能。记得编译进去。
所以在看Makefile文件的时候,发现一些变量找不到的定义的,可以到.config文件里面找找。

四、Kconfig文件

Kconfig位于kernel源码内大部分的文件夹中,是一种特殊格式的文件,负责提供kernel各个功能的配置选项。
文件的组织方式如下所示,编译的时候传入arch参数,找到对应的kconfig。文件通过source的方式引入新的kconfig文件。通过解析后,就可以形成menuconfig的组织形式
在这里插入图片描述

比如进行驱动移植等工作时,有时需要自己添加Kconfig中的一个配置项,从而将某个设备驱动添加到内核的配置项目中。
需要注意的是,Kconfig仅仅负责提供配置选项本身,而不提供各选项的值,

下面我们将以Block devices为例,剖开这层面纱。
在这里插入图片描述
在Device Drivers–》Block devices里面。在这里插入图片描述
同时代码对应drivers–》block目录下的Kconfig
在这里插入图片描述
1.看Kconfig的第5行,对应是menuconfig,也就是说这个Kconfig是以一个单独的页面单独展开。而config则代表的是一个配置选项。
2.而被 if BLK_DEV和 endif # BLK_DEV括起来的这些配置选项,就是Block devices菜单内的子选项
3.3.souce有点include的意思,每一个Kconfig都会source引入其所有子目录下的Kconfig,从而保证了所有的Kconfig项目都被包含进menuconfig中。这个也告诉我们:如果自己在linux内核中添加了一个文件夹,一定要在这个文件夹下创建一个Kconfig文件,然后在这个文件夹的上一层目录的Kconfig中source引入这个文件夹下的Kconfig文件
4.menuconfig或者config后面空格隔开的类似于DM9000和NETDEVICES 的就是这个配置项的配置项名字。配置项名字会被很多文件所引用(有点像宏定义),比如前面添加CONFIG_后就构成了.config中的配置项名字
5.bool或tristate后面跟着的字符串就是这些配置项在menuconfig的显示内容
6.bool表示该配置项只能配置Y和N,对应menuconfig中的[ ];而tristate表示该配置项可以被配置为Y,N,M,对应menuconfig中的<>;如图所示
7.depends 的含义是依赖的意思,就比如上面的配置项DM9000_16BIT,它依赖于配置项DM9000,如果配置项DM9000是N,那么DM9000_16BIT无论配置为任何值,都无效了;另外,依赖是层层递进的,如果依赖的依赖无效,也会导致配置项无效。同时依赖无效的话还会导致make menuconfig中配置项的消失
8.depends并不要求依赖的配置项一定是一个,可以是多个,而且还可以有逻辑运算(比如上面的!UML)。这种时候只要依赖项目运算式子的裸机结果为真则依赖就成立

五、实例1:

需要编译这个ttyprink的功能,在drivers/char目录中包含了TTY_PRINTK设备驱动的源代码drivers/char/ttyprintk.c。而在该目录的Kconfig文件中包含关于
TTY_PRINTK的配置项:
在这里插入图片描述
可以看到TTY_PRINTK依赖EXPERT和TTY两个配置项,也就是说这两个配置项没有打开,TTY_PRINTK是看不到的。通过查找,还真的在Device Drivers->Character devices中找不到TTY_PRINTK这个项。通过查找源码,找到EXPERT这个项对应的Kconfig文件在/init/Kconfig。默认是no的,看这个文件的头部,知道其对应根目录的General setup菜单。打开后找到
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选择上,然后再去看TTY_PRINTK就可以找到有了。
在这里插入图片描述

六、实例2:

假设想把自己写的一个flash的驱动程序加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?

可以分三步:

第一:将你写的hello.c 文件添加到/drivers/char/ hello目录下。

第二:修改/drivers/char/ hello目录下的kconfig文件:

config HELLO_MODULE
tristate "hello-tristate"
default y
help
        this is help test

第三:修改该目录下makefile文件。
添加如下内容:

obj-$(CONFIG_HELLO_MODULE) += hello.o

第四:修改上层目录/drivers/char中Kconfig文件

在这里插入图片描述

这样,当你运行make menucofnig时,你将发现 hello-tristate选项,如果你选择了此项。

该选择就会保存在.config文件中。体现为
在这里插入图片描述
这将是在hello/Makefile中

obj-$(CONFIG_HELLO_MODULE) += hello.o
等价为
obj-y += hello.o

系统在调用hello下的makefile 时,将会把 hello.o 加入到内核中。即可达到你的目的。

七、实例3

为演示Kconfig不同的数据类型的效果,编写如下例程:
Kconfig文件:

config HELLO_MODULE
tristate "hello-tristate"
default y
help
        this is help test
 
 
config HELLO_MODULE2
bool "hello-bool"
default y
help
        this is help test
 
 
config HELLO_MODULE3
string "helllo-string"
default "str-test"
 
 
config HELLO_MODULE4
hex "hello-hex"
 
 
config HELLO_MODULE5
int "hello-int"

在这里插入图片描述
最终生成的.config文件如下
在这里插入图片描述

可以看到,会自动在名字的前面加上CONFIG_这样的关键字。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值