linux-2.6.22.6内核启动分析之内核编译体验
1 解压缩、打补丁操作
1.1 打开Ubuntu,通过FTP将Windows相应文件夹下的linux-2.6.22.6.tar.bz2和补丁文件linux-2.6.22.6-jz2440.patch上传到服务器/work/hardware目录下
1.2 输入cd /work/hardware 进入压缩包所在目录,再使用 tar xjf linux-2.6.22.6tar.bz2 命令对linux内核源码压缩包进行解压缩
1.3 输入cd /linux-2.6.22.6 进入解压缩后内核的源码目录,执行 patch -p1 < ../linux-2.6.22.6-jz2440.patch 命令对内核进行打补丁操作
2 内核的配置(3种方法)
在进行介绍三种内核配置方法之前先说明在我电脑编译环境下,执行meke menuconfig命令遇到的问题。我使用的虚拟机版本是Ubuntu-16.04.2,GNU Make的版本是4.1(在linux环境下输入make -v可以查看GNU Make版本信息),遇到编译问题如下图:
网上搜索找到了报错原因,因为所编译linux-2.6.22.6内核版本比较旧,而我使用的GNU Make版本较新,新版本可能对于make的规则可能做出了一些修改,所以出现了上面的错误提示,因此需要对内核顶层的Makefile文件做出如下修改:
linux-2.6.22.6内核根目录下,输入 vi Makefile 命令,输入 416gg 快速定位到416行,看到如下代码:
这里需要修改为
然后是提示的1449行
这里需要修改为
完成后继续执行 make menuconfig 命令即可看到配置顺利进行。
2.1 直接执行 make menuconfig 命令,从头到尾每一项都自己去配置
执行make menuconfig命令后,里面有成千上万种配置选项,需要一个一个去配置,显然操作十分复杂。
2.2 使用默认配置,在默认配置基础上进行修改
先用cd命令切换到linux-2.3.22.6内核存放根目录下,再进行默认配置文件的查找。这里我们可以通过 find -name "*defconfig*" 命令实现查找操作,这条命令查找所有带"defconfig"字符串的文件夹路径。查找结果如下,可以看到带"def_config"字符串的配置文件都在arch架构目录下存放。
我们的开发板使用的芯片属于arm架构,所以通过cd ./arch/arm/configs 进入configs目录寻找和开发板使用芯片相似的配置文件。进入目标文件夹后使用 ls 命令来列出该文价夹下包含的配置文件,该目录下包含的配置文件如下图所示:
通过上面查找结果可以看到,与2440相似的配置只有s3c2410_defconfig文件了,这里我们先返回存放linux-2.6.22.6内核的根目录,然后运行 make s3c2410_defconfig 命令来进行配置,配置结果如下图所示:
配置完后打印结果"configuration written to .config",表示所有的配置信息都写入到了.config文件中,执行make menuconfig 命令就是回去读取.config文件内容。
2.3 使用厂家提供的配置文件
jz2440出厂时,厂家提供了相应的配置文件config_ok,在打补丁时已经存放到内核的目录下。由上面的介绍,我们知道执行make menuconfig 命令就是去读取.config内容,若想使用厂家提供配置文件,只需要把厂家提供配置文件内容复制到.config文件中。使用cd命令切换到linux-2.3.22.6内核存放目录下,使用 cp config_ok .config 命令就能把实现前面所叙述操作。
2.4 执行make menuconfig 配置菜单
菜单操作命令如下表所述:
Arrow keys navigate the menu | 键盘上下键可以控制菜单上下移动,左右键可以控制水平三个菜单移动 |
<Enter> selects submenus ---> | 按下键盘Enter(回车键)可以进入该项菜单子目录 |
Highlighted letters are hotkeys | 开头为粗体字母代表是该项菜单热键,在键盘上按下相应字母,光标定位到该处 |
Pressing <Y> includes | Y键,编译到内核中 |
<N> excludes | N键,不编译到内核中 |
<M> modularizes features | M键,进行模块化 |
Press <Esc><Esc> to exit | Esc键退出 |
<?> for Help | ?键帮助 |
</> for Search | /键收索 |
Legend: | 显示 |
[*] built-in | 已经内置到内核中 |
[ ] excluded | 不编译到内核中 |
<M> module | 已经模块化 |
< > module capable | 表示该选项可以模块化 |
3 编译
3.1 输入 make 命令直接进行编译
3.2 输入 make uImage命令生成uImage形式内核文件,uImage文件包含头部和真正内核部分,可以烧写进去让uboot直接使用。编译uImage文件时必须把编译uboot得到的mkimage工具复制到/user/bin目录中。
3.3 运行uboot,按下命令键k可以通过dnw软件把uImage文件传给uboot,uboot再清除flash,把uImage文件写入到flash中。
4 启动内核
4.1 通过uboot烧写uImage形式内核文件完成后,可以通过菜单键中b键重启内核,注意flash中存储有完整文件系统时内核才能启动成功,否则内核启动会卡在某一位置。