我需要测试某些嵌入式硬件的一些读/写代码的弹性。我如何牺牲一些SD卡并打破几个已知的扇区进行受控研究?
我唯一能想到的就是覆盖单个部门几百万次。我想知道是否可以创建Linux badblocks脚本来在单个扇区上重复运行几个小时的破坏性测试。
我需要测试某些嵌入式硬件的一些读/写代码的弹性。我如何牺牲一些SD卡并打破几个已知的扇区进行受控研究?
我唯一能想到的就是覆盖单个部门几百万次。我想知道是否可以创建Linux badblocks脚本来在单个扇区上重复运行几个小时的破坏性测试。
Answers:
一种可能有用的替代方法。
如果您的代码在Linux下运行,那么也许可以使用“故障”逻辑设备对其进行测试。dmsetup
可以创建返回I / O错误的设备。只需使用error
和/或flakey
目标构建设备即可。来自man 8 dmsetup
:
error
使进入该区域的所有I / O错误。对于测试或创建带有孔的设备很有用。
flakey
创建与linear
目标的相似映射,但是会周期性地表现出不可靠的行为。在测试时用于模拟故障设备很有用。
据我所知,I / O错误将立即报告,因此这与实际的SD卡行为(可能会出现延迟,停顿等)不同。尽管如此,我认为这种方法在某些情况下可能很有用,至少可以快速执行初步测试左右。
这个家伙入侵了用于标记坏块的SD卡中的微控制器:https://www.bunniestudios.com/blog/?p = 3554
您可以执行相同的操作,并随意将块标记为有故障。
今天在混沌计算机大会(30C3)上,xobs和我披露了一个发现,即某些SD卡包含允许在存储卡本身上执行任意代码的漏洞。不利的一面是,存储卡上的代码执行会产生一类MITM(中间人)攻击,其中存储卡的行为似乎是一种方式,但实际上它有其他作用。从好的方面来说,它还使硬件发烧友有可能获得非常便宜且普遍存在的微控制器资源。
。
这些算法太复杂且太特定于设备,无法在应用程序或OS级别上运行,因此事实证明,每个闪存磁盘都随附有功能强大的微控制器,以运行一组定制的磁盘抽象算法。甚至很小的microSD卡也不包含一个芯片,而是至少包含两个芯片-一个控制器和至少一个闪存芯片(高密度卡将堆叠多个闪存芯片)。
。
嵌入式微控制器通常是经过大量修改的8051或ARM CPU。在现代实现中,微控制器将达到100 MHz的性能水平,并且还具有多个独立的硬件加速器。令人惊讶的是,将这些控制器添加到设备的成本可能约为0.15-0.30美元,特别是对于可以在同一业务部门内同时制造闪存和控制器的公司。添加这些微控制器可能比全面测试和表征每个闪存芯片便宜,这解释了为什么尽管包含微控制器,但托管闪存设备的比特成本却比原始闪存芯片便宜。
。
问题的关键在于,固件加载和更新机制实际上是强制性的,尤其是对于第三方控制器而言。最终用户很少会经历此过程,因为这一切都是在工厂进行的,但这并不会使该机制变得不那么真实。在我对中国电子市场的探索中,我看到商店的店主在卡上刻录固件,以“扩展”卡的容量,换句话说,他们加载的固件报告的卡容量比卡的容量大得多。实际可用存储空间。在销售点这是可能的事实意味着最有可能不确保更新机制。
在30C3的演讲中,我们报告了探索特定微控制器品牌(即Appotech及其AX211和AX215产品)的发现。我们发现通过制造商保留的命令(即CMD63后跟“ A”,“ P”,“ P”,“ O”)传输的简单“敲门”序列使控制器进入固件加载模式。此时,卡将接受下一个512字节并将其作为代码运行。
这通常不起作用,因为最新的SD卡(或eMMC)使用静态和动态损耗均衡,这意味着智能控制器会解释您的写入指令并将其映射到使用最少的闪存扇区之一。
您唯一可以做的就是尝试与您的供应商联系并索取他们的数据表。可能有一些(特定于供应商的)方法来检索其损耗均衡算法的状态。这可能使您可以查询基础闪存的状态/使用情况。否则,您可能会很不幸,并且这可能不存在。
如果您的目标确实是销毁闪存,那么您所能做的就是运行大量的读写周期,并不断检查所读取的数据是否仍然一致。例如,创建两个大文件,存储它们的校验和并对其进行读写,以验证其校验和。闪光灯越大,此过程将花费的时间越长。
您可以通过提高工作温度来增加晶体管的损耗。在加热的芯片(70-120°C)上使用写擦除循环;它会磨损得更快。
前言:此选项需要额外的编程和硬件修改,但它允许对主机最可能透明的受控读取。
SD卡具有多个I / O选项,但可以通过SPI进行控制。如果要取出SD卡并进行修改,以便可以将引脚连接到微控制器(例如Arduino),则可以让Arduino模仿SD卡并对读取SD卡的设备透明。在微控制器上的代码可能会在需要时有意返回错误数据。此外,您可以将SD卡放在微控制器上,这样读取结果就可以通过微控制器传递到SD卡,以进行千兆字节的测试。
我会去ebay / aliexpress买我在中国能找到的最便宜的SD卡,一张“实在太好了”。它们通常带有错误的扇区,或者在软件中设置得比实际大小大得多。无论哪种方式,您都应该以有故障的SD卡结束进行测试。
很久以前,有一次,我被薪水从SD卡中找回了一位心烦意乱的母亲的毕业照片和录像。经过仔细检查,该卡在某种程度上受到了物理损坏,外壳上有明显的裂缝,并且有几个坏道,最显着的是几个早期的关键扇区,这甚至使当时最可靠的恢复程序也完全无法读取该卡。 。此外,取证数据工具的成本也很高。
我最终获得了相同品牌/大小的SD卡,并编写了自己的自定义原始数据转储和还原实用程序,以将数据从坏卡复制到好卡上。公用事业每次遇到坏扇区时,都会在写入该扇区的所有零之前重试多次,并且不要放弃并停止,而忽略故障并转到下一个扇区。由于我还注意到某些扇区的读取成功率仍约为40%,因此进行了重试尝试。数据存储在新的SD卡上之后,以前曾出现故障的恢复工具可以完美地工作,并且数据丢失/损坏最小。总体而言,已恢复了所有文件的约98%。还恢复了以前删除的许多项目,因为实际上没有任何内容被删除-只是被标记为此类内容并慢慢被覆盖。最初是一个稍微无聊的数据恢复工作,后来成为我更难忘和有趣的个人软件开发项目之一。如果您想知道的话,母亲很高兴。
无论如何,这个故事表明,有可能物理损坏SD卡,使得仍然可以访问数据,但其中的扇区仅能正常工作,而任何尝试从中读取数据的操作都很难做到。SD卡塑料往往非常脆弱,因此弯曲或切成一些便宜的塑料也许可以解决问题。你的旅费可能会改变。
您还可以在您所在地区的一些数据恢复场所四处询问。由于它们专门用于从各种发生故障或发生故障的设备中恢复数据,因此它们应该具有一些有用的输入/提示,甚至可能手头上有一些预烧制的SD卡(例如,用于培训),您可以从中获取这些SD卡。
dd
使其表现与此类似。我不确定。
这个答案是对@Ruslan的评论的扩展
可能的选择:
不确定这是否适合您的目的,但实际上足以损坏您的卡,这可能要快得多。
一些较旧的低容量SD卡(16MB容量)使用TSOP / TSSOP样式的封装的闪存芯片。可以进行SMT返修的车间(如果您从事嵌入式工作,您可能拥有内部技能,否则请检查进行板级电话/笔记本电脑维修的小公司)可以分离并重新安装该芯片,以便可以对其进行读写设备编程器原始数据(包括ECC代码)。
不过,请注意您将主要进行测试:
在最坏的情况下
如果您只是想出于某种原因从SD卡检查其行为是否不稳定,最好将电气噪声引入接口线中(例如,通过在它们之间放置FET总线开关,并在随机时间进行瞬时开关)使其成为无意义的信号源(尽管电平正确)。
FAT32主引导记录区域可能最容易受到滥用,因为从逻辑上讲,它始终需要位于同一位置。(也许这是通过坏扇区的软重映射来处理的,但是我对此表示怀疑,因为它是在所有硬件上实现的。)因此,您可以sfdisk
循环运行,看看是否可以这样破坏它。
但是,我要求您尽一切努力提高硬件可靠性,而不是尝试处理软件中的不良硬件。问题是SD卡会以各种奇怪的方式失败。它们变得不可读,变得无法写入,为您提供不良数据,它们在操作期间超时等等。试图预测卡可能发生故障的所有方式非常困难。
这是我最喜欢的故障之一,“大数据模式”:
SD卡是商品消费产品,承受着巨大的成本压力。零件变化迅速,数据表很难获得。假冒产品并非闻所未闻。对于便宜的存储来说,它们很难被击败,但是尽管SSD将可靠性放在首位,但SD卡的优先级是速度,容量和成本(可能不是按顺序排列)。
您的第一道防线是使用可焊接的eMMC零件和知名制造商的真实数据表,而不是使用可移动SD卡。是的,它们每GB的成本更高,但是该部件将在生产中使用更长的时间,至少您知道自己得到了什么。向下焊接部件还可以避免使用可移动卡产生的一系列潜在问题(卡在写入过程中卡住,电接触不良等)。
如果您的产品需要可移动存储,或者更改任何内容为时已晚,请考虑将多余的钱用于“工业”等级卡,或将其视为一次性物品。我们的工作(在Linux下)是fsck
引导卡,如果报告了任何错误,请重新格式化该卡,因为在这种情况下,重新格式化是可以接受的。然后我们fsck
再次。如果重新格式化后仍然报告错误,我们将对其进行RMA并用使用eMMC的较新版本替换硬件。
祝好运!
也许这不是您想要的方向,但我发现在收音机或笔记本电脑读取SD卡的同时将其取出,可以保证SD卡损坏的次数约为1/5或1/10倍。在读取和大概写入期间断电似乎卡效果不佳。阅读以下罗伯特·卡尔霍恩(Robert Calhoun)的评论后,它使我相信它可能会损坏FAT。虽然我不知道为什么只是读书会导致崩溃-应该不写任何东西吗?
如果您的sd卡是FAT32格式的,则可以十六进制编辑这两个脂肪,并使用正确的十六进制代码将一个扇区标记为坏扇区。如果您要逻辑测试应该在此特定位置找到坏扇区的软件,这只是一个技巧;它也不会损害您的SD卡,重新格式化会将其恢复到正常状态。
--make-bad-sector
标志看起来很有希望!但是,我不能确定这是否只能在最初运行此命令的linux系统中起作用。我希望该命令hdparm --make-bad-sector 20000 /dev/sd#
将以某种方式使扇区20000损坏,并在未运行linux的嵌入式硬件设备上被检测为损坏。有什么想法吗?
通常,对于SD / uSD卡,它们会实现耗损均衡,因此这可能很难。根据类型(单层单元,多层,TLC,3D-NAND等)的不同,将其破坏足以耗尽扇区池所需的写周期可能在多个TB中。
我确实使用4GB,64GB和256GB Pro Duo,SSD和Thumbdrive进行了测试,使用4微米16GB芯片的64GB K --- s ---持续约3.84TB,然后在FAT区域中出现单个软错误而失败。256GB的使用时间少一点,但是估计在没有直接访问芯片的情况下,它可能在最终放弃MBR损坏之前写了大约5TB的存储空间,但尚不清楚控制器是否使它在USB3模式下稳定工作,但USB2在回读期间有更多故障而且也很热 4GB Duo在复制数据时无法在读取器中读取数据,再次无法确定,但相当于使用了6年,并且相机还显示“正在恢复”消息。写入期间偶然改变电源电压会使它更快地失灵。经过约2年的使用,我的128GB microSD出现了类似的症状,
删除了与X射线实验无关的注释。