Transclude of 【docker】局域网服务器如何拉取镜像-synced-block

遇到的场景

flash上存放着某个芯片的固件,该固件通过工具烧录进去

想通过linux 下的 spi-nor flash 驱动去读取该flash里的内容是否与原始固件一样,来验证烧录工具做了什么更改

方法

  1. dts中使能spi通道,并添加子设备spi-flash@0x0节点(前提是spi-nor包含了该flash型号,不然要写个驱动)
  2. 上电,系统安装一个mtd工具
sudo apt-get update
sudo apt-get install mtd-utils
  1. 读取该flash上的固件
# 会读取flash上所有的内容,如果flash较大,且spi速率慢会花很长时间
nanddump /dev/mtd0 -o dump_file.bin
 
# 指定读取,比如要读取 374360 byte
dd if=/dev/mtd0 of=/path/to/read.bin bs=374360 count=1
 
# 指定读取,比如要读取 374360 byte, 起始地址0x10
dd if=/dev/mtd0 of=/path/to/read.bin bs=374360 count=1 skip=16

补充

在dd命令中,count参数指定要读取的块数。 参数解释:

  • bs=4096:指定每个块的大小为4096字节(4KB)。
  • count=10:指定读取10个块。
  • skip=0 和 skip=10:指定跳过的块数,即从哪个块开始读取。

示例说明:

dd if=/dev/mtd0 of=output_part1.bin bs=4096 count=10 skip=0
  • 该命令从/dev/mtd0的起始位置(skip=0)读取10个块,每个块大小为4096字节,总共读取10 * 4096 = 40960字节(即40KB)的数据,并将其保存到output_part1.bin文件中。
dd if=/dev/mtd0 of=output_part2.bin bs=4096 count=10 skip=10
  • 该命令从/dev/mtd0的第11个块开始(skip=10),读取10个块的数据,总共读取40KB,并将其保存到output_part2.bin文件中。

总结:

count参数决定了dd命令读取的数据量,具体数量由count * bs决定。

  1. 获取到 read.bin 后对比原始固件
diff read.bin source.bin
 
# 如果不相同会提示:二进制文件 read.bin 和 source.bin 不同
  1. 想定位哪里不同,怎么办
# 转换为hex文件
hexdump -C read.bin > read.hex
hexdump -C source.bin > source.hex
 
# diff 对比
diff read.hex source.hex
# 会显示不同的地方
# xxxx