最近有点苦恼,手机相册突然不能用了。
开始时怀疑是小米手机的软件问题,但是发现存在microSD卡(后文用uSD卡代替)上的电影也出现问题后,我终于找到问题的根源:uSD卡。这让我有些吃惊,毕竟我买的Samsung EVO Plus 128GB uSD卡价格并不便宜,出于我对uSD卡构成和渠道的深刻了解,我之前一直向人推荐购买Samsung或者SanDisk的卡片。而我平时也就是看看电影,偶尔照照像,并不是自拍达人或者重度“视频录制爱好者”,按理来说并不需要Samsung Pro系列endurance很高的uSD。也许这次是我的运气不好,碰到个质量有问题的卡,那怎么办呢?尽管Samsung EVO号称十年的保固期,但我的私人数据该如何处理呢?我决定Debug一下,将uSD插到我的树莓派上,开始了一个下午的“奇幻之旅”。一番折腾后,发现几乎所有的块读取指令都可以成功完成,但写操作几乎都是失败的。这表明uSD卡的FTL(Flash Translation Layer)层出现了问题,坏块可能已经导致新建映射关系完全失败了。更多关于FTL的知识可以看我的知乎专栏文章。
好在映射表并没有损坏,所以读操作都可以完成,已有数据还是安全的。在备份了所有的照片和电影之后,我长舒了一口气,看着这个uSD我又犯了难。要质保的话,我需要退还旧uSD卡,而因为不能写,导致不能删除所有数据,鬼知道Samsung的售后会如何对待我自拍的”美图“和电影!uSD有价而数据无价,为了安全起见还是用我的终极办法吧
羊角锤,数据安全专家的必备工具!
这件事让我想起很多朋友在读了我的NAND Flash系列和SSD硬盘系列文章后,问我uSD卡里面有没有FTL层。网上也有很多误解认为uSD卡是没有FTL层的。为了大家对uSD卡有个清楚的认识,今天我们就来了解一下uSD的构成以及回应一下误解。
什么是uSD卡?
关于uSD的由来我就不过多介绍了,网上资料很多。相信大家都希望自己的手机可以支持uSD卡,毕竟花500多块钱,就可以购买到256G的额外容量,完全可以傲视iPhone的旗舰机的容量。虽说uSD的速度不及内置的NFS Flash,但作为存储照片、影像和资料来说是绰绰有余了。uSD很小:
它如此之小,以至于很多人认为它其中就是放的NAND Flash而别无它物,但事实是这样吗?
拆解uSD卡
uSD卡结构十分紧凑,拆开它并不像拆开SD那么轻松,而且很可能会损坏它。幸亏有专业数据恢复公司这么做过(参考资料1),我们来一起一睹庐山真面目:
原始uSD
上锉刀
初露端倪
庐山真面目
这里用锉刀,也有些人用酸液腐蚀掉外面的套,会更加清楚些。看到这么复杂的结构,你这时也许会十分惊讶,但如果我们看看它真正的组成框图,你也许会更吃惊!
uSD的构成
将uSD描述为一个小SSD一点也不夸张,一个简化的框图如下:
它包括自己的控制器,内存(有可能是控制器自带),和NAND Flash。猜猜这个控制器是什么?
是ARM!尤其是在大多数Class 10的uSD上,ARM和DMA协调工作,才能保证传输速度。具体举个例子,Samsung的uSD卡大多采用ARM7TDMI(详情见参考资料2),它是基于ARMv4T架构的,T代表Thumb指令集,D是说支持JTAG调试(Debugging),M意指快速乘法器,I则对应一个嵌入式ICEBreaker模块:
小小的uSD卡也是有程序的,也就是有固件的,Samsung的固件就有128KB大小。
这个ARM7TDMI据我所知,运行在100MHz的频率上。它并不十分的昂贵,根据不同的出货量,它的Cost也就在$0.10到$0.30之间。
结论
很多人都没想到,uSD卡虽小,五脏俱全。ARM控制器加上固件,它包括了冯诺依曼所有的元素,它实现了FTL层,从而实现了负载均衡。尽管SD卡的标准并没有明确要求实现负载均衡,但没有负载均衡的FTL层,某些特殊设计的写操作,在几分钟之内就可以写坏uSD卡,这是不可以接受的。所以,几乎所有uSD卡都实现了FTL层。
有趣的是现在很多SD卡,为了方便起见,直接内嵌了个uSD卡,节省了成本:
还有很多古怪的玩法,譬如SSD实际上是一堆uSD卡拼成,十分有趣。
另外评论区有朋友问TF卡和uSD的区别的问题。现在可以说他们是一回事,叫做不同的名字是有历史原因的,简单来说TF(TransFlash)发明比较早,后来被SD卡组织吸收合并,就几乎变成了一回事,有些细微的区别,详见参考资料3,但一般用户无感。