我試圖理解爲什麼在寫入SSD之前必須擦除單元,以及它們隨着時間的推移如何減速。爲什麼NAND閃存單元只能在空的時候直接寫入?
回答
Wikipedia article似乎至少暗示了答案。看來,「隧道注入」用於寫入和「隧道釋放」用於擦除。我會把它留給物理學家來解釋究竟是什麼。
我試圖理解你爲什麼寫信給他們
你不必寫入前擦除閃存單元前擦除單元。但是,一次只能寫入整個單元塊。通常這些單元塊的大小至少爲128KB。
因此,假設您正在向您的SSD寫入4KB文件。那麼,你必須一次寫一個128KB的塊。如果該128KB數據塊中已有數據,則驅動器固件必須將128KB數據塊讀入其內存,修改正在寫入的4KB數據塊,然後將整個128KB數據塊寫回閃存。
現代閃存芯片的設計方式是,在一個方向上比另一個方向編程單元更容易。如果一個芯片容納16,777,216字節的256個65536字節的塊只能作爲一個單元被擦除,那麼它將需要約1.28億個「小」電路來編程個別位,而256個「大」電路擦除這些塊。對於允許擦除256字節頁面的芯片,需要65,536個「大」電路。我不確定該芯片的多少部分會被那麼多的頁擦除電路用完,但這會很重要。使用更大的擦除塊可以使芯片更便宜地製造;對於許多應用來說,具有較大擦除塊的較便宜的芯片優於較小芯片的較昂貴的芯片。
下面是如何寫入NAND和擦除作品:
當一個塊被擦除時,所有的比特被設置爲1。要改變的位從1變爲0,位被編程(寫入)。程序不能將位從0更改爲1.
假設您必須存儲11001100.首先需要擦除塊以獲取全1(11111111),然後對特定位進行編程(11001100)。現在,無法將相同的內存位置編程到11111100,因爲編程不能將0更改爲1.
這是NAND找到全1的空閒/空白頁面,然後將特定位從1更改爲0的原因。對於NAND閃存而言,寫入可以將1s更改爲0並且0s更改爲1s的傳統觀點並非如此。 NAND編程操作只能將位從1更改爲0,這意味着我們在開始寫入之前需要全部1個存儲塊。
來源:
https://flashdba.com/2014/06/20/understanding-flash-blocks-pages-and-program-erases/ https://www.micron.com/~/media/documents/products/technical-note/nand-flash/tn2919_nand_101.pdf
- 1. 爲什麼在寫入新的空白窗口時不能保存頁面?
- 2. 什麼時候在BSOD之後寫入內存轉儲?
- 3. 爲什麼不能在excel單元格中寫入「nwe」或「nwo」?
- 4. Python - 它什麼時候寫入文件
- 5. 什麼時候將Fragment.mActivity字段寫入?
- 6. 什麼時候應該使用let {},什麼時候只是簡單的!= null
- 7. 什麼時候單元測試合適?
- 8. 爲什麼使用id的時候我們只能使用NSObject?
- 9. 什麼時候可以Request.Url爲空?
- 10. 什麼時候加入名字,什麼時候不加入?
- 11. 單元測試在什麼時候成爲集成測試?
- 12. gdb&找出什麼時候寫入內存地址
- 13. 什麼時候返回空集合,什麼時候不是?
- 14. 什麼時候Request.Form [「name」]爲空,何時爲空字符串?
- 15. 在寫入JSON的時候保留鍵值爲空的值
- 16. 我們什麼時候需要<auth-constraint>元素爲空?
- 17. 寫入VBA的空單元
- 18. 只有空的時候用文本填充單元格
- 19. 對象的值是什麼,什麼時候可以爲空?
- 20. 什麼時候接收unique_ptr
- 21. phpunit:什麼時候有用預計任何()?,爲什麼存在?
- 22. 從C++在Excel中寫入單元格 - 沒有寫入值,單元格爲空
- 23. 什麼時候去接口,什麼時候去抽象類
- 24. 在STM32上寫入閃存
- 25. 什麼時候注入構造函數,什麼時候是CDI
- 26. 什麼時候Python導入?
- 27. 什麼時候執行我的單元測試,爲什麼使用Moq
- 28. 爲什麼空值不返回在申請的時候!=在LINQ
- 29. 的Java返回「滾動型只能承載一個直接子」的時候,只有一個直接子
- 30. 寫入閃存時的跟蹤地址
寫入整個塊一次是不正確的。 NAND閃存塊分爲多頁。您必須一次寫入整個頁面,而不是整個塊。但是,對整個塊執行擦除操作。 – phandinhlan 2014-08-13 23:12:38