第3阶段——内核启动分析之内核编译试验(1)
目标:
1.给内核打补丁
2.配置
3.编译
4.重启
1 内核打补丁
1.1 通过FTP将Windows里system目录下linux-2.6.22.6.tar.bz2和linux-2.6.22.6_jz2440.patch文件拷贝到linux里/work/system下
1.2 使用 tar xjf linux-2.6.22.6.tar.bz2 命令解压linux-2.6.22.6.tar.bz2
(tar命令详细介绍入口链接http://www.cnblogs.com/lifexy/p/7009245.html)
1.3 进入linux-2.6.22.6目录下,使用 patch -p1 <../linux-2.6.22.6_jz2440.patch 命令对linux-2.6.22.6文件进行打补丁。
(patch命令详细介绍入口链接http://www.cnblogs.com/lifexy/p/7009706.html)
2 配置(3种配置方法)
2.1直接输入 make menuconfig 命令,从头到尾重新配置菜单 (非常复杂)、
make menuconfig时修改配置项,最终的配置结果会保存在.config文件中,这主要是Kconfig的功能,
再执行make menuconfig时就可以回去读取.config文件。这是内核配置的过程。
2.2通过make xxx_defconfig命令在默认的配置上进行修改,然后再输入make menuconfig配置菜单
(1) 首先找defconfig位置, linux-2.6.22.6目录下,使用 find –name *defconfig 命令查找所有带fconfig名字的文件.
(find命令详细介绍入口链接http://www.cnblogs.com/lifexy/p/7160677.html)
发现defconfig文件都在arch架构目录下,如下图所示:
(2) 我们的是arm架构,所以 cd arch/arm/configs 进入configs目录,如下图所示,发现与2440相像的就只有s3c2410_deconfig。
(3)返回到linux-2.6.22.6顶层目录下,通过make s3c2410_defconfig 命令来配置,如下图所示
配置完后可以看出最后出现“configuration written to .config”,表示将所有config配置都写入到.config文件中,
(4)最后执行make menuconfig时就可以回去读取.config文件,不同的.config文件,menuconfig都不同
2.3使用厂家提供的配置config_ok文件
在linux-2.6.22.6目录下,使用cp config_ok .config将config_ok复制覆盖新的.config隐藏文件(通过 ls -la 命令可以查看.config隐藏文件),
最后执行make menuconfig时就可以回去读取.config文件
2.4 make menuconfig 配置菜单使用说明
使用 make menuconfig 配置菜单后,会出现以下菜单
菜单使用说明:
Arrow keys navigate the menu. 箭头键导航菜单
<Enter> selects submenus --->. Enter键选择菜单——>。
Highlighted letters are hotkeys. 粗体的开头字母是热键,例如上图中按B键,跳到Block layer
Pressing <Y> includes, Y键,编译在内核里运行
<N> excludes, N键,不编译在内核中
<M> modularizes features. M键,进行模块化
Press <Esc><Esc> to exit, Esc键退出
<?> forHelp, ?键帮助
</> for Search. /键搜索
Legend: 显示:
[*] built-in [*]:已经内置在内核中
[ ] excluded [ ]:不编译在内核中
<M> module <M>:已经模块化
< > module capable < >:表示这选项能被模块化(按下M键有响应)
3 编译(2种配置方法)
3.1 输入 make 命令直接编译
3.2 输入 make uImage 命令生成uImage内核文件(头部uImage+真正的内核),可以直接烧写给uboot直接使用(因为uboot支持的内核需要有头部uImage, uImage位置在linux中work/system/linux-2.6.22.6/arch/arm/boot)
注意:要想“ make uImage”成功,必须把编译 u-boot 时得到的 mkimage 工具复制到
/usr/bin 目录下去。 mkimage 工具在 u-boot 源码下u-boot-1.1.6/tools 目录里,如下所示:
3.3将编译出的uImage文件在uboot菜单中输入k键,通过dnw发送uImage文件到uboot进行烧写。
其中k键是对应于cmd_menu.c中menu_shell()函数,代码如下:
case 'k': { strcpy(cmd_buf, "usbslave 1 0x30000000; nand erase kernel; nand write.jffs2 0x30000000 kernel $(filesize)"); run_command(cmd_buf, 0); break; }
其中实现了:用usb接收发送的数据下载到0x30000000,接着擦除内核分区,然后将0x30000000地址的东西烧写到nand flash内核分区中,方便下次重启使用,filesize接收文件的大小。
在uboot中输入"mtd"可以查看内核分区位置
0:bootloader 0X00040000 0X00000000 0
1:params 0X00020000 0X00040000 0
2:kernel 0X00200000 0X00060000 0
3:root 0X0fda0000 0X00260000 0
4.重启,烧写文件系统
4.1 在uboot菜单中按b按键重启内核,如下图所示:
若显示VFS: Mounted root (nfs filesystem).字段,表示已安装文件系统
4.2输入”nand erase root”删除内存中root区0x0026000~0x0fffffff文件系统后,重启设备,就会无法启动内核,
所以要想启动内核,必须需要文件系统!!!!!
若编译模块,输入make modules即可,然后模块会编译成.ko文件
人间有真情,人间有真爱。