原创 使用U-boot直接加载zimage内核[转]

2009-7-27 10:23 4548 8 8 分类: MCU/ 嵌入式
 




最近用三星的S3C6410,感觉他的u-boot可以直接加载zimage的功能很酷,于是稍微修改sep4020的u-boot代码,同样直接加载zimage!
以后再也不需要使用mkimage来制作uimage文件了。


先看看S3C6410是如何实现的:


1)首先在inlcude/configs/smdk6410.h中发现有如下定义
#define CONFIG_ZIMAGE_BOOT


2)在common/cmd_bootm.c文件的do_bootm函数中有如下内容“
#ifdef CONFIG_ZIMAGE_BOOT
#define LINUX_ZIMAGE_MAGIC 0x016f2818
if (*(ulong *)(addr + 9*4) == LINUX_ZIMAGE_MAGIC) {
   printf("Boot with zImage\n");
   addr = virt_to_phys(addr);
   hdr->ih_os = IH_OS_LINUX;
   hdr->ih_ep = ntohl(addr);
   goto after_header_check;
}
#endif


goto after_header_check;就是跳转到
do_bootm_linux (cmdtp, flag, argc, argv,
        addr, len_ptr, verify);
函数去。


3)分析下,如果定义这个宏,要想加载zimage,需要做哪些事情呢?
a 判断魔数(不要判断也行吧。。)
b 配置启动地址
c 配置os类型为linux


OK,了解三星是如何实现加载zimage的,看看我们的SEP4020 u-boot-1.3.3吧


1)首先在inlcude/configs/UB4020.h中添加宏定义
#define CONFIG_ZIMAGE_BOOT


同时修改30007fc0为30008000
#define CFG_LOAD_ADDR 0x30008000   /* default load address */


2)修改common/cmd_bootm.c文件
在do_bootm函数的开始就添加:


#ifdef CONFIG_ZIMAGE_BOOT
printf("Boot with zImage\n");
do_bootm_linux (cmdtp, flag, argc, argv, &images);
#endif


为什么不是配置os信息而是直接跳转呢?因为u-boot-1.3.3和三星的不太一样(感觉三星做了很多修改),各种信息都是通过image获得的,不如直接跳过这个函数,在do_bootm_linux函数中添加信息。


3)修改lib_arm/bootm.c文件的do_bootm_linux函数:
line79+++ images->legacy_hdr_valid = 1;
line82--- ep = image_get_ep (&images->legacy_hdr_os_copy);
line82+++ ep = CFG_LOAD_ADDR;


好了,我没有判断魔数,管他呢,现在可以直接加载zimage文件,忘掉30007fc这个地址吧!


SEP4020=>tftp 30008000 zimage26
TFTP from server 192.168.0.1; our IP address is 192.168.0.2
Filename 'zimage26'.
Load address: 0x30008000
Loading: #################################################################
         #################################################################
         ########
done
Bytes transferred = 703520 (abc20 hex)
SEP4020=>bootm
Boot with zImage


Starting kernel ...


Uncompressing Linux............................................... done, booting the kernel.
Linux version 2.6.26 (root@kyon-desktop) (gcc version 3.4.1) #22 Tue Jun 23 13:37:20 CST 2009
CPU: ARM720T [41807202] revision 2 (ARMv4T), cr="0000217f"
Machine: 4020 board
Memory policy: ECC disabled, Data cache writeback
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 8128
Kernel command line: root="/dev/nfs" rw nfsroot="192".168.0.3:/nfs ip="192".168.0.2:192.168.0.3:192.168.0.1:255.255.255.0:sep4020:eth0:off console="ttyS0",115200 mem="32mb"



SEP4020 U-boot-1.3.3 测试版V5
重要改进:


直接加载内核编译生成的zimage文件,不需要使用mkimage制作vmlinux.img文件


使用方法:


SEP4020=>tftp 30008000 zimage26


SEP4020=>bootm

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条