我需要测试某些嵌入式硬件的一些读/写代码的弹性。我怎样才能牺牲一些SD卡并破坏几个已知的扇区进行受控研究?

我唯一能想到的就是覆盖单个扇区几百万次。我想知道是否可以创建Linux badblocks脚本来在单个扇区上重复运行几个小时的破坏性测试。

评论

您可以更改低级SD驱动程序来假装有坏块吗,还是那是不可能的?

@MarkYisri,我认为该驱动程序不易访问。无论我们使用什么驱动程序,都是超基本的,可以最大程度地为其余固件分配内存。另外,如果可能的话,那可能超出了我的能力范围。

您可以构建SD卡模拟器吗?请注意,这不是最简单的项目。

有了这个目标,您可以花很少的钱购买一些二手SD卡,而您很容易会得到一张有问题的SD卡,或者放一个“寻找...”公告来专门寻找有问题的卡。或在eBay上搜索有缺陷的卡。然后测试卡,就可以知道缺陷区域的位置。

询问任何专业摄影师。他们肯定会有一堆粗略的SD卡。

#1 楼

另一种可能有用的方法。
如果您的代码在Linux下运行,则可以使用“故障”逻辑设备对其进行测试。 dmsetup可以创建返回I / O错误的设备。只需使用error和/或flakey目标构建设备即可。来自man 8 dmsetup

error
使进入该区域的任何I / O错误。对测试或创建带有孔的设备很有用。
flakey
创建与linear目标的相似映射,但会周期性地表现出不可靠的行为。在测试时用于模拟故障设备很有用。

注意:此处记录了flakey目标用法。这里的基本示例。
据我所知,I / O错误将立即报告,因此这与实际的SD卡行为有所不同,在真实的SD卡行为中,您可以预期会出现延迟,停顿等情况。尽管如此,我认为这种方法可能会有用在某些情况下,至少要进行快速的初步测试。

评论


我很欣赏开箱即用的想法!我们正在通过80MHz Atmel芯片在无块级上将SD与SD接口,而没有实际的OS。

–加布·克劳斯(Gabe Krause)
17年9月11日在18:44

@GabeKrause在这种情况下,此答案的有效性取决于Linux块设备API与嵌入式设备驱动程序API的相似程度。

– Qsigma
17年9月12日在8:10



dmsetup命令用于设置始终返回读取错误的错误设备:stackoverflow.com/questions/1870696/…

– Peter Cordes
17 Sep 15'7:28



我同意这听起来是一个更好的解决方案。首先,您可以在任何硬件上进行复制。您还可以模拟不同的错误模式。例如,我有一个工作正常的16GB USB闪存驱动器。经过一段时间后,虽然它上的特定区域开始返回错误的数据。没有任何FS错误。您读取了文件,但是内容不同。有些部门显然是不稳定的。但是某些特定设备的行为方式无法事先知道。

–akostadinov
17年9月15日在8:51

#2 楼

这个家伙入侵了用于标记坏块的SD卡中的微控制器:https://www.bunniestudios.com/blog/?p=3554

您可以执行相同操作并随意标记块



今天在混沌计算机大会(30C3)上,xobs和我披露了一个
发现某些SD卡包含允许任意代码执行的漏洞。 —在存储卡本身上。在黑暗的
方面,执行存储卡上的代码可以执行一类MITM
(中间人)攻击,其中存储卡似乎表现为
方式,但是实际上,它还有其他作用。从另一方面来说,它
还使硬件发烧友有可能访问非常便宜且无处不在的微控制器资源。





这些算法太复杂且特定于设备,无法在应用程序或操作系统级别上运行
,因此事实证明,每个闪存
内存磁盘都附带一个功能强大的微控制器,可运行一组自定义的磁盘抽象算法。甚至很小的microSD卡都不包含一个芯片,而是至少包含两个芯片(一个控制器)和至少一个闪存芯片(高密度卡将堆叠多个闪存芯片)。





