從事嵌入式相關的開發人員應該常會接觸到 NAND flash 相關的儲存裝置.
關於 NAND flash 有下列幾點特性 [1]:
- 用不同程度的電壓來對 bit 進行編碼
- 所有 bit 初始值為 1
- 使用 PROGRAM 以及 ERASE 動作
- PROGRAM 的動作為 – 將 bit 值設成 0. 最小執行單位為 Page
- ERASE 的動作為 – 將 bit 值設成 1. 最小執行單位為 Block (一個 Block 有多個 Page)
source: https://en.wikipedia.org/wiki/Flash_memory
而近來常見的 eMMC (半雙工), eMCP (半雙工) 以及 UFS (全雙工) 則是 NAND flash 上加個 controller 來做 ECC, 故障區塊管理以及平均寫入.避免由 filesystem (ex: UBIFS, yaffs2 , …) 來處理而產生的整理效能議題. 這些帶有 controller 的 NAND flash 通常統稱為 managed NAND flash 如下圖所示:
source: https://www.micron.com
NAND flash 顆粒主要分成 SLC, MLC 跟 TLC. 差別為在一個 NAND Flash 單元 (cell) 中, 分別能存1, 2 ,3 個 bits.
看到這裡會覺得奇怪, 不是能放越多 bits 越好嗎, 為什麼放越多 bits 的 TLC 反而便宜 ?
那就要從 NAND flash 的運作原理開始講了.NAND flash 主要使用 floating gate 來儲存電子. 而 floating gate 外面有一層絕緣體 (Insulator) 來保護. 所以每次進行 PROGRAM or ERASE 時, 都需要給予特定電壓, 形成電場讓電子強行通過絕緣體以進入或離開 floating gate. 但每次經過絕緣體, 都會造成對其損傷, 累積到一定程度後就會失去絕緣能力. 讓 floating gate 無法保存電子.
Overview
source: [6]
PROGRAM operation
source: [6]
以上述邏輯來看, 越常存取 floating gate, 會導致壽命越短. 所以如果一個 cell 存越多資料 (bits), 會因為常常存取的關係而減少壽命.
下圖為 flash type 的比較表:
Flash type | SLC, Single Level Cell (1 bit) | MLC, Multilevel Cell (2 bits) | TLC, Triple Level Cell (3 bits) |
Bits per cell | 1 | 2 | 3 |
Program/Erase cycles | Generally 100000 write erase cycles | Anywhere from 3000 to 15000 write erase cycles |
Anywhere from 1000 to 5000 write/erase cycles |
Erase time | Erase time: 1.5-2 ms | Erase time: 2.5-3.5ms | Erase time: 4-5ms |
Operation scenario | Industrial | Commercial | Commercial |
但這幾年, 有一種稱為 “pSLC" (pseudo SLC) 的 flash type 逐漸興起. pSLC 以 MLC 的 flash type 為基底, 但在每個 cell 中只存 1 個 bit 而不是 2 個 bits . 由於在同一個 cell 中跟 SLC 一樣只儲存一個 bit, 但又不是真的 SLC, 所以稱之 “pSLC" (pseudo SLC).
依上述原理, 若將 MLC 切換成 pSLC, 儲存空間會隨之折半. ex: 8G MLC = 4G pSLC. 因為減少對 floating gate 的存取, 所以 pSLC 比起 MLC 來說可大幅增加讀寫壽命.
“pSLC" (pseudo SLC) 的目的是以 MLC 的價格取得 “接近" SLC 的讀寫壽命以及存取效能. 代價是單位空間折半. 而pSLC 由 NAND flash controller 所控制, 所以不是每一個廠商都支援. 使用前需先確定儲存裝置為 managed NAND flash 且上面的 controller 有支援此模式.
下圖為加入 pSLC flash type 的比較表:
Flash type | SLC, Single Level Cell (1 bit) | pSLC, pseudo Single Level Cell (1 bit) | MLC, Multilevel Cell (2 bits) |
Bits per cell | 1 | 1 | 2 |
Program/Erase cycles | Generally 100000 write erase cycles | Anywhere from 30000 to 50000 write erase cycles |
Anywhere from 3000 to 15000 write erase cycles |
Erase time | Erase time: 1.5-2 ms | N/A | Erase time: 2.5-3.5ms |
Operation scenario | Industrial | Industrial | Commercial |
note: pSLC 模式需要廠商支援
pSLC 使用時機:
pSLC 通常和 MLC 混用. 建議將下列重要檔案放進 pSLC 區塊中.
- Boot code
- Linux kernel
- Data logger
- key, certificate
心得:
善用 MLC & pSLC 的設計的確可以在價錢以及應用上取得平衡, 但需要注意每間廠商實作的方法略有差異. 有些支援動態切換, 有些不行. 再加上不同廠商對於 pSLC 模式有不同的命名以及使用方式. 所以在選用 managed NAND flash 儲存裝置上需要特別去瞭解以及注意.
ref:
[1]: https://www.micron.com/resource-details/fea5cfd9-ee93-47f4-b2af-cd494d3291c3
[2]: https://www.slideshare.net/ruchiusha/07flash-memory-technology/41
[3]: https://en.wikipedia.org/wiki/Flash_memory
[4]: https://events.linuxfoundation.org/sites/events/files/slides/brezillon-mlc-nand_0.pdf
[6]: http://events.linuxfoundation.org/sites/events/files/slides/Flash-technology-ELCE16_0.pdf
[7]: http://shawnhyde.com/post/2013/09/11/TLC-vs-MLC-vs-SLC-Performance-benchmarks-and-reliability