JZ2440学习笔记之熟悉u-boot和Linux的移植

制作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可用。

猜你喜欢

转载自www.cnblogs.com/nju347/p/10804007.html