Re: [請益] 用軟體測試RAM是否有沒有毀損的原理是??

看板ask-why (知識奧秘)作者 (我要加入劍道社!)時間16年前 (2009/11/13 18:48), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/4 (看更多)
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
文章代碼(AID): #1A_JbyQ5 (ask-why)
文章代碼(AID): #1A_JbyQ5 (ask-why)