嵌入式微控制器通常是经过大量修改的8051或ARM CPU。在现代实现中,微控制器将达到100 MHz的性能水平,并且还具有多个片上硬件
加速器。令人惊讶的是,将这些控制器添加到设备中的成本大约为$ 0.15- $ 0.30,对于那些可以在同一业务中同时制造闪存和控制器的公司来说,尤其是
。单元。添加这些
微控制器可能要比全面测试和表征每个闪存更便宜
内存芯片,这解释了为何尽管包含了
微控制器,托管闪存设备每位仍比原始闪存芯片便宜的原因。


>

关键是固件加载和更新机制实际上是强制性的,尤其是对于第三方控制器。最终用户
很少接触到此过程,因为这一切都是在工厂进行的,
但这并不会使该机制变得不那么真实。在对中国电子市场的探索中,我看到商店的店主在卡上烧固件,从而“扩展”卡的容量,换句话说,他们加载了固件报告存储卡容量
比实际可用存储空间大得多。在销售点这可能是
的事实意味着很可能没有安全的更新
机制。

在我们30C3的演讲中,我们报告了我们探索的发现特定的微控制器品牌,即Appotech及其AX211和AX215
产品。我们发现通过制造商保留的命令(即CMD63后跟
'A','P','P','O')传输的简单“敲门”序列将控制器放入一个固件加载
模式。此时,卡将接受下一个512字节并将其作为代码运行。


评论


在所有答案中,这个答案可能是最接近OP实际要求的答案。

–Cort Ammon
17年9月12日在18:56

那真是太棒了!

–加布·克劳斯(Gabe Krause)
17年9月12日在21:21

@Twisty复制了一些相关部分。

– FarO
17年9月13日在12:24

深入研究SD卡架构的世界。

– Tejas Kale
17年9月15日在11:23

#3 楼

这通常不起作用,因为最新的SD卡(或eMMC)使用静态和动态损耗均衡,这意味着智能控制器会解释您的写指令并将其映射到使用最少的闪存扇区之一。

您唯一可以做的就是尝试与供应商联系并索取其数据表;可能有一些(特定于供应商的)方法来检索其损耗均衡算法的状态。这可能使您可以查询基础闪存的状态/使用情况。否则,您可能会很不幸,并且这种情况可能不存在。

如果您的目标是真正销毁闪存,那么您所能做的就是运行大量的读写周期,并不断检查所读取的数据是否正确。仍然一致。例如。创建两个大文件,存储它们的校验和并对其进行读写,以验证其校验和。闪光灯越大,此过程将花费的时间越长。

评论


如果SD卡中已完全填满数据,这样就不能重新映射太多,这仍然行不通吗?我认为他们没有很多备用的隐藏扇区。

–俄罗斯
17年9月11日在11:59



@Ruslan设备不需要知道扇区是否充满了任何东西。它只需要知道应请求传送哪些扇区以及应请求写入哪些扇区的内容。然后可能存在适当的抽象层,使其遵循某种未公开的算法使用其他物理内存来表示那些扇区...-当然,“满”仅表示“达到了当前可填充块的阈值”。

–我和Monica在一起
17年9月11日13:37



@Ruslan:即使整个设备上都有数据,耗损均衡仍然可以有效:例如,如果扇区A已被写入一次,扇区B已被写入1000次,则需要进行另一次写入卡可以在扇区B中交换两个扇区的数据,因此扇区A包含扇区B的数据(并且可能会被覆盖很多次-但这是可以的,因为它是新鲜的),而扇区B将包含扇区A的数据(希望不会有太大变化)。显然,设备还需要存储将哪个扇区存储在哪里的映射。

–psmears
17年9月11日在15:13

@GabeKrause是的,那是野兽的本质。在最低级别上,您具有nand或norflash芯片(如今,所有东西都在使用nand),并且在nand芯片前面有一个智能控制器,用于终止总线(例如,usb棒的usb或sd卡的mmc ),该芯片负责映射/损耗平衡等,它将闪光从您身上抽象出来。如果您要在嵌入式Linux上使用nand,例如ubifs就会为您做。

