2009年12月3日 星期四

0x000000 記憶體不能為 read 或 written_處理辦法


================================================
0x000000 記憶體不能為 read 或 written_處理辦法
by AYO 阿佑

================================================
前言:
本篇教學,參考來自


台灣奇摩 知識+
http://tw.knowledge.yahoo.com/question/question?qid=1509111006835
回答者: 195805193191275 ( 知識長 ) 
代表知識團: 電腦週邊急救團


會特別寫出來是因為,這篇文章回答的很好,幾乎囊括了所有狀況,
並且給予 發生這種 某某區段 記憶體 

無法 read 或者 written 的網友們解決參考,
因此特別 轉載,留待後人有所查詢,
(謎之聲: 其實是 AYO阿佑 老了,會忘記... 給自己查詢才是真的! 囧~~~)


0x000000 記憶體不能為 read 或 written 怎麼辦呢??
下文中舉出了 六個 方向:
(由於 內文已經寫的相當健全,因此 AYO阿佑 就自己的看法,寫一點感想!)


1.記憶體品質好壞,透過『Windows Memory Diagnostic』
這意思就是 實際上 主機記憶體,是否真的有損傷呢?
可以使用這個小工具來做測試


2.重新註冊所有DLL檔(動態連結函式庫)
這意思是說把註冊檔重新載入 regsvr32 這工具來全部載入重整


3.刪除預讀檔,記憶體錯誤不再發生
因為 Windows 本身有預讀區,在 C:\Windows 裡面,
把預讀暫存區砍掉,就可以解決這邊困擾


4.使用正式版軟體,測試版問題多
下面文中有說明 Alpha、Beta、RC 等版本的差異和建議使用正式發行版本


5.安裝更新檔,解決記憶體錯誤
這就是 Software Update 的基本功夫囉!!
當然這不是單指 Windows Update 而言,
這邊是指 軟體記得要更新,不是只有 作業系統而言!


6.經常掃毒,防止病毒藏身記憶體
病毒防禦的工作,這也屬基本功,所以也不需要多做贅述


================================================
參考來自 台灣奇摩 知識+
http://tw.knowledge.yahoo.com/question/question?qid=1509111006835
回答者: 195805193191275 ( 知識長 ) 
代表知識團: 電腦週邊急救團


解開「0x000000該記憶體不能為read或written」的錯誤訊息!

Windows 對記憶體的使用是採動態分配,

當程式需要在記憶體裡儲存資料時,
必須先透過 Windows 函式來申請需要使用的記憶體位址,
就像辦活動必須先租借場地一樣,假如場地不加以管制,

就會大家搶著用,而真正要用的人反而找不到場地。

當申請成功時,系統便會告訴應用程式:
「你可以使用0x某某某區段的記憶體位址」。

但是有時程式想要租借的場地(某段記憶體位址)因某些因素無法出租
(即記憶體分配失敗),此時場地管理員(Windows函式)會回覆說
「不能申請」,並回傳一個「0」數值給應用程式。
理論上來說,當程式接收到「0」值得回應後,
就該知道申請失敗,並重新提出申請、或做其他補救措施。


不過有些設計不夠周全的程式,或受到記憶體故障的干擾結果,
在提出申請後就不再核對系統的答覆;
若系統傳回「申請失敗」的「0」數值,但是應用程式少了一道核對機制,
會誤以為「0」代表著系統分配「0x000000」

這段位址是系統儲存中斷向量表用的,
不允許寫入其他資料,Windows 系統為了避免錯誤情形繼續擴大,
只好把提出申請的應用程式強制關閉。



□ 記憶體品質好壞,透過『Windows Memory Diagnostic』
當你的電腦無法安裝作業系統,

或作業時常出現藍底白字0x000000錯誤訊息,
有可能是記憶體穩定性出現問題。
這裡我們推薦微軟官方『Windows Memory Diagnostic』測試軟體,
它可用來測試記憶體與Windows相容性,所測得記憶體數據值得參考。


解決方法:
微軟官網:
http://oca.microsoft.com/en/windiag.asp
下載位址:
http://oca.microsoft.com/en/mtinst.exe

□ 重新註冊所有DLL檔(動態連結函式庫)
DLL檔是電腦中非常重要的檔案,

由於視窗作業系統中的應用程式眾多且龐大,
如果把所有程式碼包成一個EXE執行檔,不僅檔案會變的非常大,

