Re: [請益] 用軟體測試RAM是否有沒有毀損的原理是??
http://www.memtest86.com/tech.html#philo
記憶體的錯誤可能分成 hard memory fail 以及 intermittent memory error,
前者是單純的寫入後會讀出錯誤的內容,後者則是當你寫入資料時,相臨的
memory cell 也「不小心」被同樣的資料蓋過去。
第一種錯誤是很容易檢查的:就一個迴圈一一檢查每個記憶體位址在寫入後是
否能讀回正確的值即可,當然這支程式本身要能夠直接存取 physical memory。
第二種錯誤則需要一些特別方式,memtest86 的網頁中提出了 moving inversion
這個方法:
1. 把所有記憶體的內容寫為某個值 x
2. 從低位址開始,一一確認所有記憶體位址內的值為 x
然後把該位址的內容改為 x 的補數
3. 從高位址開始,一一確認所有記憶體位址內的值為 x 的補數
然後把該位址的內容改為 x
這個方法在大部份的情況下可以找到 intermittent memory error,不過需要注
意的是現代的 CPU 都有 cache 的設計,記憶體本身也有一塊 buffer 以加速存
取速度,這些設計很可能讓上面的測試程序找不到錯誤。以下面的例子來說:
1. 假設目前已執行完第一步,記憶體所有內容皆為 x
2. 從低位址 0x0001 開始檢查內容是否正確,然而因為 CPU 的 cache 設計,
0x0001 ~ 0x000F 的內容會被抓進 cache memory 中,它們的內容都是 x
3. 把 0x0001 寫入新的資料,這筆資料可能因為 intermittent error 而造成
0x0002 的內容損毀,但不幸的是,因為 CPU cache 中仍擁有正確的值,
這個錯誤無法被檢查出來。
為了克服 cache 和 buffer 造成的問題,下面是另一項作法
1. 對於所有的記憶體位址,每隔 20 byte 就填入 x
2. 把其它內容填為 x 的補數
3. 重覆以上兩步驟多次
4. 讀取整段記憶體,檢查 x 是否每隔 20 byte 就出現一次
5. 重覆以上四步驟 20 次,直到所有的記憶體位置都有曾被填為 x
由於這個方法會先把整塊記憶體都填入資料再進行檢查,因此可以確保 cache
或 buffer 內的資料會先寫回到記憶體中,因此後面的檢查步驟可以找出寫入
記憶體時發生的錯誤。
當然,記憶體可能會有 hard error 或 intermittent error 以外的錯誤情況,
但上面的演算法應該可以偵測到大部份的記憶體錯誤。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.29.108
討論串 (同標題文章)
完整討論串 (本文為第 3 之 4 篇):
ask-why 近期熱門文章
PTT職涯區 即時熱門文章
796
1489