主题 : 从Uboot到uImage构建系统总体概述 复制链接 | 浏览器收藏 | 打印
有梦想就有希望!
级别: 新手上路
UID: 44387
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
综合积分: 30 分
注册时间: 2011-04-25
最后登录: 2013-06-23
楼主  发表于: 2012-11-11 12:40

 从Uboot到uImage构建系统总体概述

时日,利用工作之余加紧学习相关文件系统构建方面的知识,终于功夫不负有心人,参照许多资料实践取得成功,从嵌入式小系统的构建算是粗略的走了一遍,走马观花,各大部分掌握的不是很细,但总体上有了浅显的理解,为以后的深究细探打下了良好的基础。兴奋之余,遂想搞出个完整的小系统,当做一种见证也罢,于是辛勤劳作,终于取得成功。其中参考借鉴了网上好多大神的资料和经验,本着开源精神,在此一并表示感谢。现将此小系统的构建过程粗略写写,留以为念。
开发板:FriendlyARM mini2440
虚拟机:基于VirtualBox下的Fedora9.0
虚拟机IP:
    网卡1:192.168.1.200  (host-only方式,用于Samba服务)
网卡2:192.168.1.201  (Bridged方式,用于NFS服务)
一、    Uboot
Uboot类似于PC机的BIOS,起到引导系统的作用,了解了开发板的相关硬件配置和嵌入式Linux基础后,着手开始移植Uboot,网上资料甚是丰富,参考了众多大神的资料,自己也深入的研究源代码,一步一步移植成功。这里主要提及一个重要的文件:/include/configs/mini2440.h,此文件主要用于配置Uboot怎样编译,编译哪些内容,由于要引导自己的系统,所以有给几个选项特别重要,如下:
#define CONFIG_BOOTARGS         "noinitrd root=/dev/nfs rw " \
    "nfsroot=192.168.1.201:/opt/FriendlyARM/mini2440/rootfs_qtopia_qt4 " \
    "ip=192.168.1.230:192.168.1.201:192.168.1.1:255.255.255.0 "    \
    "console=ttySAC0,115200 init=/linuxrc mem=64M "
           /*内核启动的参数,用NFS服务加载文件系统*/
#define CONFIG_ETHADDR            08:00:3e:26:0a:5b
/*开发板网卡MAC地址*/
#define CONFIG_NETMASK          255.255.255.0
/*子网掩码*/
#define CONFIG_IPADDR        192.168.1.230
/*设置开发板IP地址*/
#define CONFIG_SERVERIP        192.168.1.201
/*NFS服务器IP,与虚拟机开发环境一致*/
#define CONFIG_GATEWAYIP        192.168.1.1
/*虚拟机网关*/
#define CONFIG_BOOTCOMMAND  " tftp 0x30008000 zImage.img;bootm"    
/*自启动时执行的命令,通过tftp服务将zImage.img文件下载至SDRAM地址0x30008000中,然后从此地址启动地址*/
    以上选项要和自己的开发环境相一致,不能参考网友的代码,否则不能成功。
二、    uImage
uImage其实为zImage的转换体,编译内核时会在/arch/arm/boot目录下生成zImage文件,这就是压缩的内核,系统启动时要解压缩,然后按照Uboot传递来得参数来启动内核,内核移植也是一大部分内容,针对此开发板,主要在于移植修改其板级文件mach-mini2440.c,也就是板上的相关硬件的驱动修改和配置,具体要参考各器件的数据手册和开发板的硬件连接图,驱动程序大部分都有现成的,只需修改很小的一部分与硬件相关的代码。修改后的内核经过编译生成zImage文件。
在Uboot文件生成后会在其/tools目录下生成mkimage可执行文件,将此文件拷贝至虚拟机/bin目录下,以后就可以在终端直接使用了,在生成的zImage目录下执行命令:
mkimage -n 'Caihu' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img  
结果会生成uImage.img文件,各选项含义在此不做解释,然后将此文件放入tftp服务器工作目录/tftpboot中。用于使用tftp引导系统启动时从此目录拷贝内核文件,与上述配置CONFIG_BOOTCOMMAND相应。
三、    系统启动
    打开超级终端,通过开发板自带的supervivi程序下载Uboot至NANDFlash,
然后启动开关拨回至NANDFlash启动,开机,发现Uboot已经开始运行,迅速按下任意键,结束自动引导过程。
    在终端下输入命令printenv可以看到环境变量的设置值,以上提到的选项都能看到,由于上述默认是通过tftp服务引导启动系统,在此更改部分环境变量值,改成从NANDFlash启动,运行:
     setenv bootcmd ‘nand read 0x30008000 0x800000 0x0050000;bootm 0x30008000’
     saveenv  //保存设置
     连接好交叉网线,在终端下能够ping通虚拟机,证明DM9000网卡移植是正确的,然后依次运行如下命令:
    tftp 0x30008000 uImage.img    //下载内核至内存0x30008000
nand erase 0x80000 0x500000;nand write 0x30008000 0x80000 0x500000
       //先擦除NANDFlash 0x80000开始处的大小0x500000的部分,然后将刚下载至内存0x30008000的内核文件写入NANDFlash
注意此处的0x80000地址和大小0x500000(5MB)要与内核配置中的NANDFlash分区表相一致。此外关于Uboot存放位置和环境参数的存放位置也要和此分区表一致,在此不多赘述。
至此,整个工作已经结束,在NANDFlash中已经下载了Uboot,存储了修改后的启动参数,通过tftp服务下载了uImage.img文件并将其烧写至NANDFlash中,关闭电源重新启动系统,发现已经能够自动引导系统,最后通过NFS服务挂载虚拟机环境下做好了的qtopia文件系统。
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2012-11-11 12:53
不错,支持一下:)
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 89840
精华: 0
发帖: 15
金钱: 85 两
威望: 17 点
综合积分: 30 分
注册时间: 2013-04-06
最后登录: 2013-05-20
2楼  发表于: 2013-04-07 21:22
收藏了先,谢谢分享!