社区编辑申请
注册/登录
同驱动编译相关的三类文件:Makefile、Config和Kconfig 原创 精选
开发 开发工具
在本文中,我将主要说明该如何修改与驱动编译相关的三类文件Makefile、Config和Kconfig,并简要阐述这三者的关系。

作者 |赵青窕

审校 |孙淑娟

在驱动开发时,有时候让我们最头疼的不是驱动代码的编写,反而是代码的编译。目前有不少同事向我反馈,已经修改了对应的Config和Makefile文件,但驱动仍无法被正常编译到,这种问题经排查是因为没有修改对应的Kconfig而导致的。

在本文中,我将主要说明该如何修改与驱动编译相关的三类文件Makefile,Config和Kconfig,并简要阐述这三者的关系。

1.如何修改这三类文件从而编译我们的驱动

制作文件

我们可以通过Makefile文件,来编写驱动编译的规则。下面是四种常见的较为简单的编译规则,此处假如我们的驱动文件是test.c,且默认已正常包含需要的库,头文件等,仅在此处说明Makefile与config和Kconfig的关系,不过多说明Makefile更多细节:

  • obj –y += test.o
  • obj-n += test.o
  • obj-m += test.o
  • obj-($CONFIG_TEST) += test.o

obj-y表示需要把test.c编译进内核,当我们不知道如何配置config和Kconfig,或者是配置后但驱动仍无法编译到,就可以采用这种配置方式。这种方式的好处就是仅仅在Makefile中编写规则,且Makefile能被编译系统加载到,其对应的驱动不再受config和Kconfig约束,就可以被编译进内核。

obj-n表示默认不编译,该配置几乎用不到,毕竟一般情况下,我们不会写一个不进行编译的代码。但当多项目,或者多平台复用代码时,可能会根据项目或者平台来进行选择项的编译,此时不需要编译的代码就可以采用obj-n的方式来进行配置。

obj-m表示默认编译为模块,需要注意当执行make模块时才会被编译。当发现驱动没有进行编译时,可以查看是否是采用obj-m,且是以执行make模块的方式进行编译的。

obj-($CONFIG_TEST),我把该方式称之为条件编译,根据CONFIG_TEST的配置来进行编译,我们可以在项目对应的config中配置CONFIG_TEST为m,y或者n,从而obj-($CONFIG_TEST)可变为obj-m,obj-y,obj-n。通常情况下,均采用obj-($CONFIG_TEST) += test.o的方式进行配置。

配置

实际上config文件分为两大类,此处我以kernel-4.19,arm平台为例来说明,其中一类是位于kernel-4.19/arch/arm/configs,另一类是一个隐藏文件,位于kernel-4.19/.config路径下,这两类文件格式相同,如下图所示:

图片

从上图可以看出,该类文件就是定义了一些配置项,在Makefile小节说到的CONFIG_TEST就是需要在config文件中进行配置,当采用文件kernel-4.19/arch/arm/configs进行配置时,比较简单,直接打开对应的config文件,增加CONFIG_TEST=(y/n/m)即可。当采用kernel-4.19/.config配置时,建议不要直接修改.config文件,可以采用make menuconfig的方式来进行配置,该命令将在后面的小节中进行描述。

在Linux内核编译时,是根据.config文件,结合Makefile进行驱动编译的,kernel-4.19/arch/arm/configs会通过其相应的make命令生成对应的.config。此时设想一下,假如我们的kernel-4.19/arch/arm/configs和.config都配置了CONFIG_TEST,那最后CONFIG_TEST是采用哪种配置呢?实际上kernel-4.19/arch/arm/configs下的配置会覆盖.config中的配置,因此我个人喜欢直接修改kernel-4.19/arch/arm/configs。但当kernel-4.19/arch/arm/configs中没有配置CONFIG_TEST时,.config中会采用Kconfig中配置的CONFIG_TEST作为默认值。

Kconfig

此处仍以CONFIG_TEST为例来说明,Kconfig共有两处需要修改,其一是该test.c对应的Kconfig文件,其二是要包含该Kconfig文件。

下面是对应的Kconfig配置方式,其中第一行中的config TEST与config中CONFIG_TEST是对应的,注意在Kconfig中需要去掉CONFIG,仅仅配置为TEST;第二行中的tristate表示该项是否编进内核或者编成模块,倘若第二行中的tristate改为bool,则可以配置test.c是否编译进内核,但不能以模块的形式编译;第三行设置了默认值,此处表示默认编译进内核;第四行是说明信息。

config TEST
tristate "THIS IS TEST DRIVER"
default y
help
this is just for test

当我们配置好Kconfig,则需要把Kconfig包含进系统中。假如Kconfig位于路径drivers/input/test/下,则采用语句源 “drivers/input/test/Kconfig”即可包含该Kconfig文件。

2.Makefile、Config和Kconfig三者间的关系

其中一种内核裁剪的办法就是通过命令make menuconfig,该命令就会获取Kconfig的信息,然后以下图中的形式从终端中展示出来。

图片

上图看上去同我们在饭店看到的菜单类似,因此我们可以把Kconfig比喻为菜单,Makefile比喻为菜谱,config比喻为我们点的菜,make menuconfig就是展示菜单的命令。

当我们编写好驱动代码之后,需要编写菜谱,并把该驱动添加到菜单中,然后通过config或者make menuconfig进行点菜,这样驱动才能进行正常的编译。

3.常见错误

比较常见的错误有以下两大类:

  • 只进行点菜和菜谱配置,但忘记把菜名添加到菜单中,导致驱动无法编译;
  • 点菜时使用了错误的语法格式,有些程序员因为编写代码的习惯,通常会在等号左右量表预留空格,但在使用config点菜时,其等号两边不能有空格。

4.总结

本文着重阐述了驱动编译需要配置的三类文件:Makefile,Kconfig和config,希望驱动开发者掌握这些内容后,可以在开发过程中重点关注驱动本身,而不会在编译部分耗费时间。

作者介绍

赵青窕,51CTO社区编辑,从事多年驱动开发。研究兴趣包含安全OS和网络安全领域,发表过网络相关专利。

责任编辑:武晓燕 来源: 51CTO技术栈
相关推荐

2022-05-11 15:08:52

驱动开发系统移植

2022-06-15 08:21:49

Linux运维工程师

2022-06-28 09:26:25

Python配置文件

2022-03-28 15:40:34

harmony鸿蒙操作系统

2022-06-29 09:19:09

静态代码C语言c代码

2022-06-09 14:40:14

系统移植鸿蒙

2022-06-09 09:20:40

Linux语言编写代码

2022-04-28 09:46:20

Nginx文件Linux

2022-06-27 07:32:00

2022-06-14 15:07:04

IPC客户端服务端

2021-01-25 16:39:08

鸿蒙HarmonyOS添加单板

2022-04-01 15:18:04

HarmonyHDF 驱动鸿蒙

2022-06-06 00:25:09

Golangpanic死锁

2022-04-12 12:06:49

智能小车Wi-Fi IoT鸿蒙

2022-06-06 15:18:41

开源GiteaDrone

2021-11-12 11:28:01

2022-04-18 10:37:01

鸿蒙操作系统开发工具

2022-02-14 14:28:57

2022-06-01 12:04:02

项目Webpack

2022-01-14 09:57:14

同话题下的热门内容

Flask vs Django: 该如何选择Python框架?专为开发人员构建的个人知识管理工具 - Dendron9.6K Star!可扩展的富文本编辑框架!Java 开发者必备的 十 个 IntelliJ IDEA 插件Obsidian 一周使用心得(配置、主题和插件)有了这些神器,随时随地获取优秀技术前沿!2022 年需求中值得拥有的 DevOps 工具八个颠覆性PyCharm插件

编辑推荐

终于有人把Elasticsearch原理讲透了!花了一个星期,我终于把RPC框架整明白了!这可能是把ZooKeeper概念讲的最清楚的一篇文章论如何下载一个在线的m3u8文件到本地成为一个mp4!拜托!面试不要再问我Spring Cloud底层原理
我收藏的内容
点赞
收藏

51CTO技术栈公众号