4

同驱动编译相关的三类文件:Makefile、Config和Kconfig

 2 years ago
source link: https://blog.51cto.com/u_7390037/5380922
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

同驱动编译相关的三类文件:Makefile、Config和Kconfig

原创

WOT技术大会 2022-06-14 09:51:06 ©著作权

文章标签 类文件 默认值 复用 文章分类 其他 其它 阅读数157

同驱动编译相关的三类文件:Makefile、Config和Kconfig_类文件

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

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

PART 01

如何修改这三类文件

从而编译我们的驱动

Makefile

我们可以通过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 modules时才会被编译。当发现驱动没有进行编译时,可以查看是否是采用obj-m,且是以执行make modules的方式进行编译的。

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

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

同驱动编译相关的三类文件:Makefile、Config和Kconfig_复用_02

从上图可以看出,该类文件就是定义了一些配置项,在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/下,则采用语句source "drivers/input/test/Kconfig"即可包含该Kconfig文件。​

PART 02

Makefile, Config和Kconfig

三者间的关系  

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

同驱动编译相关的三类文件:Makefile、Config和Kconfig_复用_03

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

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

PART 03

常见错误 

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

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

PART 04

总结    

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK