1.内核源码编译过程

  • 1.遍历每个源码目录的(或配置指定的源码目录)Makefile
  • 2.每个目录的Makefile会根据Kconfig文件定制要编译的对象
  • 3.最后回到顶层目录的Makefile执行编译
    据此,我们可以得出各个文件的作用
  • Kconfig--->(每个源码目录下)提供选项
  • .config--->(源码顶层目录下)保存选择结果
  • Makefile--->(每个源码目录下)根据.config中的内容来告知编译系统如何编译

2. Kconfig基本语法

2.1 单一选项

总体原则:每一个config就是一个选项,最上面跟着控制句柄,下面则是对这个选项的配置,如选项名是什么,依赖什么,选中这个后同时会选择什么。

config CPU_S5PC100
    bool "选项名"
    select S5P_EXT_INT
    select SAMSUNG_DMADEV
    help
      Enable S5PC100 CPU support

onfig —> 选项
CPU_S5PC100 —>句柄,可用于控制Makefile 选择编译方式
bool —>选择可能:TRUE选中、FALSE不选 选中则编译,不选中则不编译。
如果后面没有字符串名称,则表示其不会出现在选择软件列表中
select —> 当前选项选中后则select后指定的选项自动被选择

depends on ARM || BLACKFIN || MIPS || COLDFIRE

depend on 依赖,后面的四个选择其中至少一个被选择,这个选项才能被选

config DM9000
    tristate "DM9000 support"

tristate —> 选中并编译进内核、不选编译成模块

2.2 选项为数字

config ARM_DMA_IOMMU_ALIGNMENT
    int "Maximum PAGE_SIZE order of alignment for DMA IOMMU buffers" ---->该选项是一个整型值
    range 4 9 ---->该选项的范围值
    default 8 ---->该选项的默认值
    help
      DMA mapping framework by default aligns all buffers to the smallest
      ...

这里的defult其实也可以用在bool中

config STACKTRACE_SUPPORT
    bool    --->该选项可以选中或不选,且不会出现在选择列表中
    default y ---->表示缺省情况是选中

2.3 if..endif

if ARCH_S5PC100 --->如果ARCH_S5PC100选项选中了,则在endif范围内的选项才会被选

config CPU_S5PC100
    bool "选项名"
    select S5P_EXT_INT
    select SAMSUNG_DMADEV
    help
      Enable S5PC100 CPU support

endif

举个例子,如果CPU没有选择使用多核CPU,则不会出现CPU个数的选项。

2.4 choice多个选项

choice      --->表示选择列表
    prompt "Default I/O scheduler"         //主目录名字
    default DEFAULT_CFQ                    //默认CFQ
    help
      Select the I/O scheduler which will be used by default for all
      block devices.

    config DEFAULT_DEADLINE
        bool "Deadline" if IOSCHED_DEADLINE=y 

    config DEFAULT_CFQ
        bool "CFQ" if IOSCHED_CFQ=y

    config DEFAULT_NOOP
        bool "No-op"

endchoice

2.5 menu与menuconfig

menu "Boot options"  ----> menu表示该选项是不可选的菜单,其后是在选择列表的菜单名

config USE_OF
    bool "Flattened Device Tree support"
    select IRQ_DOMAIN
    select OF
    select OF_EARLY_FLATTREE
    help
      Include support for flattened device tree machine descriptions.
....

endmenu     ----> menu菜单结束

menu指的是不可编辑的menu,而menuconfig则是带选项的menu
menu和choice的区别
menu 可以多选 choice 是单项选择题

menuconfig的用法

menuconfig MODULES ---> menuconfig表示MODULE是一个可选菜单,其选中后是CONFIG_MODULES
    bool "菜单名"
if MODULES
...
endif # MODULES

说到底,menconfig 就是一个带选项的菜单,在下面需要用bool判断一下,选择成立后,进入if …endif 中间得空间。

3.基本使用方法

将写好的驱动添加到内核编译选项中

  • 1.配置Kconfig
    在driver目录下新建一个目录test,进入test目录,创建Kconfig文件
config TEST
        bool "Test driver"
        help
        this for test!

这里定义了一个TEST的句柄,Kconfig可以通过这个句柄来控制Makefile中是否编译,”Test driver”是显示在终端的名称。

  • 2.配置Makefile
    在test目录,新建一个Makefile
obj-$(CONFIG_TEST) += test.o

意义:

obj-$(CONFIG_选项名) += xxx.o
/* 当CONFIG_选项名=y时,表示对应目录下的xxx.c将被编译进内核
当CONFIG_选项名=m时对应目录下的xxx.c将被编译成模块*/
  • 3.配置上层目录的Makefile与Kconfig
    在上一层目录的Kconfig中,
menu "Device Drivers"
source "drivers/test/Kconfig"

表示将test文件夹中的Kconfig加入搜寻目录
在上一层目录的Makefile中,更改如下

obj-y   += irqchip/
obj-y   += bus/
obj-y   += test/        #新添加

最后,运行make menuconfig,可进行配置,保存后生成.config文件。