在内核kbuild中加入arch平台配置项

来源:互联网 发布:windows改键盘布局 编辑:程序博客网 时间:2024/06/14 04:23

Kbuild编译内核,需要两中类型文件的支持Makefile和Kconfig。Makefile只是在编译的时候使用,但是内核还需要支持配置功能,所以还需要一个Kconfig用来在make menuconfig的时候进行显示。
不管是新写的驱动代码,还是新添加的平台代码,都需要编写相应的Kconfig和Makefile文件来加入的kbuild中进行编译。

要想知道怎么为新的版型添加Kconfig和Makefile,我们首先需要知道kbuild的编译流程是怎样的。从命令行说起,我们编译一个针对某个版型的内核,会使用如下的命令来进行:
1.配置内核
比如编译arm平台上的内核
make ARCH=arm menuconfig
这一步只是为了编译内核,设置内核特性和驱动模块。它会首先进入到arch/arm/目录中,然后读取该目录下的Kconfig。这个就是内核配置文件的主入口,可以看到它是根据不同的ARCH来区分的。我们打开相应的文件,可以看到其中调用了很到其他目录下的Kconfig文件,由此我们才可以在界面上看到配置选项。
新增一个版型我们需要在System Type特性下面来进行配置,如下所示:

menu "System Type"config MMU    bool "MMU-based Paged Memory Management Support"    default y    help      Select if you want MMU-based virtualised addressing space      support by paged memory management. If unsure, say 'Y'.## The "ARM system type" choice list is ordered alphabetically by option# text.  Please add new entries in the option alphabetic order.#choice    prompt "ARM system type"    default ARCH_VERSATILE if !MMU        default ARCH_MULTIPLATFORM if MMU#新添加平台config ARCH_XXX    bool "NEW Platform"    select CPU_V8    select GENERIC_CLOCKEVENTS    select ARCH_REQUIRE_GPIOLIB    select COMMON_CLK    select CLKDEV_LOOKUP    select ARM_GIC    select HAVE_SMP    select ARM_HAS_SG_CHAIN    select ARCH_HAS_OPP    select ARCH_HAS_CPUFREQ    select MIGHT_HAVE_CACHE_L2X0    select USB_GADGET_DUALSPEED    select PM_OPP if PM     help      Support for Actions OWL Platformendchoicesource "arch/arm/mach-xxx/Kconfig"

我们需要在ARM system type 的choice中加入新的选项,比如上面的ARCH_XXX平台,以便我们能把自己的版型配置上。然后调用mach-XXX下面的Kconfig,我们把跟平台相关的配置型放置在mach-XXX目录下的Kconfig里面去。这样经过层层调用,这些平台相关的内核配置项就会在menuconfig的时候显示出来了,并且我们可以针对需要的特性进行配置了。

2.编译内核
经过上面的menuconfig,会在内核目录下生成.config文件,里面包括了我们配置的项目,然后在这一步我们会进行编译。
make uImage
这一步在编译的时候会首先读取.config里面的配置内容,更具相应的内容来编译不同的模块,Makefile中的CONFIG_XXX总是对应于Kconfig里面的XXX,比如CONFIG_ SMP就对应于Kconfig里面的config SMP选项。举个例子
smp-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o
这个编译项目就是对应于我们配置的config SMP选项,在menuconfig配置的时候可以配置为*/M/空。所以CONFIG_SMP也对应三种结果,一个是y,一个是m,要么就为空。因此这条语句就可以变为:

(a)smp-y += omap-smp.o omap-headsmp.o
它的含义就是把后面的objs编译到内核中,也就是vmlinux中。
(b)smp-m += omap-smp.o omap-headsmp.o
它的含义是把后面的objs编译成一个module,命名为smp.ko,注意要想生成module,还需要执行一个make modules来进行编译才行。
(c)如果不配置,那么后面的objs就不会进行编译了。

0 0