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 中间得空间。

  • 相关阅读:
    Go语言【第八篇】:Go语言变量作用域
    Go语言【第七篇】:Go函数
    Django 2.0 学习(10):Django 定制化
    Go语言【第六篇】:Go循环语句
    Go语言【第五篇】:Go条件语句
    Go语言【第四篇】:Go运算符
    Go语言【第二篇】:Go语法和数据类型
    苹果电脑自带python安装tensorflow一直有问题
    那些年深度学习所踩过的坑-第一坑
    C++基础知识--DAY3
  • 原文地址:https://www.cnblogs.com/lamblabs/p/8493747.html
Copyright © 2011-2022 走看看