NationalSemi 发表于 2011-2-27 17:49:05

【请教】u-boot和linux读写flash分区的一些疑问

使用nand flash,u-boot-1.3.4,linux-2.6.18,flash分区如下:

分区            起始地址
u-boot          0
kernel_1      add1
kernel_2      add2
rootfs_1      add3
rootfs_2      add4
data            add5

有两个内核和两个文件系统分区,在运行其中一对kernel+rootfs时,可以通过网络对另一对进行更新。现在主要困惑在于:
1. kernel分区和rootfs分区都使用jffs2。初始烧写内核和文件系统时,u-boot使用< nand write.jffs2 ram地址 分区地址 文件大小 >分别写入
   两个kernel镜像和两个rootfs镜像 ——这一步应该没错吧

2. 假设kernel_1+rootfs_1在运行,要升级kernel_2 + rootfs_2。先把kernel_2和rootfs_2分区用< mount -t jffs2>命令挂载进来,这时可以在
   挂载目录下分别看到两个镜像文件——是这样吧
   把从网络接收到的两个新镜像文件分别替换原来的(在c程序里write()或者在shell脚本里cp),然后重启(相关参数会在data分区设置,以传递
   给u-boot)。这时对于u-boot来说,新的kernel_2镜像的起始地址还是在add2处吗?——因为u-boot里的jffs2读写都是基于flash地址的,而
   linux里的读写都是基于文件的,不考虑具体地址,所以我不知道linux下重写了这个文件后它的起始物理地址有没有变。我自己推测是没变。

3. kernel分区不使用文件系统的话,kernel_1运行时有办法把新kernel_2镜像写入到add2中吗?这时应该不能mount kernel_2分区了,也就是说kernel_1
   要写指定的物理地址,还要自己处理flash坏块。相比第2点,这种方式应该不可取吧?

4. data分区存放一些数据(要从哪个kernel启动、kernel镜像的大小是多少等等),用于kernel和u-boot的交互。这个分区是否要用文件系统呢?
   不用的话,kernel读写数据时存在的问题和第3点类似,u-boot也要管理坏块。但这个分区很小,管理起来不会太麻烦。
   如果用jffs2,那么问题就和第2点类似,linux下是读写文件,u-boot下是从指定地址读写一定长度,它们写入的内容对方都无法理解,这种情况
   应该怎么处理?

谢谢

flagyan 发表于 2011-3-1 13:07:44

这个我觉得还是不要用文件系统的好,linux驱动里可以操作物理地址,自己写个mtd相关的程序应该可以实现。

Cliff 发表于 2011-3-1 14:08:11

1. kernel分区和rootfs分区都使用jffs2。
3. kernel分区不使用文件系统的话

这个……不是矛盾了吗
现在你是怎么做的?

觉得你问的问题,让我很难回答
比如上面1、3的困惑就是之一,另外:

〉mount -t jffs2>命令挂载进来,这时可以在挂载目录下分别看到两个镜像文件
这怎么会看到镜像呢,应该是文件系统里面的东西啊,是镜像就完全完全不对了
〉这时应该不能mount kernel_2分区了,也就是说kernel_1 要写指定的物理地址,还要自己处理flash坏块
当然不是,你要分清楚MTD驱动和FS驱动的区别。

其他实在没法回答了

NationalSemi 发表于 2011-3-1 22:47:30

回复【2楼】Cliff
-----------------------------------------------------------------------

我列出的每一点都是一个疑问

第1点是kernel区使用jffs2,我想知道我所描述的烧写方法是否正确
第2点我说错了,mount kernel区之后是看到kernel镜像(即把uImage文件单独做成一个jffs镜像,我说的kernel镜像指uImage这个文件)
    mount rootfs之后看到是根文件系统
第3点是另一种情况,也就是采用和第1点不同的方式——kernel区无文件系统,这时uImage只是当做普通二进制序列写进去,没啥格式。如果我要在kernel_1+rootfs_1的环境下来更新kernel_2,就要自己提供读写nand flash的函数(包含坏块处理),这可能很麻烦,所以倾向于第一种。

你说的MTD驱动和FS驱动,我不了解,但我觉得这应该就是我想要问的点,你能简单说一下吗?

刚刚了解到,u-boot下可以把jffs2分区的文件读出来,而不一定非要指定物理地址,这样我的问题实际上已经解决了。在kernel区使用jffs2的情况下,我唯一担心的就是uImage更新后不在是从分区的首地址开始存放,这样u-boot就无法引导了
页: [1]
查看完整版本: 【请教】u-boot和linux读写flash分区的一些疑问