–amo-ej1
17年9月12日在7:57

SD卡具有一个实现“闪存转换层”的微控制器-该微控制器将块请求转换为原始NAND命令。某些SD卡具有隐藏的命令,用于更改/更新MCU固件,甚至还进行了一些逆向工程。除原始NAND(在某些情况下可能会出现在许多家用路由器中)之外,大多数闪存设备可能都是“预留空间过大”的-这意味着您的1GB SD卡上可能具有诸如1024MB + 128MB的原始NAND空间,以在装满后弥补磨损并为坏Flash页面进行扇区保护。

–LawrenceC
2017年9月12日16:57



#4 楼

您可以通过提高操作温度来增加晶体管的损耗。在加热的芯片(70-120°C)上使用写擦除循环;它会磨损得更快。

评论


过高的存储温度也会造成破坏,因此将芯片在120°C(或更高)的温度下“烹饪”一段时间,然后检查是否有缺陷可能更为实际。

–德米特里·格里戈里耶夫(Dmitry Grigoryev)
17年9月11日在14:08

卡的电源上也可能有轻微的过电压,并且同样需要进行试验。

–克里斯H
17年9月12日在15:17

欠压还可能导致不同类型的缺陷,例如控制器锁定。

–user253751
17年9月19日在3:26

#5 楼

前言:此选项需要进行其他编程和硬件修改,但允许对主机透明的受控读取。

SD卡具有多个I / O选项,但可以通过SPI控制。如果要取出SD卡并进行修改,以便可以将引脚连接到微控制器(例如Arduino),则可以让Arduino模仿SD卡并对读取SD卡的设备透明。在微控制器上的代码可能会在需要时有意返回错误数据。此外,您可以将SD卡放在微控制器上,以便读取数据可以通过微控制器到达SD卡,以进行千兆字节的测试。

评论


大多数高速设备(包括PC读卡器)只会拒绝使用不支持四位SD的卡。

–德米特里·格里戈里耶夫(Dmitry Grigoryev)
17年9月11日13:30在

OP说这是一个嵌入式系统,它将使用该卡,这将使其更有可能支持sd卡的SPI。

–埃里克·约翰逊(Eric Johnson)
17年9月11日15:00

在此方法上的一个变种(但更艰苦的工作)是找到可以为其刷新固件的SD卡。

– Peter Taylor
17年9月11日在15:09

超级有趣!我们的嵌入式系统正在通过SPI运行I / O。我不确定是否有带宽来修改我们的硬件以完成这样的添加,但是我认为这是一个绝妙的想法。

–加布·克劳斯(Gabe Krause)
17年9月11日在18:51

受过动态磨损均衡的教育后,我相信,战略上创建具有已知坏扇区的“坏” SD卡要比提出问题时希望的要困难得多(或不可能)。虽然目前超出了我的能力范围,但这似乎是最可控的技术上最有前途的方法,其次可能是@Olafm。自定义中间硬件以在数据传输期间在任何预定义的扇区位置截取和“破坏”数据似乎是一个好方法。

–加布·克劳斯(Gabe Krause)
17年9月14日下午16:31

#6 楼

我会去ebay / aliexpress买我在中国能找到的最便宜的SD卡,一张“实在太好了”。它们通常带有错误的扇区,或者在软件中设置得比实际大小大得多。无论哪种方式,都应该以有故障的SD卡结束才能进行测试。

评论


有趣的方法,但是您将如何写入坏区以测试坏块对存储代码的影响?

–fixer1234
17年9月18日在21:34

@ fixer1234,我有一张SD卡说它是32GB,但实际上只有128MB。我将其放在相机中,可以拍摄超过128MB的照片,但只能读取第一张照片。其余的已列出,但被读回为已损坏。猜猜这是他们想让您太晚抱怨时才希望您首先注意到卡的问题...

