zoukankan      html  css  js  c++  java
  • Linux内核配置Kconfig语法

    http://blog.csdn.net/jianwen_hi/article/details/53398141

    何为Kconfig 它的作用是什么

    内核源码编译过程

    顶层目录

    1. 遍历每个源码目录(或配置指定的源码目录)Makefile
    2. 每个目录的Makefile 会根据Kconfig来定制要编译对象
    3. 回到顶层目录的Makeifle执行编译

    那么我们就得出各个文件的作用:

    Kconfig ---> (每个源码目录下)提供选项
    .config ---> (源码顶层目录下)保存选择结果
    Makefile---> (每个源码目录下)根据.config中的内容来告知编译系统如何编译
    • 1
    • 2
    • 3

    说到底,Kconfig就是配置哪些文件编译,那些文件不用编译。后期linux内核都做出了如下的图形界面,但由于要进行Linux内核驱动开发,需要向将驱动的代码添加到Makefile中一起编译,所以Kconfig的一些语法也该了解,于是有了这篇文章。 
    这里写图片描述

    基本使用方法

    我们以简单的单选项为案例来演示 
    假比,我们做好了一个驱动,需要将选项加入到内核的编译选项中,可以按以下步骤操作:

    第一步 配置Kconfig

    在driver目录下新建一个目录

    mkdir driver/test 
    • 1

    进入test目录,创建Kconfig文件 
    这里写图片描述 
    这里定义了一个TEST的句柄,Kconfig可以通过这个句柄来控制Makefile中是否编译,”Test driver”是显示在终端的名称。 
    具体的语法在Kconfig语法简介中介绍。

    第二步 配置Makefile

    在同样的目录中,新建一个Makefile 
    Makfile

    Obj-$(CONFIG_选项名) += xxx.o 
    /*当CONFIG_选项名=y时,表示对应目录下的xxx.c将被编译进内核
    当CONFIG_选项名=m时对应目录下的xxx.c将被编译成模块*/
    • 1
    • 2
    • 3

    第三步 配置上层目录的Makefile与Kconfig

    在上一层目录的Kconfig中

    这里写图片描述 
    表示将test文件夹中的Kconfig加入搜寻目录

    在上一层目录的Makefile中

    这里写图片描述

    结果,运行根目录的.config查看结果 
    这里写图片描述

    Kconfig语法简介

    单一选项

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

    config CPU_S5PC100
        bool "选项名"
        select S5P_EXT_INT
        select SAMSUNG_DMADEV
        help
          Enable S5PC100 CPU support
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    depends on ARM || BLACKFIN || MIPS || COLDFIRE
    • 1

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

    config DM9000
        tristate "DM9000 support"
    • 1
    • 2

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

    运行结果:< M > test

    选项为数字

    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
          ...
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4-8为这个数字的范围,运行结果 
    这里写图片描述

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

    config STACKTRACE_SUPPORT
        bool    --->该选项可以选中或不选,且不会出现在选择列表中
        default y ---->表示缺省情况是选中
    • 1
    • 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
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    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
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    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菜单结束
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

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

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

  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    690. Employee Importance
    1723. Find Minimum Time to Finish All Jobs
    LeetCode 329 矩阵中最长增长路径
    7.2 物理内存管理
    LeetCode 面试题 特定深度节点链表
    LeetCode 100 相同的树
    npm安装包命令详解,dependencies与devDependencies实际区别
  • 原文地址:https://www.cnblogs.com/lamblabs/p/8493747.html
Copyright © 2011-2022 走看看