天嵌 ARM开发社区

 找回密码
 注册
查看: 25444|回复: 18

自己编译好的uboot引导内核 Bad Magic Number

[复制链接]
danshi126 发表于 2011-12-29 21:43:44 | 显示全部楼层 |阅读模式
本帖最后由 danshi126 于 2012-2-4 22:04 编辑

如题,
  UBOOT已经移植完成,已支持NAND Flash,Nor Falsh,DM9000,支持NAND启动,
现我把编译好的内核通过TFTP加载到内存中,再把经写入NAND Flash  可启动时提示:Bad Magic Number



下面是整个过程(内核镜像是天嵌出厂源码):
wangping # tftp 0x32000000 embed.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
MAC: 08:00:3e:26:0a:5b
TFTP from server 192.168.1.100; our IP address is 192.168.1.6
Filename 'embed.bin'.
Load address: 0x32000000
Loading: T #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ##############################################
done
Bytes transferred = 1895256 (1ceb58 hex)
wangping # nand erase 0x00600000 0x00200000

NAND erase: device 0 offset 0x600000, size 0x200000
d
Erasing at 0x600000 --   6% complete.d
Erasing at 0x620000 --  12% complete.d
Erasing at 0x640000 --  18% complete.d
Erasing at 0x660000 --  25% complete.d
Erasing at 0x680000 --  31% complete.d
Erasing at 0x6a0000 --  37% complete.d
Erasing at 0x6c0000 --  43% complete.d
Erasing at 0x6e0000 --  50% complete.d
Erasing at 0x700000 --  56% complete.d
Erasing at 0x720000 --  62% complete.d
Erasing at 0x740000 --  68% complete.d
Erasing at 0x760000 --  75% complete.d
Erasing at 0x780000 --  81% complete.d
Erasing at 0x7a0000 --  87% complete.d
Erasing at 0x7c0000 --  93% complete.d
Erasing at 0x7e0000 -- 100% complete.
OK
wangping # nand write.jffs2 0x32000000 0x00600000 0x1ceb58

NAND write: device 0 offset 0x600000, size 0x1ceb58

Writing data at 0x7ce800 -- 100% complete.
1895256 bytes written: OK
wangping # bootm
## Booting image at 32000000 ...
Bad Magic Number



重启开发板:
U-Boot 1.2.0 (Dec 25 2011 - 17:57:17)

DRAM:  64 MB
Flash:  2 MB
NAND:  256 MiB
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0

NAND read: device 0 offset 0x60000, size 0x200000

Reading data from 0x25f800 -- 100% complete.
2097152 bytes read: OK
## Booting image at 32000000 ...
Bad Magic Number

uboot 环境变量:

bootargs=root=ramfs devfs=mount console=ttySA0,9600
bootcmd=nand read.jffs2 0x32000000 0x00060000 0x00200000; bootm 0x32000000
bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
filesize=1ceb58
fileaddr=32000000
netmask=255.255.255.0
ipaddr=192.168.1.6
serverip=192.168.1.100
stdin=serial
stdout=serial
stderr=serial

环境变量存放地址没有与内核冲突:
#define CFG_ENV_OFFSET        0x40000
 楼主| danshi126 发表于 2011-12-31 16:24:26 | 显示全部楼层
本帖最后由 danshi126 于 2011-12-31 16:48 编辑

谢谢版主亚瑟王,谢谢版主不言DXH的支持,,,内核可以引导了......
  
  原因是UBOOT头文件的加载地址和uImage的加载地址不一致引起的,修改后引导成功,,接下来移植内核和文件系统了.....:lol:lol:lol


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 1 0

使用道具 举报

 楼主| danshi126 发表于 2011-12-29 22:58:53 | 显示全部楼层
内核已经烧写到NAND 中,,,UBOOT 从NAND 启动,,启动完后开始引导内核,,,这个UBOOT 不是天嵌出厂镜像,,,,是我自己移植的     
    如果去掉bl cpu_init_crit  那UBOOT 无法启动了


   我操作过程 就像天嵌出厂源码那样,从NAND 启动,若不按空格,就启动Liunx 了
回复

使用道具 举报

不言DXH 发表于 2011-12-29 23:10:45 | 显示全部楼层
你是要引导内核么?可能是差这句话
mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img
当然这个只是个范例,你按照自己的情况来配置信息吧。
回复

使用道具 举报

不言DXH 发表于 2011-12-29 23:14:02 | 显示全部楼层
3、用 mkzImage 给 zImage 加头信息
如果将内核加载到内存中,用 bootm XXX 命令时出现 Bad Magic Number 错误时,这表
明 Linux 内核缺少头信息,这就要用 mkzimage 给内核镜像加上头信息,方法如下:
将 zImage 文件拷到u-boot-1.1.6/tools/目录下,输入命令:
#mkimage -n 'linux-2.6.25.8' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000
-d zImage zImage.img
回复

使用道具 举报

亚瑟王 发表于 2011-12-30 11:01:51 | 显示全部楼层
启动uImage时,如果制作uImage的参数(特别是内存的连接地址)和u-boot中实际的参数不一样的时候,就会有这样的错误了。用zImage可以解决这个问题。zImage的处理代码在天嵌科技提供的u-boot源码的lib_arm\boot_zImage.c文件中,可以移植到你的u-boot中。
回复

使用道具 举报

 楼主| danshi126 发表于 2011-12-30 13:54:08 | 显示全部楼层
