你可以看图(或者想象一下),Nand的封装(Package)里头,是一层套一层的结构:最底下是die,die里头有plane,plane又分成好多block,block再拆成page。图上那些小绿块儿就是page,多个page凑成一个灰块儿叫block,多个block组成一个粉块儿叫plane,多个plane拼成一个黄块儿叫die,最后几个die一起封装成蓝块儿的package。
如果拆开一个SSD或者存储卡,你就能看到里头有好多这种Package。每个Package里可能藏着1个、2个甚至4个die。这个die挺重要,它相当于一个能独立干活的小单元——可以自己接命令、自己汇报状态,有时候也被叫做LUN(逻辑单元)。它就是从晶圆上切下来的一片完整裸片。
每个die里一般有1个或2个plane,这两个plane在某些时候可以一起干活,搞点并行操作。
plane下面就是block了,这个需要划重点:block是擦除的最小单位,别记混了。
block再往下拆,就是page。page是写入的最小单位,同时也是读取的最小单位。咱们上一期说过,page对应着好多条wordline,每条wordline又连着一串浮栅晶体管。所以,每次读写数据,最小就是动一个page,大小一般在8到16KB之间。而擦除呢,一擦就得擦一整个block,通常是4到8MB。
这里就引出一个关键逻辑:一个block如果想重新写入数据,必须先擦干净。也就是说,这个block里所有page都得变成无效才行。
刚出厂的闪存设备,所有page都是空的。你最想干的肯定就是往里写点东西,这在技术上叫Program操作,是按page写的。写完了也能读出来,Read操作也是按page读。

问题来了:如果你想改一下刚写进去的数据,怎么办?Nand这玩意儿没有“修改”或“更新”这种操作,也不能撤销或回退。想改?只能擦除。一擦除,就得把整个block里的page全清掉。如果这个block里还有其他page存着有效数据,那要么先把它们挪到别处去,要么就先忍着不改。
其实第二种方案——先忍着不改——反而更聪明。因为Nand每个block的擦写次数是有限的,术语叫P/E周期(Program/Erase Cycle)。要是每次想改一页数据都得把整个block擦一遍,那你的闪存用不了多久就报废了。
所以聪明的办法是:把原来那页(旧数据)打个标,记成“无效”,然后把新数据写到另一个空的page里。这样一来,老数据虽然还在,但已经没人认了。同时,系统需要一种机制来跟踪:哪些page是有效的,哪些是无效的;每次访问数据时,也得自动跳到新page那里去。等到无效的page攒够了,再挑个时候统一回收清理。

这套机制,就叫闪存转换层(Flash Translation Layer,简称FTL)。它不光管这些,还有很多别的活儿。咱们后面再慢慢聊——可以说,不同牌子闪存的差距,很大程度上就藏在这FTL里头。
Alipay
Wechat