第1章-确定superboot210如何为smart210的nand flash进行的分区划分
来源:互联网 发布:想学程序员 编辑:程序博客网 时间:2024/06/01 08:23
标题的意思简单的而说,其实就是搞清楚superboot210将boot.bin, kernel和根文件系统分别下载到了什么地方。
首先看一下内核的启动信息 (superboot210.bin + linux3.0.8),其中有这么一段:
[ ] S3C NAND Driver is using hardware ECC.
[ ] NAND device: Manufacturer ID: 0xec, Chip ID: 0xdc (Samsung NAND 512MiB 3,3V 8-bit)
[ ] Creating 5 MTD partitions on "s5pv210-nand":
[ ] 0x0000000c0000-0x000000100000 : "misc"
[ ] 0x000000100000-0x000000600000 : "recovery"
[ ] 0x000000600000-0x000000b00000 : "kernel"
[ ] 0x000000b00000-0x000000e00000 : "ramdisk"
[ ] 0x000000e00000-0x000020000000 : "system"
这是在内核当中的分区信息,通常情况下,对于一个追求完美的程序员来说,最好将内核的分区信息和uboot当中的分区信息设置一致,毕竟看起来更舒服一些。但是实际上来说,只要内核的根文件系统的分区和uboot的对应的下载根文件的地址一致即可。这是由启动参数(又叫环境变量)bootargs决定的,开发板提供的这个参数值为:
bootargs=root=/dev/mtdblock4 rootfstype=yaffs2 console=ttySAC0,115200 init=/linuxrc androidboot.console=ttySAC0 skipcali=yes ctp=2
可以看出,根文件系统被放在了mtdblock4的分区上,也就是第4+1个分区,即上面的system分区。
所以从上面的启动信息来看,最后一项system分区肯定是正确的,但是以上四个是正确的吗?在我看来,至少第一个分区就错了,"misc"分区肯定是用来存放boot.bin,这是由ARM启动过程BL0决定的,但是boot.bin一定要放在0x00的位置,上面的启动信息居然是从c0000开始的,这是开哪门子国际玩笑。只有一种解释,这个分区信息和uboot真正的分区信息并不完全对应。
那么"kernel"分区是否对应呢?我们知道,uboot想要引导内核,首先就要从nand flash中将内核读入到SDRAM里,如果我们连kernel存放在nand flash的哪个位置都不知道的话,那根本就没有必要去尝试引导了。
首先在uboot的命令行模式下输入:
nand read 0x20000000 0x600000 0x10000
然后便出现了网上流传很广的那个错误:
NAND read from offset 600000 failed -74
0 bytes read: ERROR
这说明,在0x600000那个位置里,我们没有读出数据来。其实数据已经读出来了,不信可以用md 0x20000000看一下。发生这样的错误原因应该是我自己的uboot使用的ecc机制和superboot210使用的ecc机制不一致造成的。本来我就是想看看kernel在不在0x600000那里,却又引出来一个ecc的问题,挺闹心的。干脆ecc我先放一放,等先确定好内核位置后再着重搞定ecc。但是话又说回来了,这个错误反而给我提供了思路来追终kernel的真正位置。
接下来我先在uboot中执行nand flash擦出工作。
nand srcub.chip
完全擦除nand后,uboot就可以随意正确读取nand flash上的任何位置的数据了。当然读出来的数肯定都是ff ff ff ff ,类似与下面的样子
[ZBL210]# nand read 0x20000000 0x200000 0x800
NAND read: device 0 offset 0x200000, size 0x800
2048 bytes read: OK
[ZBL210]# md 0x20000000
20000000: ffffffff ffffffff ffffffff ffffffff ................
20000010: ffffffff ffffffff ffffffff ffffffff ................
20000020: ffffffff ffffffff ffffffff ffffffff ................
20000030: ffffffff ffffffff ffffffff ffffffff ................
20000040: ffffffff ffffffff ffffffff ffffffff ................
20000050: ffffffff ffffffff ffffffff ffffffff ................
20000060: ffffffff ffffffff ffffffff ffffffff ................
20000070: ffffffff ffffffff ffffffff ffffffff ................
20000080: ffffffff ffffffff ffffffff ffffffff ................
20000090: ffffffff ffffffff ffffffff ffffffff ................
200000a0: ffffffff ffffffff ffffffff ffffffff ................
200000b0: ffffffff ffffffff ffffffff ffffffff ................
200000c0: ffffffff ffffffff ffffffff ffffffff ................
200000d0: ffffffff ffffffff ffffffff ffffffff ................
200000e0: ffffffff ffffffff ffffffff ffffffff ................
200000f0: ffffffff ffffffff ffffffff ffffffff ................
而当我将kernel下载到nand flash当中后,假如我读到了kernel的数据,这时候就会显示错误,就是用这种笨方法,我终于确定了superboot210将kernel实际下载到了0x40000~0x900000的位置。
接下来确定一下uboot将环境变量下载到哪了呢。这个可以直接从uboot源码中找到这样一个宏定义
#define CONFIG_ENV_OFFSET 0x100000
这个宏定义就是说,当我们在uboot中使用save命令的话,它会将程序当中的环境变量保存到nand flash的0x100000的位置上。
所以现在基本上可以确定分区了
0~1M bootloader
1M~4M parameters
4M~9M kernel
9M~14M ramdisk
14M~ rootfs
接下来,重点解决uboot读取内核的ecc问题。
- 第1章-确定superboot210如何为smart210的nand flash进行的分区划分
- mini2440 NAND Flash 上的分区
- [smart210] Nand Flash K9F4G08U0B 的配置与读写控制(一)
- [smart210] Nand Flash K9F4G08U0B 的配置与读写控制(二)
- [smart210] Nand Flash K9F4G08U0B 的配置与读写控制(一)
- [smart210] Nand Flash K9F4G08U0B 的配置与读写控制(二)
- [smart210] Nand Flash K9F4G08U0B 的配置与读写控制(二)
- [smart210] Nand Flash K9F4G08U0B 的配置与读写控制(一)
- MTD分区、NOR flash、NAND flash 的区别
- MTD分区、NOR flash、NAND flash 的区别
- FL2440 Flash分区修改,充分利用256M的nand flash
- FL2440 Flash分区修改,充分利用256M的nand flash
- NAND Flash是如何生产出来的?
- linux下的分区大小如何确定
- powerpc如何创建mtd 分区,nor flash,nand flash,mpc83xx
- 关于NAND flash的MTD分区与uboot中分区的理解
- 关于NAND flash的MTD分区与uboot中分区的理解 .
- 关于NAND flash的MTD分区与uboot中分区的理解
- HP DL380 G6 install exsi5.1.0 with PXE
- android开发给linearlayout设置边框
- JBPM4基础篇-设计请假流程,流程的发起,执行,驳回,监控web Demo
- 两台笔记本怎么连接局域网
- dede article list index 常用 调用标签 .. 待续
- 第1章-确定superboot210如何为smart210的nand flash进行的分区划分
- win7 任务计划功能的使用
- 测试一片文章
- 关于Android在ononLoadFinished中调用performItemClick 出错:Can not perform this acition的解决方案
- vs 2008 调试的时候,任务管理器进程会有个*你的程序名.vshost.exe类似的进程结束不了的解决方法
- django orm总结
- 客户端使用Ajax访问struts2 , struts2如何返回一个json数据!json-lib与flexjson
- sql 定义临时表
- C语言学习笔记(十四) -文件管理 File Manager