– GuzZzt
17年9月19日在6:42

#7 楼

很久很久以前,我曾受薪从SD卡中找回了一位心烦意乱的母亲的一组毕业照片和录像。经过仔细检查,该卡在某种程度上受到了物理损坏,外壳上有明显的裂纹,并且有几个坏道,最显着的是几个早期的关键扇区,这甚至使当时最可靠的恢复程序也完全无法读取该卡。 。此外,当时的取证数据工具也花了一大笔钱。

我最终获得了相同品牌/大小的SD卡,并编写了自己的自定义原始数据转储和还原实用程序,以便将不良卡中的数据复制到好人。公用事业每次遇到一个坏扇区时,都会在写入该扇区的所有零之前重试多次,而不是放弃并停止,而忽略故障并转到下一个扇区。由于我还注意到某些扇区的读取成功率仍约为40%,因此进行了重试尝试。数据存储在新的SD卡上之后,以前曾出现故障的恢复工具可以完美地工作,并且数据丢失/损坏最小。总体而言,已恢复了所有文件的约98%。由于以前从未删除过任何内容,因此也恢复了许多以前删除的项目-只是将其标记为此类内容并慢慢将其覆盖。最初是一个稍微无聊的数据恢复工作,后来成为我更难忘和有趣的个人软件开发项目之一。如果您想知道,那位母亲很高兴。

无论如何,这个故事表明,有可能物理损坏SD卡,使得仍然可以访问数据,但是扇区只有几乎没有任何功能,任何尝试从中读取内容都很难。 SD卡塑料往往非常脆弱,因此弯曲或切成一些便宜的塑料也许可以解决问题。您的里程可能会有所不同。

您也可以在您所在地区的一些数据恢复场所四处询问。由于它们专门用于从各种发生故障或发生故障的设备中恢复数据,因此它们应该具有一些有用的输入/提示,甚至可能手头上有一些预烧制的SD卡(例如用于培训目的),您可以从中获取它们。

评论


您是否已在线发布该实用程序?那将是增加我的武器库的好方法。

– Ploni
17年9月13日19:50在

在这一点上,考虑到技术的进步(甚至可能无法编译)和我使用的低级系统调用,它甚至可能无法正常运行。还有一些现代的,开放源代码的取证设备/驱动器克隆工具,比起将我的旧软件从闲置状态中拉出来,我更倾向于先尝试使用。

– CubicleSoft
17年9月14日在6:00

我希望您现在可以为dd提供一些参数,以使其表现与此类似。我不确定。

– wizzwizz4
17/09/16在12:24



@ wizzwizz4,看看ddrescue。

–躲藏
17年9月17日在20:16

“此外,当时的取证数据工具也花费了一笔巨款。”我很确定他们仍然会这样做。

– jpmc26
17-09-19在2:40



#8 楼

这个答案是对@Ruslan的评论的扩充。

将SD卡填满约99.9%
继续重写其余0.1%的内容(写A -delete-write B-delete-写A ...)
(定期)测试是否已损坏卡


可能的选择:

不确定这是否适合您的目的,但实际上足以破坏卡,可能会更快。

评论


将卡填充到99%并没有帮助,因为整平磨损的整个目的是为了防止这种过早的损坏。物理损坏存储卡几乎可以肯定会导致存储卡不再初始化。

–德米特里·格里戈里耶夫(Dmitry Grigoryev)
17年9月11日在13:44



@DmitryGrigoryev除非存储卡的存储量超过其官方容量,否则如何进行配平会有很大帮助(在这种情况下为阻碍)?

– ispiro
17年9月11日14:10在

@ispiro例如,下次重写具有高写计数的扇区时,其内容可以与具有低写计数的扇区交换。

–德米特里·格里戈里耶夫(Dmitry Grigoryev)
17年9月11日14:13在

@DmitryGrigoryev如果我正确解释了这个答案,应该有不磨损的SD卡:electronics.stackexchange.com/a/27626/16104

