幾個月來,我一直在研究「自制」操作系統。 目前,它啓動並進入32位保護模式。 我已經加載了中斷表,但還沒有設置分頁(還)。操作系統開發:如何避免例外程序後的無限循環
現在在編寫我的異常例程時,我注意到當一條指令拋出一個異常時,異常例程就會執行,但是CPU會跳回到引發異常的指令!這並不適用於每一個異常(例如,一個div零異常會跳回指令除法指令之後),但是讓我們考慮下面的一般保護性異常:
MOV EAX, 0x8
MOV CS, EAX
我的例行很簡單:調用顯示紅色錯誤消息的函數。
結果:MOV CS,EAX失敗 - >我的錯誤消息顯示 - > CPU跳回到MOV CS - >無限循環垃圾郵件錯誤消息。
我在操作系統和unix安全方面與老師討論過這個問題。 他告訴我他知道Linux有辦法繞過它,但他不知道哪一個。
幼稚的解決方案是從例程中解析拋出指令,以獲得該指令的長度。 該解決方案非常複雜,我感到有點不舒服,在每個受影響的例外程序中增加一個相對較重的功能的呼叫...
因此,我想知道是否是解決問題的另一種方法。也許有一個「神奇」的寄存器,包含一點可以改變這種行爲?
-
非常感謝您提前任何建議/信息。
-
編輯:好像很多人想知道爲什麼我想跳過有問題的指示,恢復正常運行。
我有兩個方面的原因:
首先,殺的過程將是一個可能的解決方案,而不是一個乾淨的。這不是它在Linux中的做法,例如,內核發送信號(我認爲是SIGSEGV),但不會立即中斷執行。這很有意義,因爲應用程序可以阻止或忽略信號並恢復自己的執行。這是一個非常優雅的方式來告訴應用程序它做了錯誤的國際海事組織。
另一個原因:如果內核本身執行非法操作會怎麼樣?可能是由於一個錯誤,但也可能是由於內核擴展。正如我在評論中所說:在這種情況下我應該怎麼做?我只需要殺死內核並用笑臉顯示一個漂亮的藍屏?
這就是爲什麼我希望能夠跳過指令。 「猜測」指令的大小顯然不是一種選擇,解析指令看起來相當複雜(不是我介意實現這樣的例程,但我需要確保沒有更好的方法)。
我明白你的觀點。我知道繼續執行產生段錯誤的進程是沒有意義的,但我只是想*做到這一點,主要是出於好奇。 從我目前所瞭解的情況來看,不可能以簡單的方式來完成(例如,沒有定義中斷行爲的神奇寄存器)。 – 2012-02-08 15:05:35
如果你確實想要做到這一點,那麼你必須實現一個解碼器來確定RAM中原始字節的指令長度。對於80x86(可變長度指令,前綴等)這將是一大筆工作。一旦你得到了它的「工作」,它在某些情況下仍然不起作用。例如,想象一下由「頁面不存在」導致的頁面錯誤 - 您無法嘗試解碼不存在的字節。 – Brendan 2012-02-08 15:18:28
我知道這將是一個大量的工作。沒有想到頁面錯誤,但這不是一個很大的問題(至少在我的情況下,還沒有)。 – 2012-02-08 15:47:03