2008年3月31日 星期一

Flash block device driver -- "Compaction Thread"

這一篇msdn的blog 有講到有關nand flash的wear leveling..在需要修改某個sector的資料時,並不會將整個block erase掉,filesystem會將原來的那個sector設為invalid sector,然後將修改後的資料寫到未使用的sector上。這樣,漸漸的,flash上invaliid sector就會越來越多,導致flash 的空漸漸不夠。filesystem (filesys.exe)中有一個thread (Compaction Thread)負責管理這些sector,他會在需要的時候檢查所有的sector,
如果有一個block,所有的sector都是invalide,他就把那個block erase,然後標示為"未使用"。
同樣的,如果有一個block,大部分的sector都是invalid,他就會把block中有用的sector copy到其他sector,然後把這個block erase掉,重新標示為"未使用"。平時,Compaction Thread只在系統idle時起來工作。所以,當AP對flash修改大量資料,同時又很忙碌的工作,Flash的sector馬上就不夠了。這時候,filesystem就會叫起Compact Thread,並強制進入 Critical Compaction 模式。不等cpu idle才執行 (這樣就會造成系統緩慢的現象.)。同理,當Flash 的空間都已經用完時,隨便一個IO都會導致系統緩慢 - Compaction Thread 一直被invoke..
摘自 Checko`s Blog
NAND vs. NOR