fastmap是一项实验性和可选的UBI功能,可以启用 通过将CONFIG_MTD_UBI_FASTMAP设置为“y”。启用后,UBI将评估模块 参数“fm_autoconvert”。如果设置为 1(默认值为 0),则自动 UBI 为任何附加的图像启用fatmap。这意味着UBI创建了一个新的内部 具有fatmap数据的卷,以便下次附加图像时, 可以使用快速连接模式。
在默认配置中,UBI将使用存储在此 fatmap卷以加速附加过程。如果你想测试 fatmap,将fm_autoconvert设置为 1 并附加卷。
可以进行以下设置:
CONFIG_MTD_UBI_FASTMAP | fm_autoconvert | 结果 |
---|---|---|
n | 0 | fastmap已完全禁用 |
y | 0 | UBI将使用fastmap数据(如果图像上存在), 但不会在尚未安装fastmap的图像上安装 |
y | 1 | UBI 将使用fastmap数据(如果图像上存在)和fastmap 在所有附加的图像上自动创建 |
1.1 向后兼容性
fatmap磁盘数据结构利用删除兼容卷, 因此,启用fastmap的图像与UBI完全向后兼容 不支持fatmap的实现。内核将删除 fatmap卷并继续扫描。这不仅包括内核 版本 v3.6- 但也是禁用此选项的 v3.7+。
1.2 fastmap 的存储过程
磁盘上的fastmap包含附加整个映像所需的所有信息,
包括:
所有擦除计数器值、
所有 PEB 及其状态的列表、
所有卷及其当前 EBA(eraseblock address) 列表
等…
为了避免fatmap过多的写入,它还包含一个可能已经更改并需要完全扫描的 PEB 列表。 此列表称为“fastmap池”,固定大小为总数的 5% PEB 的数量。根据设计,UBI 仅在池中不包含空闲的 PEB才需要写入fastmap数据 。否则,它必须每次EBA发生改变时,就必须写入fastmap。
fatmap由超级块(也称为锚点 PEB)和可在任何PEB上存储的有效数据组成。 锚点 PEB 必须位于 MTD 设备上的前 64 个 PEB 内。 它包含指向带有实际的fastmap 数据其余PEB的指针。在现代 NAND 芯片上,整个fatmap适合单个 PEB。 因此,锚点 PEB 指向自身。 加载fastmap数据后,从中将创建 UBI 附加信息结构 。
附加过程的工作方式如下:
- UBI试图找到fastmap锚点PEB, 如果未找到锚点 PEB,UBI 将执行传统的完全扫描
- 它遵循存储在锚点 PEB 中的指针并读取 fastmap有效负载数据
- 然后,它仅对池中的 PEB 执行传统扫描 而不是所有 PEB
- 如果UBI检测到fastmap数据无效或损坏 自动回退到扫描模式并执行完全扫描。使用 内部UBI结构的CRC32校验和和一致性检查UBI是 能够检测fastmap数据是否无效。
fastmap数据写入设备:每次fastmap池已满时 (即没有可用的免费 PEB)、卷布局更改或图像被取消挂载,就会写入。如果您想知道为什么需要在取消挂载时将fastmap数据写入,这是因为否则,自上次fatmap写入以来的所有擦除计数器修改将丢失。
1.3 fastmap 的时间和控件开销
支持fastmap的UBI将保留足够的PEB来携带两个完整的PEB fastmap。在实践中,在现代NAND芯片上,需要为fatmap保留两个PEB。
还有一些运行时开销。为了保证新的fastmap有效 并且一致,UBI需要确保在附加过程中阻止所有可能导致EBA更改的I / O。 连接时被阻止。可能长达1s。因此,fastmap仅在快速和大型闪存设备上有意义 否则完全扫描会花费太长时间。例如:在 4GiB NAND 上 芯片 完全扫描需要几秒钟,而快速连接需要不到 一秒钟。
备注
启用fatmap并不能保证每个附加过程都会在最佳时间内完成 。在某些情况下,仍然需要完全扫描。 这可能在两种情况下发生:
(i) 如果在fastmap时发生意外重新启动 写入闪存
(ii) UBI 在写入fatmap时用完 PEB。 如果写入时发生大量 I/O 错误,则可能会发生后一种情况, UBI找不到足够的可用PEB。