一、配置内核(Kconfig)
我们配置内核是实质是根据众多目录下面的Kconfig文件中组合成我们需要的一个最佳选择,即最终在根目录下面生成的.config文件,而这个文件会在根目录Makefile下调用的。这一部分我们主要讨论整个SEP4020体系在内核中各个Kconfig文件是怎么组织的。
1、Make menuconfig的编译生成过程:
这部分我们将make menuconfig它是怎末运行,和调用哪些文件来实现图形界面的。
我们先来看下我们键入make menuconfig会出现什么:
[root@localhost linux-v3.3]# make menuconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/basic/split-include
HOSTCC scripts/basic/docproc
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/kxgettext.o
HOSTCC scripts/kconfig/mconf.o
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/mconf
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/lxdialog.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/msgbox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTLD scripts/kconfig/lxdialog/lxdialog
scripts/kconfig/mconf arch/arm/Kconfig
fs/Kconfig:767:warning: multi-line strings not supported
drivers/usb/gadget/Kconfig:406:warning: type of 'USB_ZERO_HNPTEST' redefined from 'boolean' to 'tristate'
#
# using defaults found in .config
#
*** End of Linux kernel configuration.
*** Execute 'make' to build the kernel or try 'make help'.
从上面我们看到实际上make menuconfig是一个Makefile编译及运行的过程,他先编译了一大堆文件最后会生成scripts/kconfig/mconf和scripts/kconfig/lxdialog/lxdialog这两个应用程序,其中scripts/kconfig/mconf会调用scripts/kconfig/lxdialog/lxdialog来显示一个对话框的。
然后编译好这两个应用程序后,紧接着运行scripts/kconfig/mconf arch/arm/Kconfig
这个应用程序,这个程序就读入了我们SEP4020的体系架构的Kconfig,然后就显示出了我们见到的那个对话框了。
2、Make menuconfig的Makefile的调用关系;
在这部分我们讲下Makefile是怎样一步步构造出menuconfig这个对话框的:
1.2.1在顶层的Makefile中,可以查找到如下几行定义的规则。
这就是生成内核配置界面的命令规则,它也定义了执行的目标和依赖的前提条件,还有
要执行的命令。
这条规则定义的目标为config %config, 通配符%意味着可以包括config、 xconfig、 gconfig、
menuconfig和oldconfig等。依赖的前提条件是 scripts_basic outputmakefile,这些在 Makefile
也是规则定义,主要用来编译生成配置工具。
那么这条规则执行的命令就是执行scripts/kconfig/Makefile指定的规则。相当于:
make -C scripts/kconfig/ %config(-C表示调用scripts/kconfig/目录下的Makefile)
这行命令是使用配置工具解析 arch/$(ARCH)/Kconfig 文件,生成内核配置菜单。
$(ARCH)变量是 Linux 体系结构定义,对应 arch 目录下子目录的名称。Kconfig 包含了内核配置菜单的内容,那么 arch/$(ARCH)/Kconfig 是配置主菜单的文件,调用管理其他各级
Kconfig。根据配置工具的不同,内核也有不同的配置方式。有命令行方式,还有图形界面方式。
1.2.2这些内核配置方式是在scripts/kconfig/Makefile中通过规则定义的。从这个 Makefile中,可以找到下面一些规则定义。如果把变量或者通配符带进去,就可以明白要执行的操作。
执行命令:scripts/kconfig/mconf arch/arm/Kconfig
使用lxdialog工具,生成光标配置菜单。
(1)由于mconf没有产生根据Makefile的隐规则会推导生成mconf程序
mconf-objs := mconf.o zconf.tab.o这个可以让多个c文件生成最后的可执行文件mconf
(2)因为 mconf调用lxdialog工具,所以需要先编译scripts/kconfig/lxdialog目录。
这会生成相应的目标文件最后生成lxdialog程序。
最后运行
$< arch/$(ARCH)/Kconfig这个程序。
3、SEP4020相关Kconfig的关系:
1.3.1 menuconfig的组织关系图:
General setup ---> /init/kconfig
Loadable module support ---> /init/kconfig
[*] Enable loadable module support /block/kconfig
System Type ---> /arch/arm/kconfig
ARM system type (sep4020) ---> /arch/arm/kconfig
SEP4020 Implementations ---> /arch/arm/kconfig
--- Processor Type /arch/arm/mm/kconfig
--- Processor Features /arch/arm/mm/kconfig
Bus support ---> /arch/arm/kconfig
Kernel Features ---> /arch/arm/kconfig
[ ] Dynamic tick timer /kernel/time/kconfig
Memory model (Flat Memory) ---> /mm/kconfig
Boot options ---> /arch/arm/kconfig
Floating point emulation ---> /arch/arm/kconfig
Userspace binary formats ---> /arch/arm/kconfig
/fs/kconfig.binfmt
Power management options ---> /arch/arm/kconfig
/kernel/power/kconfig
Networking ---> /net/kconfig
Device Drivers ---> /driver/kconfig
File systems ---> /fs/kconfig
如果大家想新增一个芯片平台和驱动,大家可以根据这个提示去相应的Kconfig文件去添加相应的内容。等make menuconfig后就会在根目录下生成.config文件这个文件会保存所以已经选择的Kconfig选项。
1.3.2 Kconfig的相关知识;
(1)菜单项
多数选项定义一个配置选项,其他选项起辅助组织作用。举例说明单个的配置选项
的定义。
config MODVERSIONS
bool "Set version information on all module symbols"
depends MODULES
help
Usually, modules have to be recompiled whenever you switch to a new
kernel………
每一行开头用关键字“config”,后面可以跟多行。后面的几行定义这个配置选项的属性。
属性包括配置选项的类型、选择提示、依赖关系、帮助文档和缺省值。同名的选项可以重复
定义多次,但是每次定义只有一个选择提示并且类型不冲突。
(2)菜单属性:
(3)Kconfig语法: