ubi 文件系统的fastmap启用

fastmap是一项实验性和可选的UBI功能,可以启用 通过kernel中将配置项CONFIG_MTD_UBI_FASTMAP设置为“y”。启用后,同时,设置UBI模块的参数“fm_autoconvert”。为 1(默认值为 0),则可以启用 UBI的fatmap。UBI会创建一个新的内部 具有fatmap数据的卷,以便下次启动镜像时, 可以使用fastmap模式,从而提高系统加载文件系统的速度。

在默认配置中,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卷并继续扫描。kernel v3.7+都可以使用fastmap启动。

1.2 fastmap 的存储过程

磁盘上的fastmap包含加载整个镜像所需的所有信息,
包括:
所有擦除块计数器值、
所有 PEB (physical eraseblock)及其状态的列表、
所有卷及其当前 EBA(eraseblock address) 列表
等…
为了避免fatmap过多的写入,它还包含一个可能已经更改并需要完全扫描的 PEB 列表。 此列表称为“fastmap pool”,固定大小为总数的 5% PEB 的数量。根据设计,UBI 仅在池中不包含空闲的 PEB才需要写入fastmap数据 。否则,它必须每次EBA发生改变时,就必须写入fastmap。

fatmap由超级块(也称为锚点 PEB)和可在任何PEB上存储的有效数据组成。 锚点 PEB 必须位于 MTD 设备上的前 64 个 PEB 内。 它包含指向带有实际的fastmap 数据其余PEB的指针。在现代 NAND 芯片上,整个fatmap适合单个 PEB。 因此,锚点 PEB 指向自身。 加载fastmap数据后,从中将创建 UBI 附加信息结构 。

附加过程的工作方式如下:

  1. UBI试图找到fastmap锚点PEB, 如果未找到锚点 PEB,UBI 将执行传统的完全扫描
  2. 它遵循存储在锚点 PEB 中的指针并读取 fastmap有效负载数据
  3. 然后,它仅对池中的 PEB 执行传统扫描 而不是所有 PEB
  4. 如果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时发生意外重新启动 写入flash
(ii) UBI 在写入fatmap时用完 PEB。 如果写入时发生大量 I/O 错误,则可能会发生后一种情况, UBI找不到足够的可用PEB。

你可能感兴趣的:(linux,linux)