嵌入式Linux–menuconfig详解

嵌入式Linux–menuconfig详解menuconfig工作原理menuconfig是一套图像化配置工具,由ncurses库提供软件支持。ncurses库提供了一系列的函数以便使用者调用它们去生成基于文本的用户界面。menuconfig本身的软件只负责提供menuconfig工作的这一套逻辑,比如说通过上下左右调整光标,Enter选中等,并不负责提供内容。menuconfig运行之后会读取Kconfig、读取/写入….

大家好,又见面了,我是你们的朋友全栈君。

menuconfig

1.简介

menuconfig是一套图像化配置工具,由ncurses库提供软件支持。ncurses库提供了一系列的函数以便使用者调用它们去生成基于文本的用户界面
menuconfig本身的软件只负责提供menuconfig工作的这一套逻辑,比如说通过上下左右调整光标,Enter选中等,并不负责提供内容。menuconfig运行之后会读取Kconfig、读取/写入.config文件,Kconfig提供菜单项的内容,.config用来记录菜单项的选择值。

2.用法

内核源码目录下make menuconfig就会进来,箭头按键导航整个菜单,回车按键选择子菜单(注意选项后面有 —>的选项才是有子菜单的,没有这个标识的没有子菜单),高亮的字母是热键(快捷键),键盘按键Y、N、M三个按键的作用分别是将选中模块编入、去除、模块化。双击ESC表示退出,按下?按键可以显示帮助信息,按下/按键可以输入搜索内容来全局搜索信息(类似于vi中的搜索),[ ]不可以模块化,< >的才可以模块化。

注:linux内核中一个功能模块有三种编译方法:一种是编入、一种去去除、一种是模块化。所谓编入就是将这个模块的代码直接编译连接到zImage中去,去除就是将这个模块不编译链接到zImage中,模块化是将这个模块仍然编译,但是不会将其链接到zImage中,会将这个模块单独链接成一个内核模块.ko文件,将来linux系统内核启动起来后可以动态的加载或卸载这个模块。
在menuconfig中选项前面的括号里,*表示编入,空白表示去除,M表示模块化。

3.配置菜单界面启动流程

执行make menuconfig的时候,会执行顶层目录下的Makefile。

%config: scripts_basic outputmakefile FORCE
	$(Q)mkdir -p include/linux include/config
	$(Q)$(MAKE) $(build)=scripts/kconfig $@
$(build)=scripts/kconfig,build是编译规则,$(build)=scripts/kconfig
实质是:-f scripts/kconfig/Makefile
则:$(Q)$(MAKE) $(build)=scripts/kconfig $@ 等同于 
make -f scripts/kconfig/Makefile menuconfig
-f:指定执行某个Makefile文件,表示到scripts/kconfig目录下Makefile文件中,生成目标menuconfig。

这里写图片描述
Q的值根据KBUILD_VERBOSE的值来决定,Q=空时会打印命令信息,Q=@时隐藏命令信息。
这里写图片描述
MAKE为系统内置变量,可以参考这篇文章打印

绘制图形和解析这个界面的文件都会在scripts/kconfig目录下面,比较重要的文件有mconf.c和lxdialog目录。

接下来,scripts/kconfig/Makefile 找到目标所在的代码:

menuconfig: $(obj)/mconf
	$< $(Kconfig)

obj := $(CURDIR)
Kconfig := arch/$(SRCARCH)/Kconfig
SRCARCH := $(ARCH)

而变量在顶层目录的Makefile中早已赋值arm,所以:

menuconfig: scripts/kconfig/mconf
      scripts/kconfig/mconf  arch/arm/Kconfig

当我们执行命令make menuconfig时,(1)先创建两个二级目录include /linux 和 include/config,(2)接着把scripts/kconfig/里面的可执行文件mconf运行起来,有能力的话可以详看scripts/kconfig/mconf.c,根据文件arch/arm/kconfig内容,显示出一个菜单界面。其实,mconf运行起来,首先是“画出”菜单界面(显示内容则根据各级目录的Kconfig文件),然后查看源码顶层目录有没有存在.config文件,若没有,则按照默认显示到菜单里面;若存在.config,则会把它读出来存到内存某块区域,在逐行逐行解析它的内容,再把读出的内容更新到菜单。最后会保存在源码顶层的.config文件中。


Kconfig文件语法

kconfig的总入口是arch/arm/kconfig,不是源码顶层的kconfig,入口一定是根据某款平台的。
这里写图片描述

1.tristate、bool、string

bool:[ ]有两种状态,*代表选中,空代表未选中;
tristate:< >有三种状态,*代表选中,空代表未选中,M代表模块;
string:( )存放十进制或者十六进制字符串;

2.mainmenu

如果配置程序选择了使用它,那么就用它配置程序的标题栏。

mainmenu "Linux Kernel Configuration"

config ARM
	bool
	default y
	select HAVE_AOUT
	select HAVE_IDE

3.config

开启一个新的配置选项入口,下面的行定义了配置选项的属性,属性可以是配置输入提示、依赖、帮助文档和默认值等,一个配置选项可以被多次定义,但是每一次定义只有单一的输入提示,并且类型不能冲突。

