我正在使用at91rm9200处理器和at45db642D数据闪存将运行修改后的2.6.12.1的传统板上的固件升级为使用at45db641E数据闪存。641E的特点是:
32768页
页面大小264字节
用于擦除页面(264字节)、块(2 KB)、扇区(256 KB)或整个芯片(64兆位)的灵活擦除选项。
我相信内核内存管理器的页面大小是标准的4096字节。
我想在设备上放置一个合适的jffs2图像。我想知道的mkfs.jffs2选项有(来自手册页):
--页面大小:使用页面大小。默认值为4 KiB。此大小是数据节点的最大大小。根据目标系统的内存管理页大小设置(注意:这与NAND页大小无关)。
--擦除块:使用擦除块大小。默认值为64 KiB。如果使用的擦除块大小不同于目标MTD设备的擦除块大小,JFFS2可能无法以最佳方式执行。如果指定的尺寸小于4096,则假定单位为KiB。
他说page size与内核内存管理页面大小(在我的例子中是4096,与默认值相同)有关,而不是设备264字节的页面。所以我需要指定--pagesize=4096而不是--pagesize=264,对吗?
他还说——擦除块必须和MTD设备的擦除块大小相同。我对几件事感到困惑。
641E有几个不同的擦除选项。mkfs.jffs2--eraseblock选项必须选择哪个?
如果正确的选项是641E的页面大小或块大小,那么在假定4096以下的值是以KB为单位而不是以字节为单位的情况下,如何将其指定给mkfs.jffs2?
这个link(由这个相关但不充分的SO question引用)表示jffs2节点必须完全适合一个擦除块。因为它们的大小是4+KB,比设备的“擦除块”大,链接说“你应该将几个擦除块合并到一个64或128 KiB的虚拟擦除块中并使用它-这将是更多的选项”然后“你需要让你的驱动程序报告128KiB的擦除块大小并模拟它,然后它就会工作。我怎么设置这样一个“虚拟擦除块”?
在at91 dataflash driver,device->erasesize=pagesize
内。因此,似乎有一些类似的命名但不同的概念:驱动程序擦除大小、设备擦除块大小和jffs2擦除块大小。它们之间的关系和区别是什么?jffs2指定的擦除块大小最终如何影响驱动程序执行的操作?
谢谢你的帮助。
最佳答案
我已经设法检查了内核中的各种源文件,以确定发生了什么,至少足够让它正常工作。请注意,这适用于2.6.12.1,不一定是更高版本的内核。
有四个术语的名称相似,相关,但不一定相等。从最高到最低。。。
jffs2 eraseblock—这决定了节点在生成的文件系统二进制映像中的位置。
挂载的jffs2虚拟块大小-这决定了在读写jffs2文件系统时节点的布局方式。
mtd core erasesize-这是dataflash驱动程序实现向jffs2文件系统代码报告的最小可擦除单元。
设备擦除页/块/扇区-这些是硬件擦除操作码选项,可供设备驱动程序实现者从闪存中擦除数据。
以下是我所理解的约束条件。
4中的某些选项必须小于或等于3。在at91_dataflash.c文件中,它们相等,并且都等于264字节的页面大小(即mtd core erasesize=flash page size=264字节)。通常,4中可用的一些操作码组合必须加起来正好等于erasesize,并且驱动程序必须相应地执行正确的操作码以擦除erasesize的数据。
名义上,2中的jffs2虚拟块大小等于3中的mtd核心擦除大小。但是,在这种情况下,jffs2代码将自动改变虚拟块的大小。JFFS2代码使用一组需要每个虚拟块存在一个列表节点的链表来跟踪闪存盘上的脏区域和干净区域。所有此类列表节点的总大小都有128KB的限制。如果虚拟块大小非常小,就像在AT45DB642D和AT45DB641E中虚拟块大小=mtd core erasesize=flash device页面大小一样,那么这将创建大量节点并超过节点上的128KB限制。在这种情况下,jffs2 fs代码将自动增加虚拟块大小,并将虚拟块计数减少2倍,直到满足128KB的约束。内核将输出一条消息“jffs2:Erase block size too small(0KiB)”。改为使用虚拟块大小(4KiB)。”(注意精度截断)。我们称之为调整后的虚拟块大小。
调整后的虚拟块大小用于安装存储在闪存上的jffs2 fs。调整后的虚拟块大小必须等于jffs2 image eraseblock size的#1(尽管这表明#1 eraseblock不能大于#2'调整后的虚拟块大小)。我还没有测试过。)
所以在我的例子中,虚拟块大小被内核从264字节调整到4224字节。因此,我的jffs2文件系统通过对mkfs.jffs2使用-e 4224
选项来工作。驱动程序一次擦除一页4224字节长的虚拟块。
其他注意事项:
根据手册页,-s pagesize
选项与内核页大小相关。我使用-s 4096
的内核页面大小。
很可能调整后的虚拟块大小永远不会小于完整jffs2节点所需的大小,因此使用小于4096字节的-e
参数是不可能的,这使得我对单元的问题没有任何疑问。
我希望以上1和2的字节数必须是mtd核心擦除块大小的干净倍数。
可以在内核配置中禁用/启用自动虚拟块大小调整。
关于linux - jffs2选项,闪存设备特征,驱动程序设置和内核内存管理器之间有什么关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36815850/