– Dennis Jaheruddin
17年9月14日在7:42

@DennisJaheruddin是的,年长的卡不会这样做。使用这些卡,足以重复创建/删除一个空文件,直到分配表中的扇区用完为止。

–德米特里·格里戈里耶夫(Dmitry Grigoryev)
17年9月14日在11:04

#9 楼

您可以尝试引入不稳定的电源或更高电压的信号。

我知道的一系列设备的常见故障与SD卡损坏和电池间歇性接触密切相关。

#10 楼

一些较旧的低容量SD卡(16MB容量)使用TSOP / TSSOP样式的封装的闪存芯片。可以进行SMT返修的车间(如果您从事嵌入式工作,您可能拥有内部技能,否则请检查进行板级电话/笔记本电脑维修的小公司)可以分离并重新安装该芯片,以便可以对其进行读写设备编程人员原始数据(包括ECC代码)。

仍然请注意,您将主要测试:


设备将如何处理可能的时序内部错误校正引起的像差/打ic,最坏的情况是


设备如何处理最终出现故障的SD卡。

如果您只是想出于某种原因检查一下SD卡是否表现出不稳定的行为,最好将电气噪声引入接口线中(例如,通过在其间以及在任意随机的时间插入FET总线开关)将其切换到无意义的信号源(尽管具有正确的电水平)。

评论


最终出现故障的SD卡不会产生“电噪声”,它们只会返回错误代码以进行写操作。

–德米特里·格里戈里耶夫(Dmitry Grigoryev)
17-09-27在10:55

#11 楼

与OlafM的答案有关,但有所不同:您可以对自己的微控制器进行编程以说出SD卡协议,然后模拟所需的行为。

#12 楼

FAT32主引导记录区域可能最容易受到滥用,因为从逻辑上讲,它始终需要位于同一位置。 (也许这是通过坏扇区的软重映射来处理的,但是我对此表示怀疑,因为它是在所有硬件上实现的。)因此,您可以循环运行sfdisk,看看是否可以这样破坏它。

但是我要请您尽一切努力提高硬件可靠性,而不是尝试处理软件中的不良硬件。问题是SD卡会以各种奇怪的方式失败。它们变得不可读,变得无法写入,为您提供不良数据,它们在操作期间超时等。尝试预测卡可能发生故障的所有方式非常困难。

这是我最喜欢的故障之一,“大数据模式”:SD卡是承受巨大成本压力的商品消费类产品。零件变化很快,数据表很难获得。假冒产品并非闻所未闻。对于便宜的存储而言,它们很难被击败,但是尽管SSD是可靠性的重中之重,但SD卡的优先级是速度,容量和成本(可能不是按顺序排列)。

您的第一道防线是使用具有知名制造商的真实数据表的可焊接eMMC零件代替可移动SD卡。是的,它们每GB的成本更高,但是该部件将在更长的时间内投入生产,至少您知道自己得到了什么。向下焊接部件还可以避免使用可移动卡带来的一系列潜在问题(卡在写入过程中被拉出,不良的电接触等)。

如果您的产品需要可移动存储,或者更改任何内容为时已晚,请考虑将多余的钱用于“工业”等级卡,或将其视为一次性物品。我们要做的(在Linux下)是fsck引导卡,如果报告任何错误,请重新格式化,因为在此用例中,重新格式化是可以接受的。然后我们再次。如果重新格式化后仍然报告错误,我们将对其进行RMA处理,并使用使用eMMC的较新版本替换硬件。

祝您好运!

评论


我给你竖起大拇指。我大量使用SD卡,一年中有几次失败。我从没想过,但以我自己的经验,我的失败卡片在最终变得毫无价值之前确实表现出FAT失败的症状。我认为您正在这里:)因此,简单地创建和删除文件应该可以有效地解决FAT问题。

– jwzumwalt
17年9月15日在20:01



#13 楼

