Linux下dd读取MMC设备与文件内容不一致问题咨询
问题解答:块设备读取与文件内容不一致的原因
你的怀疑完全正确,问题的核心就是**Linux的页缓存(page cache)**机制,下面结合你的操作步骤具体解释:
页缓存的基本作用
Linux系统会把磁盘上读取过的数据暂存在内存的页缓存中,后续再读取相同位置时直接从内存取,避免重复的磁盘IO操作,大幅提升读写性能。但这个机制在直接读取块设备(如/dev/mmcblk0p8)时,会因为缓存一致性的问题导致你看到的现象。
结合你的实验过程分析
- 第一次写入
test文件并执行sync后,文件内容已经刷到物理磁盘,此时用xxd读取块设备,系统会把对应磁盘块加载到页缓存,所以能正确找到lmk743的位置。 - 修改
test文件并再次sync后,文件系统已经把新内容kukuka097刷到了物理磁盘,但页缓存中之前加载的旧磁盘块(存着lmk743)并没有被更新——因为直接读取块设备时,系统不会主动感知文件系统对磁盘内容的修改,页缓存只会在你主动刷新或清空时才会重新加载磁盘数据。 - 当你不带
direct标志用dd读取块设备时,系统直接返回页缓存里的旧数据,所以看到的还是lmk743;而添加iflag=direct后,dd会绕过页缓存直接读取物理磁盘,因此拿到的是最新的kukuka097。 - 至于通过
/userdata/test文件读取能拿到最新内容,是因为文件系统本身会维护缓存与磁盘的一致性:当文件内容被修改并刷盘后,文件系统会标记对应页缓存为失效,下次读取文件时会重新从磁盘加载最新数据。
解决方法
如果需要直接读取块设备获取最新内容,有两种常用方式:
- 读取前清空页缓存:执行
echo 3 > /proc/sys/vm/drop_caches(需要root权限) - 读取时绕过页缓存:在
dd命令中添加iflag=direct参数,就像你实验中做的那样
内容的提问来源于stack exchange,提问作者wwg
相关产品推荐
相关产品推荐

