2013-04-25 70 views
1

我需要攔截Linux內核中頁面錯誤的異常處理,但我不允許修改內核源代碼並編譯內核。我必須在內核模塊中執行此操作。我現在有幾種方法。在Linux內核中攔截異常處理程序的最佳實踐


  1. 複製IDT表和替換頁面錯誤的ISR。但是,我查看了內核的彙編代碼,發現ISR調用了一些在模塊編譯時無法確定地址的函數。例如,callq *0x2b0a07(%rip) # ffffffff81620100 <pv_irq_ops+0x30>
  2. 使用kprobe/jprobe機制來攔截do_page_fault,但並非所有內核都配置了kprobe啓用。
  3. 用跳轉到我的代碼的跳轉指令替換do_page_fault的前幾個字節。但是,我需要在我的代碼中使用do_page_fault。我必須將替換的指令放到另一個地方,但x86代碼的大小很難確定,如果其中一個替換的指令跳轉,事情會變得更加複雜。

你們有什麼想法解決這個問題嗎?

回答

4

更改IDT條目以指向您的處理程序。如果/需要,從那裏調用原始處理程序。無需複製IDT或修補現有的代碼。

+0

你的回答啓發了我。這種方法存在一個小問題:必須將陷阱幀和錯誤代碼推入並進行兩次陷阱。這會降低性能。如果沒有其他優雅的方法,這個應該是我的選擇。 – RichardUSTC 2013-04-25 11:06:11

+0

我不想使用異常來處理除了特殊情況以外的任何情況。即使你只需要經過一次陷阱代碼,它們也不便宜。 – 2013-04-25 11:23:01

+0

@AlexeyFrunze你有機會參考這樣做的代碼嗎? – dimba 2013-07-23 12:05:52