2011-05-05 101 views
3

我想明白,如果我們能給予控制權交還給前內核/用戶模式添加我們頁面故障處理程序/異常處理程序和處理我們所引起的故障到內核​​。 任務在這裏將不會修改現有的內核代碼(do_page_fault FN),但增加了一個用戶定義的處理程序時,頁面錯誤或和異常觸發用戶自定義頁面錯誤和異常處理

人能找到的工具,如「這將擡頭kprobe「,它們在教學中提供鉤子,但是看起來這樣不會達到我的目的。

如果有人能夠幫助我理解這一點或者指出良好的參考資料,那將會很棒。

回答

0

我不認爲這是可能的 - 首先,頁面錯誤處理程序是一個複雜的函數,需要直接訪問虛擬內存子系統結構。其次,假設這不是問題,但爲了在用戶空間中編寫頁面錯誤處理程序,您應該能夠捕獲一個錯誤,默認情況下會強制傳輸到內核空間,所以至少應該防止這種情況發生。

爲此,您需要一位主管來跟蹤所有內存訪問,但是您無法保證主管代碼已經映射並存在內存中。

2

在用戶空間中,您可以爲SIGSEGV定義一個信號處理程序,因此只要發生無效的內存訪問,就會調用您自己的函數。與mprotect()結合使用時,可以讓程序管理自己的虛擬內存,全部來自用戶空間。

不過,我得到的是你正在尋找一種方式來攔截所有頁面錯誤(主要,次要,和無效),並在響應時調用任意內核功能的印象。我不知道乾淨的方式來做到這一點。當我在自己的研究項目中需要此功能時,我最終將代碼添加到do_page_fault()。它對我來說工作得很好,但它是一種黑客攻擊。如果有人知道一個乾淨的方法來做到這一點(即,可以在一個vanilla內核上使用一個模塊),我會非常感興趣。

+0

嗯,我認爲它可以通過替換IDT中的'page_fault'處理程序來實現。除此之外,這裏允許代碼拼接,但這是一個非常骯髒的黑客;) – 2011-05-31 11:41:25

0

你想安裝一個用戶級尋呼機gnu libsegsev。我沒有使用它,但它似乎只是你正在尋找的東西。

1

如果你不會改變內核處理這些錯誤的方式,並且只是在之前添加你的,那麼kprobes將服務於你的目的。它們有點難以處理,因爲你在包含寄存器和堆棧的結構中獲得探測函數的參數,並且你必須知道,編譯器把它們放在哪裏。但是,如果你需要它的特定功能(在創建探測器時已知),那麼你可以使用jprobeshere是一個很好的例子來說明如何使用兩者),它需要與探測完全相同的參數進行探測的函數在寄存器/堆棧中重新編譯)。

您可以動態加載內核模塊並在選定的函數上安裝jprobes而不必修改內核。