制作u-boot镜像文件:
1.准备源代码和补丁文件:u-boot-1.1.6.tar.bz2 u-boot-1.1.6_jz2440.patch
2.解压源文件 tar -xvf u-boot-1.1.6.tar.bz2
3.打补丁:进入解压根目录,执行 patch -p1 <../u-boot-1.1.6_jz2440.patch(打补丁实际上就是配置u-boot的源代码,我们这里实际上就是用的已经配置好的)
4.修改一下u-boot的提示信息(通过/include/configs/100ask24x0.h::CFG_XXX):
5.在根目录执行配置:make 100ask24x0_config
6.编译:make
7.编译完成会在根目录生成:/u-boot.bin(用于下载到开发板)和/tools/mkimage(用于制作uImage)
8.把u-boot.bin烧录到nand,开机:
制作Linux kernel镜像:
1.准备源文件和补丁文件:linux-2.6.22.6.tar.bz2 linux-2.6.22.6_jz2440.patch
2.解压并打补丁
3.打完补丁,根目录会出现config_ok的文件,把他重命名为.config(我们自己通过make menuconfig来配置内核,最终也是为了生成.config)
4.执行 make 编译,完成后会生成:/arch/arm/boot/zImage(经过压缩的可直接运行的内核镜像)
5.制作uImage(能被u-boot引导的镜像):0x30007fc0是在u-boot源代码里面定义的:
mkimage -A arm -O linux -T kernel -e 0x30007fc0 -a 0x30007fc0 -n linux-2.6.22.6 -d zImage uImage
制作文件系统镜像:
1.下载解压busybox源代码,修改makefile:比如把平台修改为arm,编译工具修改为arm-linux-等
2.make menuconfig(如果make版本太高可能会出现兼容性问题,需修改makefile并安装libncurses5-dev)
// config %config: scripts_basic outputmakefile FORCE %config: scripts_basic outputmakefile FORCE // / %/: prepare scripts FORCE %/: prepare scripts FORCE // make menuconfig报错没有curnses.h // 安装依赖库: sudo apt-get install -y libncurses5-dev
3.编译并安装:make & make install (最好指定一个目录,这样不会破坏PC的环境)
4.在指定目录下会生成:/bin/ /sbin/ /usr/ linuxrc
5.创建其他必要的目录:/etc/ /dev/ /lib/ ......
6.制作文件系统镜像:
mkyaffs2image 目录 xxx.yaffs2
烧录镜像文件:
现在我们已经准备好u-boot.bin uImage xxx.yaffs2文件,并且u-boot已经通过oflash.exe烧录到nand的0地址位置。接下来使用u-boot通过网络来下载uImage 和xxx.yaffs2并烧录。
下面是u-boot的配置信息(包括对nand的分区信息):
Linux kernel和文件系统必须烧写到合适的分区才能被u-boot加载:
// 开机,在u-boot数秒的时候按空格键进入u-boot shell: // 烧写Linux kernel tftp 30000000 uImage // 把内核镜像下载到内存30000000 nand erase kernel // 擦除kernel分区 nand write.jffs2 30000000 kernel // 把内存30000000的内容烧写到kernel分区 // 烧写文件系统(yaffs2) tftp 30000000 xxx.yaffs2 // 把文件系统镜像下载到内存30000000 nand erase root // 擦除root分区 nand write.yaffs2 30000000 0x260000 $(filesize) // 把内存30000000的内容烧写到root分区,0x260000是root分区的起始地址,$(filesize)表示只烧写文件大小的区域,否则默认会烧写整个root分区,这样可以节省时间
u-boot加载uImage:
在u-boot shell下执行 boot 命令,u-boot会去加载Linux kernel并把控制权交给Linux kernel:
1.u-boot首先获取环境变量bootcmd
2.nand命令把内核读到内存,bootm命令从某个内存位置开始执行
3.下图的红色部分是uImage比zImage多出来的文件头,在/u-boot/include/image.h中定义了uImage的文件头结构,共64 bytes:0x27051956是magic number,其他信息包含OS的类型,架构等
u-boot的配置信息,有些(bootargs)是传给kernel使用的,比如noinitrd就是告诉kernel在加载文件系统的时候没有initrd可用。