Linux内核配置和编译

注:本文是学习朱老师课程整理的笔记,基于linux2.6.35.7和九鼎X210BV3S开发板进行移植。
  • 检查Makefile的配置项

1.检查交叉编译工具链。
CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-

2.确认ARCH = arm。主要目的是为了编译时能找到arch/arm目录。

可能出现的错误:

make: ***    arm/kernel.git/arch/arm: Is a directory.  Stop.

这个错误是由在Makefile的 ARCH ?= $(SUBARCH)这行的后面多了一个空格造成的。
所以,在编辑Makefile时候,每行结尾,一定要确认没有空格,直接是换行。

  • make x210ii_qt_defconfig

最后只要出现:configuration written to .config这句话,就证明操作是正确的。

make x210ii_qt_defconfig其实相当于:cp arch/arm/configs/x210ii_qt_defconfig ./.config

arch/arm/configs目录下的很多xxx_defconfig文件都是别人手工配置好适合一定的开发板的”.config”文件保存过去的。譬如说S5PV210这个SoC,针对这个SoC的开发板的最初配置是三星的工程师去做的。

“.config”以“.”开头,是一个隐藏文件,需要ls -a来看,当make distclean后是没有.config文件的。”.config”文件是linux内核在编译过程中很重要的一个文件,其作用类似于uboot中的include/configs/x210_sd.h,内核在编译过程中会读取”.config”中的配置项,并且用这些配置项去指导整个编译链接过程。

“.config”文件的格式类似于脚本文件,其中内容类:

CONFIG_ARM=y
CONFIG_HAVE_PWM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_GENERIC_GPIO=y
CONFIG_GENERIC_TIME=y
……

这些配置项就类似于脚本文件中定义的一个一个变量,这些变量的值为y。”.config”文件中每一行都是一个配置项,从”.config”文件的规模可以看出linux内核的可配置项有两三千个,所以发明了一个图形化的配置工具menuconfig。menuconfig其实就是读取”.config”文件,然后通过图形化的界面来修改”.config”文件中的配置项。

make xxx_defconfig解决的是大部分的配置项(前人已经做过),然后通过make menuconfig针对开发板个别不同的配置项进行细节调整。

注意:如果这一步配置没有得到”.config”文件,是不能进行到下一步的。实际测试时没有”.config”也可以make menuconfig,但是这样做出来的内核编译和烧写运行应该是有问题的。

  • make menuconfig

可能出现的错误1:ncurses库没装
错误信息:

 *** Unable to find the ncurses libraries or the
 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.
 *** 
 *** Install ncurses (ncurses-devel) and try again.

解决方案: apt-get install libncurses5-dev
ncurses库是linux中用来实现文字式的图形界面,scripts\kconfig\lxdialog目录下的一些c文件用来提供menuconfig的那些程序源代码。

可能出现的错误2:终端窗口太小
错误信息:

Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.

解决方案:全屏,或者是把字体调小。

menuconfig菜单选项后面有 —>的选项是有子菜单的,高亮的字母是热键(快捷键),键盘按键Y、N、M三个按键的作用分别是将选中模块编入、去除、模块化。双击ESC表示退出,按下“?”按键可以显示帮助信息,按下“/”按键可以输入搜索内容来全局搜索信息,“[]”表示不可以模块化,“<>”表示可以模块化。

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

menuconfig菜单项的内容来自Kconfig文件来(下面会分析Kconfig文件),菜单项的选择值来自”.config”文件,并且用”.config”文件中的配置值来初始化menuconfig中各个菜单项的选择值。

  • make

编译内核时编译连接程序会考虑”.config”中的配置值指导整个编译连接过程。

可能出现的错误1:莫名其妙的错误,可以试试先make distclean。
可能出现的错误2:代码本身的错误,具体问题具体分析。

编译完成后得到的内核镜像在arch/arm/boot这个目录下,得到的镜像名是zImage。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值