[STM32MP1]

Linux内核移植之Kconfig分析

[复制链接]
1403|11
手机看帖
扫描二维码
随时随地手机跟帖
tpgf|  楼主 | 2021-9-8 07:42 | 显示全部楼层 |阅读模式
在内核日录下执行“make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-”时,就会看到一个如图16.3所示的菜单,这就是内核的配置界面。通过配置界面,可以选择芯片类型、选择需要支持的文件系统,去除不需要的选项等,这就称为“配置内核”。注意,也有其他形式的配置界面,比如“make config”命令启动字符配置界面,对于每个选项都会依次出现一行提示信息,逐个回答;“make xconfig”命令启动X-windows图形配置界面。

        所有配置工具都是通过读取arch/$(ARCH)/Kconfig文件来生成配置界面,这个文件是所有配置文件的总入口,它会包含其他目录的Kconfig文件。配置界面如图16.3所示。
711806137f8dca0fb1.png


        内核源码每个子日录中,都有一个Makefile文件和Kconfig文件。Makefile的作用前面已经讲述,Kconfig用于配置内核,它就是各种配置界面的源文件。内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config。

        内核的配置界面以树状的菜单形式组织,主菜单下有若干个子菜单,子菜单下又有子菜单或配置选项。每个子菜单或选项可以有依赖关系,这些依赖关系用来确定它们是否显示。只有被依赖项的父项已经被选中,子项才会显示。

        Kconfig文件的语法可以参考Documentation/kbuild/kconfig-language.txt文件,下面讲述几个常用的语法,并在最后介绍菜单形式的配置界面操作方法。


使用特权

评论回复
tpgf|  楼主 | 2021-9-8 07:42 | 显示全部楼层
1.Kconfig文件的基本要素:config条目(entry)
        config条目常被其他条目包含,用来生成菜单、进行多项选择等。

        config条目用来配置一个选项,或者这么说,它用于生成一个变量,这个变量会连同它的值一起被写入配置文件.config中。比如有一个config 条目用来配置CONFIG_LEDS_S3C24XX,根据用户的选择,.config文件中可能出现下面3种配置结果中的一个。

CONFTG_LEDS_S3C24XX=y  #对应的文件被编进内核
CONEIG_LEDS_S3C24XX=m  #对应的文件被编成模块
#CONFIG_LEDS_S3C24xx   #对应的文件没有被使用
        以一个例子说明config条目格式,下面代码选自fs/Kconfig文件,它用于配置CONFIG JFFS2FS POSIX_ACL选项。

1255 config JFFS2_FS_POSIX_ACL
1256 bool"JFFS2 POSIX Access Control Lists"
1257 depends on JFFS2_FS_XATTR
1258 default y
1259 select FS_POSTX_ACL
1260 help
1261 posix Access Control Lists(ACLs)support permissions for users and
1262 groups beyond the owner/group/world scheme.
1263
1264 To learn more about Access Control Lists,visit the Posix ACLs for
1265 Linux website <http://acl,bestbits.at/>.
1266
1267 If you don't know what Access Control Lists are,say N
1268
        代码中包含了几乎所有的元素,下面一一说明。

        第1255行中,config是关键字,表示一个配置选项的开始:紧跟着的JFFS2_FS POSIXACL是配置选项的名称,省略了前缀“CONFIG_”。

        第1256行中,boot表示变量类型,即CONFIG_JFFS2_FS_POSIX_ACL的类型。有5种类型:bool、tristate、string、hex和int,其中的tristate和string是基本的类型,其他类型是它们的变种。boot变量取值有两种:y和n;tristate变量取值有3种:y、n和m;string变量取值为字符串:hex变量取值为十六进制的数据;int变量取值为十进制的数据。

     “boot”之后的字符串是提示信息,在配置界面中上下移动光标选中它时,就可以通过按空格或回车键来设置CONFIGJFFS2_FSPOSIXACL的值。提示信息的完整格式如下,如果使用“if <expr>”,则当expr为真时才显示提示信息。在实际使用时,prompt 关键字可以省略。

"prompt"<prompt>["if"<expr>]
        第1257行表示依赖关系,格式如下。只有JFFS2_FSXATTR配置选项被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项。注意,如果依赖条件不满足,则它取默认值。

"depends on"/"requires"<expr>
        第1258行的表示默认值为y,格式如下:

"default"<expr>["if"<expr>]
        第1259行表示当前配置选项FFS2FSPOSIX_ACL被选中时,配置选项FS_POSIXACL也会被自动选中,格式如下:

"select"<symbo1>["if"<expr>]
        第1260行表示下面几行是帮助信息,帮助信息的关键字有如下两种,它们完全一样。当遇到一行的缩进距离比第一行帮助信息的缩进距离小时,表示帮助信息已经结束。比如第1268行的缩进距离比第126的缩进距离小,帮助信息到第1267行结束。

“help"or"---help---"
        注意除第1255行的关键字及配置选项的名称、第256行的变量类型外,其他信息都是可以省略的。


使用特权

评论回复
tpgf|  楼主 | 2021-9-8 07:43 | 显示全部楼层
2.menu条目
        menu条目用于生成菜单,格式如下:

"menu"<prompt>
<menu options>
<menu block>
"endmenu"
        它的实际使用并不如它的标准格式那样复杂,下面是一个例子。

menu"Floating point emulation"
config FPE_NWFPE
...
config FPE_NWEPE_XP
...
endmenu
        menu之后的字符串是菜单名,“menu”和“endmenu”之间有很多config条目。在配置界面上会出现如下字样的菜单,移动光标选中它后按回车键进入,就会看到这些config条目定义的配置选项。

Floating point emulation--->


使用特权

评论回复
tpgf|  楼主 | 2021-9-8 07:43 | 显示全部楼层
3.choice条目
         choice条目将多个类似的配置选项组合在一起,供用户单选或多选,格式如下:

"choice"
<choice options>
<choice block>
"endchoice"
         实际使用中,也是在“choice”和“endchoice”之间定义多个config条目,比如arch/arm/Kconfig中有如下代码:

choice
    prompt"ARM system type"
    default ARCH_VERSATILE
config ARCH_AAEC2000
...
config ARCH_INTEGRATOR
...
endchoice
        prompt"ARM system type”给出提示信息“ARM system type”,光标选中它后按回车键进入,就可以看到多个config条日定义的配置选项。

        choice条目中定义的变量类型只能有两种:bool和ristate,不能同时有这两种类型的变量。对于bool类型的choice条日,只能在多个选项中选择一个:对于tristate类型的choice条目,要么就把多个(可以是一个)选项都设为m;要么就像bool类型的choice条目一样,只能选择一个。这是可以理解的,比如对于同一个硬件,它有多个驱动程序,可以选择将其中之一编译进内核中(配置选项设为y),或者把它们都编译为模块(配置选项设为m)。


使用特权

评论回复
tpgf|  楼主 | 2021-9-8 07:43 | 显示全部楼层
4.comment条目
        comment条目用于定义一些帮助信息,它在配置过程中出现在界面的第一行;并且这些帮助信息会出现在配置文件中(作为注释),格式如下:

"comment"<prompt>
<comment options>
        实际使用中也很简单,比如arch/arm/Kconfig中有如下代码:

menu"Floating point emulation"
comment"At least one emulation must be selected"
...
        进入菜单“Floating point emulation-->”之后,在第一行会看到如下内容:

-—-At least one emulation must be selected
        而在.config文件中也会看到如下内容:

#At least one emulation must be selected


使用特权

评论回复
tpgf|  楼主 | 2021-9-8 07:43 | 显示全部楼层
5.source条目
        source条目用于读入另一个Kconfig文件,格式如下:

"source" <prompt>
        下面是一个例子,取自arch/arm/Kconfig文件,它读入net/Kconfig文件。

source "net/Kconfig"


使用特权

评论回复
tpgf|  楼主 | 2021-9-8 07:44 | 显示全部楼层
6.菜单形式的配置界面操作方法
        配置界面的开始几行就是它的操作方法,如图16.4所示。

370386137f9540884d.png

        内核scripts/kconfig/mconfc文件的注释给出了更详细的操作方法,讲解如下。

        一些特定功能的文件可以直接编译进内核中,或者编译成一个可加载模块,或者根本不使用它们。还有一些内核参数,必须给它们赋一个值:十进制数、十六进制数,或者一个字符串。配置界面中,以
  • 、<M>或[]开头的选项表示相应功能的文件被编译进内核中、被编译成一个模块,或者没有使用。尖括号~表示相应功能的文件可以被编译成模块。

            要修改配置选项,先使用方向键高亮选中它,按<Y>键选择将它编译进内核,按<M>键选择将它编译成模块,按-N>键将不使用它。也可以按空格键进行循环选择,例如:Y-N-M一Y。

            上/下方向键用来高亮选中某个配置选项,如果要进入某个子菜单,先选中它,然后按回车键进入。配置选项的名字后有“>”表示它是一个子菜单。配置选项的名称中有一个高亮的字母,它被称为“热键”(hotkey),直接输入热键就可以选中该配置选项,或者循环选中具有相同热键的配置选项。

            可以使用翻页键<PAGE UP>和<PAGE DOWN>来移动配置界面中的内容。要退出配置界面,使用左/右方向键选中<Exi心按钮,然后按回车键。如果没有配置选项使用后面这些按键作为热键的话,也可以按两次<ESC>键或<E><X>键退出。

            按<TAB>键可以在<Select>、<Exit>和<Help>这3个按钮中循环选中它们。

             要想阅读某个配置选项的帮助信息,选中它之后,再选中<Help>按钮,按回车键;也可以选中配置选项后,直接按<H>或<2>键。

            对于choise条目中的多个配置选项,使用方向键高亮选中某个配置选项,按<S>或空格键选中它:也可以通过输入配置选项的首字母,然后按<S>或空格键选中它。

            对于int、hex或string类型的配置选项,要输入它们的值时,先高亮选中它,按回车键,输入数据,再按回车键。对于十六进制数据,前缀0x可以省略。

            配置界面的最下面,有如下两行:

    Load an Alternate Configuration File
    Save an Alternate Configuration File
            前者用于加载某个配置文件,后者用于将当前的配置保存到某个配置文件中去。需要注意的是,如果不使用这两个选项,配置的加载文件、输出文件都默认为.config文件;如果加载了其他的文件(假设文件名为A),然后在它的基础上进行修改,最后退出保存时,这些变动会保存到A中去,而不是.config。

            当然,可以先加载(Load an Alternate Configuration File)文件A,然后修改,最后保存(Save an Alternate Configuration File)到.config中去。


  • 使用特权

    评论回复
    qcliu| | 2021-10-5 11:31 | 显示全部楼层
    感觉很高深啊

    使用特权

    评论回复
    tfqi| | 2021-10-5 11:33 | 显示全部楼层
    Configuration File可以手动修改吗

    使用特权

    评论回复
    wiba| | 2021-10-5 11:37 | 显示全部楼层
    保存的路径可以指定吗

    使用特权

    评论回复
    zljiu| | 2021-10-5 11:43 | 显示全部楼层
    分析的非常详细

    使用特权

    评论回复
    coshi| | 2021-10-5 11:48 | 显示全部楼层
    可以同时读入几个文件啊

    使用特权

    评论回复
    发新帖 我要提问
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    1346

    主题

    13893

    帖子

    8

    粉丝