掉電一般分兩種。一種是正常掉電,另一種是異常掉電。不管是哪種原因導致的掉電,重新上電后,SSD都需要能從掉電中恢復過來,繼續正常工作。
先說正常掉電。在掉電前,主機會通過命令通知SSD,比如SATA中的IdleImmediately,SSD收到該命令后,主要會做以下事情:
主機等SSD處理完以上事情后,才會真正停止對SSD的供電。正常掉電不會導致數據的丟失,重新上電后,SSD只需把掉電前保存的相關信息(比如映射數據,閃存塊信息等)重新加載,又能接著掉電前的狀態繼續工作。如果SSD世界只存在正常掉電,那么SSD的實現就會簡單很多。
所謂的異常掉電,就是SSD在沒有收到主機的掉電通知時就被斷電,或者收到主機的掉電通知,但還沒有來得及處理上面提到的那些事情,就被斷電了。異常掉電可能會導致數據的丟失,比如緩存在SSD中的數據來不及寫到閃存,掉電導致這部分數據丟失。還有根據閃存的特性,如果掉電發生在寫MLC的Upperpage,會導致其對應的數據遭到破壞,也就是意味著之前寫入閃存的數據也可能由于異常掉電導致丟失。異常掉電恢復的目的一方面是盡可能恢復用戶數據,把損失減到最低;另一方面是讓SSD經歷異常掉電后還能正常工作。
為防止異常掉電導致的數據丟失,一個簡單的設計就是在SSD上加電容,SSD一旦檢測到掉電,就讓電容開始放電,然后把RAM中的數據刷到閃存上面去,從而避免數據丟失,企業級的SSD一般都帶有電容。帶電容的SSD,還是需要設計異常掉電處理模塊,因為電容不能100%保證SSD在掉電前把所有的信息刷入閃存。
還有一個比較前衛的想法,就是把RAM這種Volatile(掉電數據丟失)的東西、用Non-Volatile(掉電數據不丟失)的東西來替代,但要求這種Non-Volatile的東西性能上接近RAM。這樣,整個SSD都是Non-Volatile的了。Intel和Micron合作開發的3DXPoint。可作為一個選擇。3DXPoint兼有閃存掉電數據不丟失和內存快速訪問的特點。
RAM中緩存的用戶數據,主機自認為把它們寫到SSD了(非FUA命令,數據寫到緩存,SSD就返回狀態給主機),但SSD只是把它們緩存在RAM中,并沒有寫到閃存。異常掉電時,如果SSD上沒有使用電容也沒有使用其他黑科技、這部分數據便損失無疑。重上電時,主機是再也讀不到這些數據了。
掉電還會導致RAM中映射表丟失。映射表數據很重要,對一個邏輯地址,如果SSD查找不到對應的物理地址,它就無法從閃存上讀取數據返回給主機。如果映射表中的數據不是最新的,舊的物理地址對應著老的數據,SSD就會錯誤地把老數據返回給主機,這個問題就嚴重了。