不言DXH 发表于 2011-12-29 23:14
3、用 mkzImage 给 zImage 加头信息
如果将内核加载到内存中,用 bootm XXX 命令时出现 Bad Magic Number 错 ...

mkzImage  我已复制到/usr/local/bin目录下,在编译UBOOT时会自动生成 uImage   

   这样了,还需要    #mkimage -n 'linux-2.6.25.8' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000
-d zImage zImage.img  这一步吗?
回复

使用道具 举报

 楼主| danshi126 发表于 2011-12-30 13:56:28 | 显示全部楼层
亚瑟王 发表于 2011-12-30 11:01
启动uImage时,如果制作uImage的参数(特别是内存的连接地址)和u-boot中实际的参数不一样的时候,就会有这 ...

lib_arm\boot_zImage.c  已移植到我的UBOOT  编译好后  还是出现同样的问题
回复

使用道具 举报

 楼主| danshi126 发表于 2011-12-30 14:12:28 | 显示全部楼层
不言DXH 发表于 2011-12-29 23:10
你是要引导内核么?可能是差这句话
mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x3 ...

  现在做了这步了:

wangping@wangping:~/Desktop/linux-2.6.22$ mkimage -n 'linux-2.6.22' -A arm -O linux -T kernel -C none -a 0x32000000 -e 0x32000000 -d arch/arm/boot/zImage zImage.img
Image Name:   linux-2.6.22
Created:      Fri Dec 30 14:03:16 2011
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    1484520 Bytes = 1449.73 kB = 1.42 MB
Load Address: 0x32000000
Entry Point:  0x32000000


但问题依旧....

U-Boot 1.2.0 (Dec 30 2011 - 13:40:38)

DRAM:  64 MB
Flash:  2 MB
NAND:  256 MiB
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0

NAND read: device 0 offset 0x60000, size 0x200000

Reading data from 0x25f800 -- 100% complete.
2097152 bytes read: OK
## Booting image at 32000000 ...
Bad Magic Number
wangping #
回复

使用道具 举报

不言DXH 发表于 2011-12-30 22:55:21 | 显示全部楼层
实话实说,我还对uboot的移植不是非常熟悉的。刚开始就理解错了你的意思~~很久没有搞uboot移植了:L
对于你这个问题,我有两点要说的:
1. 你使用的nand read.jffs2 和nand write.jffs2命令向nand flash里面写zImage.bin文件是不是合理?我不知道是否合理,但是nand write.yaffs是专门用来烧写yaffs文件系统的。
2. mkimage命令最后是镜像名,天嵌提供的镜像是zImage.bin文件,而不是zImage.img文件。
回复

使用道具 举报

 楼主| danshi126 发表于 2011-12-31 10:42:52 | 显示全部楼层
不言DXH 发表于 2011-12-30 22:55
实话实说,我还对uboot的移植不是非常熟悉的。刚开始就理解错了你的意思~~很久没有搞uboot移植了
对于你 ...

哦,,不管怎么还是得谢谢你!

jffs2 和yaffs都能支持NAND FLASH   只是YAFFS 是专门针对NAND 的,性能高于JFFS2 而已

镜像文件,的后辍可以随便更改,,不要也行
回复

使用道具 举报

不言DXH 发表于 2011-12-31 12:45:44 | 显示全部楼层
danshi126 发表于 2011-12-31 10:42
哦,,不管怎么还是得谢谢你!

jffs2 和yaffs都能支持NAND FLASH   只是YAFFS 是专门针对NAND 的,性能高于 ...

你可以试一下,用nand read 和nand write 命令读写flash,也就是该bootcmd中的nand read和烧写内核时用的nand wirite,然后再将mkzimage命令最后改为zImage.bin试一下(以前我移植uboot的时候,门口紫马哥命令后用zImage.img是不行的)
回复

使用道具 举报

 楼主| danshi126 发表于 2011-12-31 16:48:35 | 显示全部楼层
还有几个问题想不通想请教一下亚瑟王

1,在天嵌移植好的源码(uboot-1.1.6)中  
头文件EmbedSky.h  的加载地址为0x33000000,  
                   引导内核命令参数:  "nboot 0x32000000 kernel; bootm 0x32000000"
         而启动内核时打印出的加载地址却为0x30008000:
##### EmbedSky BIOS for SKY2440/TQ2440 #####
Press Space key to Download Mode !
Booting Linux ...
Copy linux kernel from 0x00200000 to 0x30008000, size = 0x00200000 ... Copy Kernel to SDRAM done,NOW, Booting Linux......
Uncompressing Linux...................................................................................................................... done, booting the kernel.

2.在引导内核命令中""nboot 0x32000000 kernel; bootm 0x32000000""  并无boot_zImage命令,,而启动时却引用了boot_zImage命令,从而调用lib_arm\boot_zImage.c文件中的boot_zImage函数和copy_kernel_img函数,把内核从NAND Flash调到SDRAM中    还是在哪儿直接调用boot_zImage函数了


这两个问题想了两天了都没想明白,,望亚瑟王老大指点迷精
回复

使用道具 举报

 楼主| danshi126 发表于 2012-1-3 17:23:01 | 显示全部楼层
等待亚瑟王的出现.....

自己顶一把.....
回复

使用道具 举报

 楼主| danshi126 发表于 2012-1-19 09:50:12 | 显示全部楼层

等待亚瑟王的出现.....

自己顶一把.....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-8-15 20:02 , Processed in 2.046739 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表