0

我正在努力将运行经过修改的 2.6.12.1 与 at91rm9200 处理器和at45db642D 数据闪存的旧板上的固件升级到使用at45db641E 数据闪存。641E的特点是:

  • 32768 页
  • 页面大小为 264 字节
  • 灵活的擦除选项可擦除页面(264 字节)、块(2 KB)、扇区(256 KB)或整个芯片(64 Mbits)。

我相信内核内存管理器页面大小是标准的 4096 字节。

我想在设备上放置一个合适的 jffs2 图像。我想知道的mkfs.jffs2选项是(来自手册页):

  • --pagesize:使用页面大小 SIZE。默认值为 4 KiB。此大小是数据节点的最大大小。根据目标系统的内存管理页面大小设置(注意:这与 NAND 页面大小无关)。
  • --eraseblock:使用擦除块大小 SIZE。默认值为 64 KiB。如果您使用的擦除块大小与目标 MTD 器件的擦除块大小不同,JFFS2 可能不会以最佳方式执行。如果指定的 SIZE 低于 4096,则假定单位为 KiB。

该人说页面大小与内核内存管理页面大小有关(在我的情况下为 4096,与默认值相同),而不是设备的 264 字节页面。所以我需要指定--pagesize=4096 而不是--pagesize=264,这是正确的吗?

该人还说 --eraseblock 必须与 MTD 设备的擦除块大小相同。我对几件事感到困惑。

  1. 641E 有几种不同的擦除选项。必须为 mkfs.jffs2 --eraseblock 选项选择哪个?
  2. 如果正确的选项是 641E 的页面大小或块大小,我如何将其指定给 mkfs.jffs2,因为假定低于 4096 的值以 KB 为单位而不是字节?
  3. 这个链接(由这个相关但不充分的SO 问题引用)说 jffs2 节点必须完全适合擦除块。由于它们的大小为 4+ KB,大于设备的“擦除块”大小,链接显示“您应该将多个 erasblock 连接到一个 64 或 128 KiB 的虚拟擦除块中并使用它 - 这会更理想”,然后是“你需要让你的驱动程序报告 128KiB 的擦除块大小并模拟它,然后它就会工作。它不会开箱即用。” 如何设置这样的“虚拟擦除块”?
  4. at91 数据闪存驱动程序中,device->erasesize=pagesize. 因此,似乎有一些名称相似但不同的概念:驱动程序擦除大小、设备擦除块大小和 jffs2 擦除块大小。它们之间有什么关系和区别?jffs2 指定的擦除块大小最终如何影响驱动程序执行的操作?

感谢您的任何帮助。

4

1 回答 1

0

我设法检查了内核中的各种源文件,以弄清楚发生了什么,至少足以让它工作。请注意,这适用于 2.6.12.1,不一定适用于更高版本的内核。

有四个术语名称相似、相关,但不一定相等。从最高到最低...

  1. mkfs.jffs2 eraseblock - 这决定了节点在生成的文件系统二进制映像中的布局位置。
  2. 挂载的 jffs2 虚拟块大小- 这决定了在读取和写入 jffs2 文件系统时节点的布局方式。
  3. mtd core erasesize - 这是数据闪存驱动程序实现报告给 jffs2 文件系统代码的最小可擦除单元。
  4. 设备擦除页面/块/扇区- 这些是设备驱动程序实现者可用于从闪存擦除数据的硬件擦除操作码选项。

这是我理解的限制。

  • #4 中的某些选项必须小于或等于#3。在at91_dataflash.c文件中,它们是相等的,并且都等于264字节的页面大小(即mtd core erasesize = flash page size = 264 bytes)。通常,#4 中可用的某些操作码组合必须加起来正好等于擦除大小,并且驱动程序必须相应地执行正确的操作码以擦除擦除大小的数据。
  • 名义上,#2 中的 jffs2 虚拟块大小等于#3 中的 mtd 核心擦除大小。但是,在某些情况下,jffs2 代码会自动更改虚拟块大小。jffs2 代码使用一组链表跟踪闪存盘上的脏区和干净区,这些链表要求每个虚拟块存在一个列表节点。所有此类列表节点的总大小限制为 128KB。如果虚拟块大小非常小,就像 AT45DB642D 和 AT45DB641E 的情况一样,其中虚拟块大小 = mtd 内核擦除大小 = 闪存设备页面大小,那么这将创建大量节点并超过节点的 128KB 限制. 在这种情况下,jffs2 fs 代码将自动增加虚拟块大小并将虚拟块计数减少 2 倍,直到满足 128KB 约束。内核将输出一条消息“jffs2: Erase block size too small (0KiB). Using virtual blocks size (4KiB) instead.” (注意精度截断)。我们称其为调整后的虚拟块大小。
  • 调整后的虚拟块大小用于挂载存储在闪存上的 jffs2 fs。调整后的虚拟块大小必须等于#1的jffs2镜像eraseblock大小(虽然这本教科书建议#1的eraseblock不能大于#2'调整后的虚拟块大小。我没有测试过。)

所以在我的例子中,内核将虚拟块大小从 264 字节调整为 4224 字节。因此,我的 jffs2 文件系统通过使用-e 4224mkfs.jffs2 选项来工作。驱动程序一次擦除每个 4224 字节长的虚拟块一页。

其他注意事项:

  • 根据手册页,该-s pagesize选项与内核页面大小有关。我使用了我的内核页面大小-s 4096
  • 调整后的虚拟块大小很可能永远不会小于完整 jffs2 节点所需的大小,因此-e不太可能使用小于 4096 字节的参数,这使得我对单位的问题没有实际意义。
  • 我希望#1 和#2 的所有上述字节数必须是 mtd 核心擦除块大小的干净倍数。
  • 可以在内核配置中禁用/启用自动虚拟块大小调整。
于 2016-04-26T02:07:14.430 回答