1
我需要攔截Linux內核中頁面錯誤的異常處理,但我不允許修改內核源代碼並編譯內核。我必須在內核模塊中執行此操作。我現在有幾種方法。在Linux內核中攔截異常處理程序的最佳實踐
- 複製IDT表和替換頁面錯誤的ISR。但是,我查看了內核的彙編代碼,發現ISR調用了一些在模塊編譯時無法確定地址的函數。例如,
callq *0x2b0a07(%rip) # ffffffff81620100 <pv_irq_ops+0x30>
。 - 使用kprobe/jprobe機制來攔截
do_page_fault
,但並非所有內核都配置了kprobe啓用。 - 用跳轉到我的代碼的跳轉指令替換
do_page_fault
的前幾個字節。但是,我需要在我的代碼中使用do_page_fault
。我必須將替換的指令放到另一個地方,但x86代碼的大小很難確定,如果其中一個替換的指令跳轉,事情會變得更加複雜。
你們有什麼想法解決這個問題嗎?
你的回答啓發了我。這種方法存在一個小問題:必須將陷阱幀和錯誤代碼推入並進行兩次陷阱。這會降低性能。如果沒有其他優雅的方法,這個應該是我的選擇。 – RichardUSTC 2013-04-25 11:06:11
我不想使用異常來處理除了特殊情況以外的任何情況。即使你只需要經過一次陷阱代碼,它們也不便宜。 – 2013-04-25 11:23:01
@AlexeyFrunze你有機會參考這樣做的代碼嗎? – dimba 2013-07-23 12:05:52