从/dev/block/mmcblk0和/dev/block/mmcblk0p1读取之间的差异



从/dev/block/mmcblk0读取返回旧数据,而从/dev/blocks/mmcblk0p1读取则提供最新数据。我的问题是,如果数据被写入/dev/block/mmcblk0,linux是否会维护备份?这是因为我能够通过读取该节点来读取SD卡的旧内容。

Linux内核中的mmc子系统注册格式为mmcblkXpY的设备节点。

  • 在Linux内核中注册的每个mmc设备都会收到自己的mmc设备编号X
  • 特定设备上的每个分区都接收自己的编号Y

在挂载指向分区的设备节点后,可以执行正常的文件I/O。

还要注意,除非/dev/mmcblkX设备上存在有效的分区表,否则系统上将不会有后续的/dev/mmcblkXpY节点。

Linux不维护备份它维护一个缓存。这与特定的块设备或驱动程序(在您的情况下为/dev/mmcblk*)无关,而是与块缓存的工作方式有关。

因此,您的观察是正常的,但很危险(通常这不是问题,因为只有root用户才能找到这个"特性"。)

在Linux中,当涉及到缓存时,每个块设备都在内核中独立处理。由于原始设备(在您的情况下为/dev/mmcblk0)和分区(dev/mmcblk0p1)是不同的块设备,都有独立的缓存

如果分区(/dev/mmcblk0p1)被更新,那么分区的缓存当然会被更新,但原始设备的缓存根本没有被更新,因此它变得陈旧(从映射的数据来看,缓存实例仍然被认为是新的)。

如果您再次重新访问原始设备,只要不刷新缓存,就会返回静态(陈旧)缓存数据

这在相反的方向上是正确的,就像通过原始设备更新分区数据时一样后者通常会杀死分区上的文件系统

如果要清除缓存,则需要在重新访问驱动器之前刷新所有缓存。这有两个影响:

  • 刷新还将sync存储磁盘上的数据,因此如果强制将缓存中的脏数据输出到文件系统(也称为分区)。

  • 刷新还可以清除原始块设备上的旧缓存数据。

冲洗使用:

echo 3 >/proc/sys/vm/drop_caches

但要小心。活动分区之后仍可能快速更改。并且您不能从原始设备读取分区缓存的脏数据,反之亦然。

相关内容

最新更新