版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系我們

[科普中國]-一般保護錯誤

科學百科
原創(chuàng)
科學百科為用戶提供權(quán)威科普內(nèi)容,打造知識科普陣地
收藏

一般保護錯誤是在PC機用戶程序企圖訪問不可訪問地址時出現(xiàn)的錯誤。

簡介一般保護錯誤(英語:General protection fault,縮寫:GPF)是在英特爾x86和AMDx86-64架構(gòu)和其它架構(gòu)中的一種錯誤(或者一種中斷),指正在運行的程序(內(nèi)核或用戶態(tài)程序)違反處理器架構(gòu)中的保護措施的情況。此機制最初在1986年英特爾80386處理器的程序員參考手冊第9.8.13節(jié)中描述。一般保護錯誤通過中斷(向量值13)實現(xiàn)。

若處理器偵測到保護違例,會停止當前代碼的執(zhí)行,并發(fā)出GPF中斷。大多數(shù)情形下,操作系統(tǒng)會簡單地關(guān)閉觸發(fā)GPF的進程,告知用戶,并繼續(xù)執(zhí)行其它程序。但如果操作系統(tǒng)沒能捕獲這一錯誤(如在操作系統(tǒng)從GPF中斷處理例程中返回前發(fā)生了另一次違例),處理器會發(fā)出雙重錯誤(中斷向量值8,一種常見的藍屏情形)。如果再次發(fā)生了違例,則處理器會關(guān)閉(參見三重錯誤),其后只會響應(yīng)復(fù)位(即按下機器的復(fù)位按鈕)、啟動(重新啟動系統(tǒng))或不可屏蔽中斷(除非其之前在處理此類中斷時出錯)。1

內(nèi)容操作系統(tǒng)一般將內(nèi)存劃分為不同的區(qū)域,有的區(qū)域只供操作系統(tǒng)使用,而有的系統(tǒng)是供應(yīng)用程序使用的。當應(yīng)用程序企圖在分配給它的內(nèi)存區(qū)域進行訪問操作時,操作系統(tǒng)將中止這個程序的運行,用戶得到的是一行錯誤碼,告訴用戶程序出現(xiàn)了一般保護錯,用戶只能再次啟動程序,希望這次程序在執(zhí)行時會一切正常,隨此以外沒有什么辦法可想。如果允許應(yīng)用程序在分配給它的區(qū)域以外進行讀寫操作,就會使其它程序(或操作系統(tǒng))的數(shù)據(jù)被破壞,如果破壞了操作系統(tǒng)的數(shù)據(jù),系統(tǒng)就會崩潰,這樣損失就太大了,倒不如關(guān)閉一個程序而保護整個系統(tǒng)的安全。

在64位模式,CR0和CR4的高32位被保留并且必須被寫0。對高32位的任何一位進行寫的結(jié)果是引起一般性保護異常,#GP(0)。

一般保護錯誤出現(xiàn)時可采取的辦法:1、拔下多余的內(nèi)存只留下兼容性最強和質(zhì)量最好的一根內(nèi)存。2、拔下并仔細清理擦拭內(nèi)存的金手指。3、不斷重啟電腦直到可以正常使用。1

操作系統(tǒng)行為在一些版本的Microsoft Windows中,一般保護錯誤確實會被報告為“一般保護錯誤”。
但在大部分版本中,Windows會給出如下錯誤:

Unrecoverable Application Error.(Windows 3.0)

[程序] has caused a General Protection Fault in module [模塊] at [內(nèi)存地址].(Windows 3.1和3.1x)

該程序執(zhí)行了非法操作,即將關(guān)閉。(Windows 9x&Windows NT 4.0)

[程序]產(chǎn)生了錯誤,會被Windows關(guān)閉。(Windows 2000)

[程序] has caused an error in [模塊]. [程序] will now close.(Windows Me)

[程序/描述]遇到問題需要關(guān)閉。我們對此引起的不便表示抱歉。(Windows XP)

[程序/描述]已停止工作。(Windows Vista和Windows 7)

在類Unix的系統(tǒng)中,此錯誤會被分別報告(比如Linux下的段錯誤等)1。

本詞條內(nèi)容貢獻者為:

李航 - 副教授 - 西南大學