您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)Utility中遇到Page Fault錯誤怎么辦,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
很多人在X86的設(shè)備里執(zhí)行VxWorks應用時,遇到過Page Fault錯誤。
這是X86 CPU的14號異常,指的是訪問存儲器的指令發(fā)生了頁異常。
我以往的經(jīng)驗,這樣情況多是地址錯誤引起的,而主要的地址錯誤就是棧溢出(或者叫棧越界)。我們寫個例子模擬一下
在X86的VxWorks里啟個任務(wù)執(zhí)行它
可以看到任務(wù)t1的棧用的是默認值20000,但是代碼中有個0x10001的數(shù)組sss,很明顯棧不夠用的。sss的結(jié)束地址0x172a9db還在任務(wù)棧內(nèi),但sss的起始地址0x171a9db已經(jīng)超出了棧的范圍[0x172aaa0,0x1725c80]。這時候再按一下鍵盤,就會出現(xiàn)剛剛的Page Fault了。
在實際工作中,給我們帶來困擾的一般是這個任務(wù)(例如t1)已經(jīng)退出了,因此出現(xiàn)Page Fault時,用i或checkStack命令已經(jīng)找不到罪魁禍首了。
在《Task之系統(tǒng)任務(wù)》里提到過,可以在任務(wù)的最后位置添加一個taskSuspend(0),把它掛起來。然后就可以用checkStack了
這樣就能抓到現(xiàn)形了。
在VxWorks里有個組件,INCLUDE_PROTECT_TASK_STACK,用于保護棧的溢出。我們加上它來試一試
這時候再執(zhí)行同樣的程序后,VxWorks立刻重啟了,添加了taskSuspend(0)也沒用。在bootrom里,用e命令可以看到重啟的原因
有了這個保護,再有越界就會立刻重啟,不會把危險推后。因為有的時候越界,并不會立刻暴露問題。
既然說到了越界,還有一些比較常見的情況,例如數(shù)組越界、指針越界。看個例子
數(shù)組a2只有一個成員a2[0],但賦值時,寫入了兩個成員a2[0]和a2[1]。
可以看到,寫a2[1]時,實際操作的a3的地址
如果當前文件中,a2[]后面沒有聲明其它變量,那被操作的地址就很隱蔽了。我們再試一下
重啟VxWorks,我們先看看a2后面是誰
哦,有個變量叫runtimeName,人家的值是0x595239
然后執(zhí)行程序,再看看它的值
后面那個變量runtimeName被修改了…
只要這個VxWorks系統(tǒng)沒有關(guān)機,在若干年之后,就可能有個任務(wù)訪問變量runtimeName,那時就會出問題,但那個時候,它只能背鍋了… 執(zhí)行aaa的任務(wù)早跑了
關(guān)于“Utility中遇到Page Fault錯誤怎么辦”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。