執行時也會很耗費記憶體。
因此把常用、有重複性的程式碼獨立出來,包成一個個DLL檔,
當主程式需要時再另外載入,

如此可以讓不同程式可以互相共用相同的函式庫,
節省軟體開發時間,並大幅節省記憶體的濫用。

不過若碰到DLL檔登記時出了問題,
可能就會讓系統發生記憶體位址分配錯誤的情形,

此時可重新註冊電腦中所有DLL檔,
幫它們讓XP作業系統便於掌控。


解決方法:
於「命令提示字元」視窗,輸入已下指令後按下【Enter】:
For %1(%windir%\system32\*.dll) do regsvr32.exe /s %1


□ 刪除預讀檔,記憶體錯誤不再發生
為了讓系統運作速度更快,XP設計了一套「預讀」(Prefetch)技術。
在前幾次啟動應用程式時,會將啟動情形經分析後,
製作一份最佳化的映象檔到「C:\Windows\Prefetch\」資料夾中,
讓下次啟動同一應用程式時,就會從裡面先讀取必要資料,
以提升軟體的載入速度。

不過有時候會因為軟體的 Bug 或是在預讀時發生錯誤,
導致在載入預讀檔時,向系統要求了不正確的記憶體位址,
而被 XP 內建的保護系統檔下,因此也會出現記憶體位址錯誤的警告訊息。


解決方法:
開啟檔案總管進入「C:\Windows\Prefetch\」資料夾中,

將裡頭所有檔案刪除即可。

□ 使用正式版軟體,測試版問題多
通常在軟體正式發行前或遊戲正式上市前,

都會釋出 Alpha & Beta & RC 版本

Alpha 版
(通常是Bug最多的版本,有的功能尚未完備或伺服器免費封測帳號)


Beta版
(接近正式釋出的版本,但還有未知的Bug)


RC版
(準備上市前的最後版本)。


不過即使軟體正式上市後,都還可能有突然發現的 Bug,
何況是還是開發中的版本呢? 所以如果你在使用某過特定軟體時,
一直出現記憶體錯誤,不妨看看該軟體是否有「Beta」等字樣,
如果有的話,請換成正式版本的軟體使用,也許就能解決擾人的問題。


□ 安裝更新檔,解決記憶體錯誤
有的軟體在正式發行後,才發現有重大缺失,可能會與某些軟體硬體衝突,
因此常回去軟體官方網站,看看是否有更新版本的升級檔可以補強,
有時候也能解決軟體造成的記憶體錯誤問題。


□ 經常掃毒,防止病毒藏身記憶體
有的電腦病毒會將自己常駐在記憶體中,佔住可以使用的記憶體資源,
並強取電腦的主控權,因此造成電腦的使用異常,

導致板來可以使用的記憶體卻無法使用,
就容易出現記憶體位址錯誤訊息了。


解決方法:
安裝防毒軟體或是掃除木馬的軟體,並經常更新病毒碼,
定期掃毒確保電腦中沒有病毒或木馬存在,不要讓病毒干擾電腦的運作。
記憶體不能為”read”



================================================
篇後語:
從 台灣奇摩 知識+ 等於直接轉載 這位 知識長 的回答,
真的是因為 回答的很完整,幾乎面面俱到囉!!


所以發表此文,別讓好文章埋沒了!
同時也把此文章拿來當總綱,本文所說的六個方針當中


1.記憶體品質好壞,透過『Windows Memory Diagnostic』
2.重新註冊所有DLL檔(動態連結函式庫)
3.刪除預讀檔,記憶體錯誤不再發生


都可以做更近一步的解說,讓讀者、網友們更清楚一些囉!
所以就把這篇文章拿來當 總綱!


================================================
歡迎轉載,但請務必說明原出處

歡迎參觀 AYO 阿佑 個人的電腦技術園地
http://tw.myblog.yahoo.com/kain-0913/



1 則留言:

  1. 補充一下 :
    原來 內文當中 重新註冊所有DLL檔(動態連結函式庫)
    的寫法有誤 :
    錯誤 : For %1 (%windir%\system32\*.dll) do regsvr32.exe /s %1
    正確 : for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
    以上補充  AYO 阿佑
    [版主回覆12/07/2009 14:25:56]已補充完成
    以上  AYO 阿佑

    回覆刪除