2015-09-18 25 views
0

對於用戶模式應用程序,不正確的頁面訪問不會造成應用程序崩潰以外的許多麻煩,應用程序崩潰可以通過異常處理良好地完成。爲什麼我們不能爲內核崩潰做同樣的事情?所以當內核模塊試圖訪問一些無效的地址時,就會出現頁面錯誤和內核崩潰。爲什麼不能像卸載有故障的模塊那樣優雅地處理它。爲什麼內核無法輕鬆處理崩潰

更具體地說,我很想知道它是完全不可能的還是可能的。我不想知道它在使用該系統時可能造成的困難。我知道司機崩潰會導致無法使用的設備,我很好。唯一的問題是是否可以正常卸載出現故障的驅動程序。

+0

如果錯誤的模塊與您的圖形卡交談或理解您的'/ home'分區的文件系統,那將是多麼優雅?如果崩潰發生在模塊之外呢? –

+0

我們應該能夠卸載故障模塊。爲什麼我們不能?這是我的問題。它是安全的設計選擇,還是根本不可能的。如果這是一個設計選擇,那麼什麼因素迫使我們做出這樣的選擇。 – user1120675

回答

0

內核模塊和內核本身共享相同的地址空間。如果模塊開始不正常並覆蓋來自另一個子系統的內存,則根本無法提供保護。因此,當司機崩潰時,司機可能會也可能不會在當地。如果你幸運的話,你仍然有一個有點功能的內核,可以繼續工作。 這不會發生在用戶空間上,因爲每個進程的地址空間是分開的,所以可能會捕獲錯誤的內存訪問並停止進程(這是SEGFAULT)。

2

這就好像在說「如果將所有Java代碼都包含在try/catch塊中,那麼您已經消除了所有的錯誤!」

有一些「錯誤」被捕獲,例如, kalloc如果內存不足,則返回NULL,如果沒有USB等,則USB代碼返回錯誤。但是對於整個操作系統沒有try/catch,因爲不是所有的錯誤都可以修復。

如前所述,如果您的文件系統模塊崩潰會發生什麼?繼續運行沒有文件?你的以太網驅動程序如何?現在你的盒子已經從互聯網上切斷,你甚至不能再ssh進入它,但甚至沒有重新啓動的禮儀。

因此,儘管內核在模塊崩潰時可能不會「崩潰」,但內核狀態可能會被任意破壞。內核可以在沒有屏幕,文件系統或互聯網連接的情況下保持活躍,但是這種存在是什麼樣的?

+0

我同意你的觀點,除了一些。例如,網卡驅動程序崩潰將導致互聯網連接丟失。但它會讓你做其他事情。可能是我不想使用互聯網。我明白會有功能喪失。我的問題是:如果我同意使用沒有這些功能的系統,該怎麼辦?在沒有強制重啓系統的情況下,內核可以通知用戶某些驅動程序發生故障並需要重啓系統。 – user1120675

4

正如其他答案很好地解釋了爲什麼從內核崩潰中恢復是不可行的,我會試着告訴別的。

在這方面有很多研究,尤其是來自教授。安迪Tanenbaum與他的MINIX。儘管內核崩潰對MINIX來說仍然是致命的,但MINIX內核非常簡單(微內核),從而縮小了錯誤空間,並且在其中大部分其他內容(包括驅動程序)都以用戶模式進程運行。所以,如果網絡驅動程序發生故障,因爲它們在單獨的地址空間中運行,所有內核需要做的就是嘗試重新啓動驅動程序。

當然,有些地方你不能恢復(或仍然無法恢復),就像在文件系統崩潰的情況下一樣(請參閱最近的討論here)。

有關於這一主題如http://pages.cs.wisc.edu/~swami/papers/thesis.pdf幾個不錯的論文,我會強烈建議看的Tanenbaum的視頻等this one(標題是:如果它永遠處於脫機狀態「MINIX 3可靠安全的操作系統」)。

我覺得這解決您的評論:

我們應該能夠卸載有問題的模塊。爲什麼我們不能?這是我的問題。它是安全的設計選擇,還是根本不可能的。如果這是一個設計選擇,什麼因素迫使我們做出該選擇

如果圖形驅動程序模塊崩潰,則可以不用屏幕就可以居住。但是,我們無法卸載有故障的模塊並繼續,因爲如果它崩潰並且它與內核運行在相同的地址空間中,則不知道它是否毒害了內核內存 - 安全性是此處的主要因素。