也许这不是您想要的方向,但我发现在收音机或笔记本电脑读取SD卡的同时将其取出,可以保证SD卡损坏的次数约为1/5或1/10倍。在读取和大概写入期间断电似乎卡效果不佳。在阅读了以下罗伯特·卡尔霍恩的评论后,它使我相信这可能会损害FAT。尽管我不知道为什么只是读书会导致崩溃-应该不写任何东西吗?

评论


这可能会损坏FS,但不确定是否会创建坏扇区

–akostadinov
17年9月15日在8:46

我可以告诉您一个事实,它会使卡崩溃,并需要重新格式化。我已经用SD卡,Raspberry Pie,我的笔记本电脑以及我的一些家用设备做了很多次。

– jwzumwalt
17年9月15日在19:56

要求重新格式化!=会损坏扇区。文件系统,是的。部门,也许。

– wizzwizz4
17年9月16日在12:26

#14 楼

如果您的sd卡为FAT32格式,则可以十六进制编辑这两个脂肪,并使用正确的十六进制代码将一个扇区标记为坏扇区。如果您要逻辑测试应该在此特定位置发现坏扇区的软件,这只是一个技巧;它也不会损坏您的SD卡,重新格式化会将其恢复到正常状态。

评论


欢迎来到超级用户!这似乎是一种有趣的方法-您能否解释一下如何特别执行十六进制编辑?谢谢。

– Ben N
17年9月18日在13:53

我认为Linux命令hdparm可以解决这个问题:它将允许您保存一些扇区,以供日后编辑,然后写回到卡上。但是,您需要查找有关vfat和man hdparm的文档。抱歉,我离Windows计算机很近。

– Emile De Favas
17年9月18日在14:01

--make-bad-sector标志看起来很有希望!但是,我无法确定这是否只能在最初运行此命令的linux系统中起作用。我希望命令hdparm --make-bad-sector 20000 / dev / sd#会以某种方式使扇区20000损坏,并在未运行linux的嵌入式硬件设备上被检测为损坏。有什么想法吗?

–加布·克劳斯(Gabe Krause)
17年9月19日在21:37

#15 楼


我想知道是否可以创建Linux badblocks脚本以在单个扇区上重复运行几个小时的破坏性测试。


在单个扇区上-不,因为磨损SD卡中的-levelling代码将在整个位置重新映射逻辑块。

,但是您可以轻松地循环运行badblocks -w,直到出现一些坏块为止。这样的事情应该起作用:

while badblocks -w /dev/xx; do :; done


假设如果未检测到坏块,则坏块返回0,否则返回≠0(手册页中没有说,而我没有t检查了源代码。)

#16 楼

通常,对于SD / uSD卡,它们会实现耗损均衡,因此这可能很难。根据类型(单层单元,多层,TLC,3D-NAND等)的不同,打破它以耗尽扇区池所需的写周期可能在多个TB中。

我确实对此进行了测试配备4GB,64GB和256GB Pro Duo,SSD和Thumbdrive的64GB K --- s ---使用4微米16GB芯片,在FAT区域中出现单个软错误而失败之前,其使用寿命约为3.84TB。 256GB的使用时间要短一些,但是估计在没有直接访问芯片的情况下,它可能在最终因MBR损坏而放弃之前写了大约5TB的存储空间,但尚不清楚控制器是否导致它在USB3模式下稳定工作,但USB2在回读期间出现了更多故障
4GB Duo在复制数据时在读取器中失败,再次无法确定,但等同于使用了6年,并且相机也显示“正在恢复”消息。
偶然在写期间改变电源电压会使它更快地失灵。
我的128GB microSD在使用了大约2年后出现了类似症状,但出现了故障,还消耗了过多的电力和热量,但数据读写仍然很好。

删除了与X射线实验无关的记录。

评论


已经有一些答案可以帮助销毁特定的整流器。您关于销毁随机武器的建议并没有多大好处。

–马太·朱哈斯(MátéJuhász)
19年7月15日在5:21