jffs2选项,闪存设备特性,驱动程序设置和内核内存管理器之间有什么关系?

时间:2016-04-23 20:11:23

标签: linux embedded flash-memory jffs2

我正在使用at91rm9200处理器和at45db642D dataflash升级运行修改后的2.6.12.1的传统电路板上的固件,使用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。

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

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

  1. 641E有几种不同的擦除选项。哪个必须为mkfs.jffs2选择--eraseblock选项?
  2. 如果正确的选项是641E的页面大小或块大小,我如何指定mkfs.jffs2,假设低于4096的值假设为KB而不是字节?
  3. link(由此相关但不足SO question引用)表示jffs2节点必须完全适合擦除块。由于它们的大小是4+ KB,大于"擦除块"设备的大小,链接说"您应该将几个erasblock连接到一个64或128 KiB的虚拟擦除块并使用它 - 这将是更多的optiomal"然后是"您需要让您的驱动程序报告128KiB擦除块大小并模拟它,然后它才能工作。它不会开箱即用。"如何设置这样的"虚拟擦除块"?
  4. at91 dataflash driverdevice->erasesize=pagesize内。因此,似乎有一些类似命名但不同的概念:驱动程序擦除,设备擦除块大小和jffs2擦除块大小。这些之间的关系和差异是什么? jffs2指定的eraseblock大小最终如何影响驱动程序执行的操作?
  5. 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我已经设法检查内核中的各种源文件,以确定发生了什么,至少足以使其正常工作。请注意,这适用于2.6.12.1,不一定适用于更晚的内核版本。

有四个术语具有相似的名称,相关但不一定相同。从最高层到最低层......

  1. mkfs.jffs2 eraseblock - 这决定了在生成的文件系统二进制映像中布置节点的位置。
  2. 已安装jffs2 virtual blocksize - 这决定了在读取和写入jffs2文件系统时如何布置节点。
  3. mtd core erasesize - 这是dataflash驱动程序实现向jffs2文件系统代码报告的最小可擦除单元。
  4. 设备擦除页/块/扇区 - 这些是硬件擦除操作码选项,可供设备驱动程序实现者擦除闪存中的数据。
  5. 以下是我理解的约束条件。

    • #4中的某些选项必须小于或等于#3。在at91_dataflash.c文件中,它们是相等的,并且都等于264字节的页面大小(即mtd core erasesize = flash页面大小= 264字节)。通常,#4中可用的某些操作码组合必须完全符合擦除大小,驱动程序必须相应地执行正确的操作码以擦除擦除数据。
    • 名义上,#2中的jffs2虚拟块大小等于#3中的mtd核心擦除大小。但是,存在jffs2代码将自动改变虚拟块大小的情况。 jffs2代码使用一组链接列表跟踪闪存盘上的脏区域和干净区域,这些链接列表要求每个虚拟块存在一个列表节点。所有此类列表节点的总大小限制为128KB。如果虚拟块大小非常小,因为在AT45DB642D和AT45DB641E情况下,虚拟块大小= mtd核心擦除=闪存设备页面大小,那么这将创建大量节点并超过节点上的128KB限制。在这种情况下,jffs2 fs代码将自动增加虚拟块大小并将虚拟块计数减少2倍,直到满足128KB约束。内核将输出一条消息“jffs2:擦除块大小太小(0KiB)。使用虚拟块大小(4KiB)代替。” (注意精确截断)。我们称之为调整后的虚拟块大小。
    • 调整的虚拟块大小用于安装存储在闪存上的jffs2 fs。调整后的虚拟块大小必须等于#1的jffs2图像擦除块大小(尽管此textbook表明#1 eraseblock必须不大于#2'调整后的虚拟块大小。我还没有测试过它。)

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

    其他考虑因素:

    • 根据手册页,-s pagesize选项与内核页面大小相关。我使用-s 4096使用了我的内核页面大小。
    • 调整后的虚拟块大小很可能永远不会小于完整jffs2节点所需的大小,因此使用小于4096字节的-e参数是不太可能的,这使我的单位问题无法解决
    • 我希望#1和#2的所有上述字节数必须是mtd核心擦除块大小的干净倍数。
    • 可以在内核配置中禁用/启用自动虚拟块大小调整。