menuconfig是linux里面的一个软件,可以配置uboot,kernel,rootf,这里以kernel为例来配置,其他的配置menuconfig的使用是一样的。

1.linux内核源码目录结构

内核有三种:第一种是kernel.org上的(官方版本的),第二种是三星移植过的(厂商的),第三种是九鼎X210的移植版本(做产品的)。

内核配置CONFIG_GENERIC_EARLY_IOREMAP支持哪些函数 menuconfig配置内核_驱动开发

arch:意思是架构,arch目录下是好多个不同架构的CPU的子目录,譬如arm这种cpu的所有文件都在arch/arm目录下,X86的CPU的所有文件都在arch/x86目录下。

block:表示块设备,是一些linux存储体系中关于块设备管理的代码譬如说SD卡、iNand、Nand、硬盘等都是块设备。

crypto:这个目录下放了一些各种常见的加密算法的C语言代码实现。

drivers:驱动目录,里面分门别类的列出了linux内核支持的所有硬件设备的驱动源代码

firmware:固件,固件其实是软件,不过这个软件是固化到IC里面运行的代码叫固件。

include头文件目录公共的(各种CPU架构共用的)头文件都在这里,每种CPU架构特有的一些头文件在arch/arm/include目录及其子目录下。

init:init是初始化的意思,这个目录下的代码就是linux内核启动时初始化内核的代码。

ipc:进程间通信,里面都是linux支持的IPC的代码实现

kernel:就是linux内核,所以这个文件夹下放的就是内核本身需要的一些代码文件。

mm:,内存管理,linux的内存管理代码都在这里。

net:该目录下是网络相关的代码,譬如TCP/IP协议栈等都在这里。

总结:这么多目录跟我们关系很紧密的就是arch和drivers目录,然后其他有点相关的还有include、block、mm、net、lib等目录,其他等需要的时候再详细研究。


2.内核配置和编译

(1)确认Makefile

检查交叉编译工具链路径确认ARCH = arm.

内核配置CONFIG_GENERIC_EARLY_IOREMAP支持哪些函数 menuconfig配置内核_配置项_02

(2)make x210ii_qt_defconfig
最后只要出现:configuration written to .config这句话,就证明我们的操作是正确的。如果没有出现这句话,就有错误。

内核配置CONFIG_GENERIC_EARLY_IOREMAP支持哪些函数 menuconfig配置内核_linux_03

(3)make menuconfig

内核配置CONFIG_GENERIC_EARLY_IOREMAP支持哪些函数 menuconfig配置内核_驱动开发_04

原因:ncurses库没装。解决方案: apt-get install libncurses5-dev。

安装完成后,执行make menuconfig会出现以下图形,然后右方向键选中exit退出即可

注意:如果还是出不来,需要把屏幕字体调小。

内核配置CONFIG_GENERIC_EARLY_IOREMAP支持哪些函数 menuconfig配置内核_配置项_05

(4)make
可能出现的错误:莫名其妙的错误,可以试试先make distclean
编译完成后得到的内核镜像不在源码树的根目录下,在arch/arm/boot这个目录下。得到的镜像名是zImage

内核配置CONFIG_GENERIC_EARLY_IOREMAP支持哪些函数 menuconfig配置内核_模块化_06


3.内核的配置

(1)配置的关键是得到.config文件,在编译过程中会读取.config中的配置项,并且用这些配置项去指导整个编译链接过程。

(2).config文件的格式类似于脚本文件,其中内容为类似于于:CONFIG_ARM=y的一个一个的配置项。这些配置项就类似于脚本文件中定义的一个一个变量,所以这一行可以被理解为定义了一个变量CONFIG_ARM,这个变量的值为y。

(3).config文件中每一行都是一个配置项,从.config文件的规模可以看出linux内核的可配置项有两三千个,超出了人的大脑能够记忆和处理的数量级,不能手工配置而发明了一个图形化的配置工具menuconfig。

内核配置CONFIG_GENERIC_EARLY_IOREMAP支持哪些函数 menuconfig配置内核_驱动开发_07

make xx_defconfig和make menuconfig相配合。

第一步make xxx_defconfig解决的问题是大部分的配置项(这一步结束后99%的配置项就已经正确了),这一步其实是参考别人已经做好的

make x210ii_qt_defconfig其实相当于:cp arch/arm/configs/x210ii_qt_defconfig ./config就是把arch/arm/configs/目录下面的x210ii_qt_defconfig 复制到当前目录(也就是根目录下),命名为.config。

第二步细节调整就通过make menuconfig来完成,其实就是读取第一步得到的.config,然后给我们一个图形化的界面,让我们可以更加容易的找到自己想要修改的配置项,然后更改配置他。


4.menuconfig的使用和演示

(1)menuconfig中操作相关的几个键盘按键,主要是;Enter、ESC、四个方向箭头按键。

  > 向上和向下箭头,主要用来在选择项菜单中目录浏览时上下翻.

  > 回车,主要作用是选中并且执行select/exit/help

  >ESC,主要作用是返回上一层

内核配置CONFIG_GENERIC_EARLY_IOREMAP支持哪些函数 menuconfig配置内核_模块化_08

 >向左和向右箭头,主要作用是在菜单选项(select、exit、help)间切换

 >按键Y、N、M三个按键的作用分别是将选中模块编入、去除、模块化

 >[ ]不可以模块化,<>的才可以模块化。

 >*表示编入,空白表示去除,M表示模块化 

内核配置CONFIG_GENERIC_EARLY_IOREMAP支持哪些函数 menuconfig配置内核_配置项_09


5.menuconfig的工作原理

 (1)menuconfig本身由一套软件支持,用来实现文字式的图形界面.

 (2)menuconfig本身的软件只负责提供menuconfig工作的这一套逻辑,并不负责提供内容. 

 (3)menuconfig读取Kconfig文件, 在menuconfig中都会成为一个菜单项目,菜单项目就是一个又一个的配置项,menuconfig的菜单内容来自于Kconfig文件。

内核配置CONFIG_GENERIC_EARLY_IOREMAP支持哪些函数 menuconfig配置内核_linux_10

(3)每一个菜单的选择结果(Y、N、M)却不是保存在Kconfig文件中,而是保存在.config文件中,make menuconfig打开时会读取.config文件,形成我们看到的菜单栏。