一、前言
1、linux内核五大功能:
进程管理(cpu)
内存管理(内存)
设备管理(驱动)
网络管理(网络协议tcp/ip)
文件系统(vfs)
2、linux版本号:
linux 2.6 2--->主版本号 6---->次版本号:奇数代表测试版本 偶数代表稳定版本
本文使用内核版本为linux3.14
3、linux目录结构:
arch:体系结构相关代码
ipc:进程调度相关代码
mm:内存管理
Documentation:帮助文档
net:网络协议
lib:库
scripts:编译相关脚本工具
tools:编译相关工具
drivers:设备驱动
fs:文件系统实现
4、编译相关文件:
顶层Makefile 与 子目录下的Makefile
各级目录Kconfig
5、内核的使用流程
a、清除命令
一般在第一次编译时使用
make mrproper
b、导入默认配置信息(在内核根目录中)
方法1: make exynos_deconfig方法2:cp arch/arm/configs/exynos_deconfig .config
c、详细配置
make menuconfigd、编译
make uImage ---生成内核镜像 /arch/arm/boot/uImag
make dtbs ---生成设备树文件 /arch/arm/boot/dtb/exynos4412-fs4412.dtb
make modules ---把配置值选成M的代码编译生成模块文件。(.ko) 放在对应的源码目录下。
可以看出,内核编译主要包括两部分:一部分是内核配置;另一部分是内核编译;我们先从内核配置开始:
二、内核的Kconfig分析
a -- 我们解压内核后需要先修改内核顶层目录下的Makefile,配置好交叉编译工具
b -- 然后导入默认配置(使用make exynis_defconfig 或者cp arch/arm/configs/exynos_deconfig .config)
可以看到该命令会将 配置信息写入 .config 中,.config 是内核根目录下的隐藏文件,makefile 会根据它里面的内容进行编译,具体的使用我们后面会讲到,可以简单看一下里面的内容。
c -- 配置内核
使用 make menuconfig 命令进行内核配置(窗口太小打不开,窗口要19行 80列),可能会出现下面的报错:
使用 sudo apt-get install libncurses5-dev命令安装一下接可以了,安装以后再使用 make menuconfig,便可以看到下面的界面了。
如上图所示,这就是内核的配置界面。通过配置界面,可以选择芯片类型、选择需要支持的文件系统。去除不需要的选项等,这就称为“配置内核”。注意,也有其他形式的配置界面,比如“make config”命令启动字符配置界面,对于每个选项都会依次出现一行提示信息,组个回答;“make xconfig”命令启动 X-Windows 图形配置界面
所有配置工具都是读取arch/$(ARCH)/Kconnfig 文件来生成配置界面,这个文件是所有配置文件的总入口,它会包含其他目录的Kconfig文件。配置界面如上图所示。
内核源码每个子目录中,都有一个Makefile文件和Kconfig文件。Makefile的作用下篇文章会讲述,Kconfig用于配置内核,它就是各种配置界面的源文件。内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config。
内核的配置界面以树状的菜单形式组织,主菜单下有若干子菜单,子菜单下又有子菜单或配置选项。每个子菜单或选项都有依赖关系,这些依赖关系用来确定它们是否显示。只有被依赖的父项已经被选中,子项才会显示。
下面学习Kconfig文件的简单语法:
1、Kconfig 文件的基本要素:config 条目(entry)
config 条目常被其他条目包含,用来生成菜单,进行多项选择等。
config 条目用来配置一个选项,或者这么说,它用于生成一个变量,这个变量会连同它的值一起被写入配置文件 .config 中。比如有一个config 条目用来配置CONFIG_LEDS_FS4412,根据用户的选择,.config文件中可能出现下面3种配置结果中的一个。
CONFIG_LEDS_FS4412=y # 对应的文件被编进内核
CONFIG_LEDS_FS4412=m # 对应的文件被编成模块
#CONFIG_LEDS_FS4412 # 对应的文件没有被使用
以一个例子说明config条目格式,下面代码选自 drviers/char/Kconfig 文件,它用于配置CONFIG_TTY_PRINTK选项
代码中包含了大部分元素,下面一一说明。
第42行,config是关键字,便是一个配置选项的开始;紧跟着的TTY_PRINTK是配置选项的名称,省略了前缀“CONFIG_”。
第43行,boot表示变量类型,即CONFIG_TTY_PRINTK的类型,有五种类型:
Bool 布尔类型,结果是Y[*] , N[]
Tristate 三项选择,结果是Y[*], N[], M[m]
String 字符串, 结果(arm-linux-)
Hex 十六进制,(16)
Int 十进制,(10)
"bool" 之后的字符串提示信息,在配置界面中上下移动光标选中它时,可以通过按空格或回车键来设置CONFIG_TTY_PRINTK的值。
第44行,表示依赖关系,格式如下。只有EXPERT && TTY 配置选项被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项。注意,如果依赖条件不满足,则它取默认值。
第45行表示默认值为n;
第46行表示下面几行是帮助信息;
2、menu 条目
menu条目用于生成菜单, 在menuconfig 中是以------>形式出现 格式如下:
“menu” <prompt>
<menu options>
<menu block>
"endmenu"
它的实际使用并不如它的标准格式那样复杂,下面是一个例子
menu之后字符串是菜单名,“menu”和“endmunu”之间有很多config条目。在配置界面上回出现如下字样的菜单,移动光标选中它后按回车键进入,就会看到这些config条目定义的配置选项。
3、Source条目
xx/kconfig :当前Kconfig可以包含其它目录下的kconfig,用于读入另一个Kconfig文件,格式如下:
“source” <prompt>
下面是一个例子,取自arch/arm/Kconfig文件,它读入arch/arm/mach-mvebu/Kconfig文件
4、Choice
choice条目将多个类似的配置选项组合在一起,供用户单选或多选,格式如下:
“choice”
<choice options>
<choice block>
"end choice"
实际使用中,也是在“choice”和“endchoice”之间定义多个config条目,比如arcg/arm/Kconfig中有如下代码:
prompt “Memory split”给出提示信息“Memory split",光标选中它后按回车键进入,就可以看到多个config条目定义的配置选项。