Exynos4412 内核移植(一)—— 内核配置过程分析

时间:2021-10-16 07:46:23

一、前言

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 menuconfig


d、编译

make uImage ---生成内核镜像  /arch/arm/boot/uImag

make dtbs ---生成设备树文件  /arch/arm/boot/dtb/exynos4412-fs4412.dtb

make modules ---把配置值选成M的代码编译生成模块文件。(.ko)  放在对应的源码目录下。


可以看出,内核编译主要包括两部分:一部分是内核配置;另一部分是内核编译;我们先从内核配置开始:

二、内核的Kconfig分析

a -- 我们解压内核后需要先修改内核顶层目录下的Makefile,配置好交叉编译工具

Exynos4412 内核移植(一)—— 内核配置过程分析


b -- 然后导入默认配置(使用make exynis_defconfig 或者cp  arch/arm/configs/exynos_deconfig  .config

Exynos4412 内核移植(一)—— 内核配置过程分析

可以看到该命令会将 配置信息写入 .config 中,.config 是内核根目录下的隐藏文件,makefile 会根据它里面的内容进行编译,具体的使用我们后面会讲到,可以简单看一下里面的内容。 

Exynos4412 内核移植(一)—— 内核配置过程分析


c -- 配置内核

使用 make menuconfig 命令进行内核配置(窗口太小打不开,窗口要19行 80列),可能会出现下面的报错:

Exynos4412 内核移植(一)—— 内核配置过程分析


使用 sudo apt-get install libncurses5-dev命令安装一下接可以了,安装以后再使用 make menuconfig,便可以看到下面的界面了。

Exynos4412 内核移植(一)—— 内核配置过程分析


   如上图所示,这就是内核的配置界面。通过配置界面,可以选择芯片类型、选择需要支持的文件系统。去除不需要的选项等,这就称为“配置内核”。注意,也有其他形式的配置界面,比如“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选项Exynos4412 内核移植(一)—— 内核配置过程分析

代码中包含了大部分元素,下面一一说明。

第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文件

Exynos4412 内核移植(一)—— 内核配置过程分析


4、Choice

choice条目将多个类似的配置选项组合在一起,供用户单选或多选,格式如下:

“choice”

<choice options>

<choice block>

"end choice"

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

Exynos4412 内核移植(一)—— 内核配置过程分析

prompt “Memory split”给出提示信息“Memory split",光标选中它后按回车键进入,就可以看到多个config条目定义的配置选项。