config MODVERSIONS
	bool "Set version information on all module symbols"
	depends on MODULES
	help
	  Usually, modules have to be recompiled whenever you 
	  switch to a newkernel.  ...

4.prompt

输入提示作用,下面两种方式,效果相同。

bool "Networking support"
  and
bool
prompt "Networking support"

5.depends on、select

depends on 表示此选项会依赖其它选项的配置,也就是BAR被选择之后,该选项才能被选择;select 表示反向依赖,如果当前项选中,那么也选中select后的选项。

6.default

用于设定默认值,y表示该选项默认被选择上。

	bool "foo" if BAR
	default y if BAR
  and
	depends on BAR
	bool "foo"
	default y

7.menu

定义一个菜单入口, 表示Network device support是一个菜单选项。

menu "Network device support"
	depends on NET

config NETDEVICES
	...
endmenu

8.source

将另外一个Kconfig文件直接复制到当前位置,可以将这个系统贯穿在一起。从开始位置arch/arm/Kconfig,来将整个系统都作为配置型。

config ARM_L1_CACHE_SHIFT_6
	bool
	help
	  Setting ARM L1 cache line size to 64 Bytes.

source "init/Kconfig"

这里写图片描述

9.help

帮助信息,告诉我们这个配置项的含义,以及如何去配置他。


.config

“.config文件中每一行都是一个配置项,从.config文件的规模可以看出linux内核的可配置项有两三千个。所以linux内核是高度可配置的,而且linux内核的所有配置项很难全部搞明白。因为linux内核的配置项太多太繁杂超出了人的大脑能够记忆和处理的数量级,因此linux内核不像uboot那样直接手工配置,而是发明了一个图形化的配置工具menuconfig。”

menuconfig的终极目标就是让我们更容易地配置.config文件。一般厂商会提供他们配置好的.config文件,里面配置好了大部分的必要功能,如果我们自己需要修改,那么就可以通过menuconfig来修改配置。

(1)menuconfig中config后面空格隔开的大写字母表示的类似于 NETDEVICES 的就是这个配置项的配置项名字,这个字符串前面添加 CONFIG_ 后就构成了.config中的配置项名字。
(2)这个.config中的配置值(=y、=m、=n)会影响最终的编译链接过程。如果=y则会被编入(built-in),如果=m会被单独连接成一个ko模块,如果=n则对应的代码不会被编译,这些都是通过makefile实现的。
(3).config中的配置值指导整个编译连接过程。


参考文章:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131918.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSDP 协议_Smb协议

    SSDP 协议_Smb协议1.组播地址2.SSDP,简单服务发现技术组播地址为了让组播源和组播组成员进行通信,需要提供网络层组播地址,即IP组播地址。同时必须存在一种技术将IP组播地址映射为链路层的组播MAC地址。1.IP组播地址(1)       IPv4组播地址IANA(InternetAssignedNumbersAuthority,互联网编号分配委员会)将D类地址空间分配给IP

    2022年10月11日
    3
  • pycharm汉化包下载[通俗易懂]

    pycharm汉化包下载[通俗易懂]把解压后的文件放到pycharm安装目录lib文件夹下即可链接:https://pan.baidu.com/s/126-yg7ojwwryywBzUuVEhQ提取码:v5j0

    2022年5月9日
    39
  • php双分支语句三个数排序「建议收藏」

    php双分支语句三个数排序「建议收藏」<?php$a = rand(100,999);$b = rand(100,999);$c = rand(100,999);echo “a=”.”$a”.”<br>”;echo “b=”.”$b”.”<br>”;echo “c=”.”$c”.”<br>”;if(($a > $b ) && ($a > …

    2022年8月19日
    15
  • pycharm最新激活码【注册码】

    pycharm最新激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    52
  • java新手代码大全实例,深度解析,值得收藏

    java新手代码大全实例,深度解析,值得收藏策略1——停止挖掘LawofHoles是说当自己进洞就应该停止挖掘。对于单体式应用不可管理时这是最佳建议。换句话说,应该停止让单体式应用继续变大,也就是说当开发新功能时不应该为旧单体应用添加新代码,最佳方法应该是将新功能开发成独立微服务。如下图所示:除了新服务和传统应用,还有两个模块,其一是请求路由器,负责处理入口(http)请求,有点像之前提到的API网关。路由器将新功能请求发送给新开发的服务,而将传统请求还发给单体式应用。另外一个是胶水代码(gluecode),将微服务和单体应用集

    2022年6月21日
    43
  • 企业怎么选择国产Web应用防火墙?

    企业怎么选择国产Web应用防火墙?企业怎么选择国产Web应用防火墙?2005年前后,Web应用防火墙(WAF)进入了IT安全领域,最早提供这类产品的供应商是几家新兴公司,如Perfecto、KaVaDo和NetContinuum。工作原理相当简单:随着攻击范围向IP堆栈的上层移动,瞄上针对特定应用的安全漏洞,这时势必需要开发旨在识别和预防这些攻击的产品。虽然网络防火墙在阻止较低层攻击方面很有效,但并不擅长解开IP数据包层,以分析较高层协议;这就意味着,网络防火墙缺少应用感知功能,而要关闭自定义Web应用中的漏洞窗口,就需要这种功能。但是

    2022年5月5日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号