Linux 读取NAND闪存并将其写入另一个系统

Linux 读取NAND闪存并将其写入另一个系统,linux,embedded,arm,jtag,Linux,Embedded,Arm,Jtag,我有一个嵌入式系统,我想读取它的nand闪存,然后将它写回另一个系统的nand闪存。我可以访问设备上运行的Linux系统的根目录。该系统基于AM3874,我也可以访问它的JTAG。 我的问题是: 1-我可以以root用户身份登录系统并将nand闪存数据写入SD卡,然后一个新系统将其写回nand闪存吗 2-如果以上问题的答案是肯定的,我需要什么程序和软件 3-如果回答为否,我是否可以使用JTAG接口读取NAND闪存并将其写入另一个设备 您可以在Linux中使用dd命令读取第一个系统上的设备。在目标

我有一个嵌入式系统,我想读取它的nand闪存,然后将它写回另一个系统的nand闪存。我可以访问设备上运行的Linux系统的根目录。该系统基于AM3874,我也可以访问它的JTAG。 我的问题是:

1-我可以以root用户身份登录系统并将nand闪存数据写入SD卡,然后一个新系统将其写回nand闪存吗

2-如果以上问题的答案是肯定的,我需要什么程序和软件


3-如果回答为否,我是否可以使用JTAG接口读取NAND闪存并将其写入另一个设备

您可以在Linux中使用
dd
命令读取第一个系统上的设备。在目标系统上,您需要在写入NAND闪存之前卸载NAND闪存上的所有文件系统。您可以完全从ramfs或SD卡上的文件系统运行吗?如果您能够卸载它,
dd
应该允许您将内容写回

如果可能,在使用
dd
复制NAND之前,您可能希望卸载源系统上的NAND,这样您就不会复制活动文件系统


你只需要复制文件吗?如果是这样,从第一台设备创建tarball并在另一台设备上解包是否是一种选择?

您可以在Linux中使用
dd
命令在第一个系统上读取设备。在目标系统上,您需要在写入NAND闪存之前卸载NAND闪存上的所有文件系统。您可以完全从ramfs或SD卡上的文件系统运行吗?如果您能够卸载它,
dd
应该允许您将内容写回

如果可能,在使用
dd
复制NAND之前,您可能希望卸载源系统上的NAND,这样您就不会复制活动文件系统


你只需要复制文件吗?如果是这样,是否可以从第一个设备创建tarball并在另一个设备上解包?

您可以使用命令将整个设备或分区复制到文件中

例如:

dd if=/dev/mtd/mtd4 of=/mnt/sdcard/system.img bs=4096
类似于将文件复制到设备的方法

编辑:

当然,这只适用于在linux中具有设备驱动程序的NAND闪存

如果在闪存中安装了文件系统,则可以使用
fd
mount
命令查找正确的设备名称。这样:

~ # df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                53504     13580     39924  25% /
tmpfs                    25600        68     25532   0% /tmp
/dev/mmcblk0p1           77077     67089    722524  92% /mnt/test

~ # dd if=/dev/root of=/mnt/test/root.img bs=4096
13376+0 records in
13376+0 records out

~ # ls -l /mnt/test/root.img
-rw-r--r--    1 root     root     54788096 Oct 26 13:17 /mnt/test/root.img
~ #

您可以使用命令将整个设备或分区复制到文件中

例如:

dd if=/dev/mtd/mtd4 of=/mnt/sdcard/system.img bs=4096
类似于将文件复制到设备的方法

编辑:

当然,这只适用于在linux中具有设备驱动程序的NAND闪存

如果在闪存中安装了文件系统,则可以使用
fd
mount
命令查找正确的设备名称。这样:

~ # df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                53504     13580     39924  25% /
tmpfs                    25600        68     25532   0% /tmp
/dev/mmcblk0p1           77077     67089    722524  92% /mnt/test

~ # dd if=/dev/root of=/mnt/test/root.img bs=4096
13376+0 records in
13376+0 records out

~ # ls -l /mnt/test/root.img
-rw-r--r--    1 root     root     54788096 Oct 26 13:17 /mnt/test/root.img
~ #

如果设备由内核中的mtd驱动程序处理,则这是正确的。然而,并不是所有的闪存芯片都是这样暴露的。引导存储之类的东西在gpio线上挂有一个单独的编程接口,这需要特定于板的工具,这并不少见。我如何才能找到哪个设备是我的nand闪存?你真的需要询问你的硬件供应商,或者其他了解它的人。这个东西没有通用的框架。@User1:谢谢。在您的示例中,您是如何发现/dev/rot是nandflash系统的?@mans:例如,我只是复制了根文件系统“/”。系统中可以有多个NAND或NOR闪存设备。如果想要的数据位于挂载点/foo/bar后面,则对挂载到该点的设备使用dd。如果设备由内核中的mtd驱动程序处理,则这是正确的。然而,并不是所有的闪存芯片都是这样暴露的。引导存储之类的东西在gpio线上挂有一个单独的编程接口,这需要特定于板的工具,这并不少见。我如何才能找到哪个设备是我的nand闪存?你真的需要询问你的硬件供应商,或者其他了解它的人。这个东西没有通用的框架。@User1:谢谢。在您的示例中,您是如何发现/dev/rot是nandflash系统的?@mans:例如,我只是复制了根文件系统“/”。系统中可以有多个NAND或NOR闪存设备。如果所需数据位于挂载点/foo/bar后面,则对挂载到该点的设备使用dd。