2011-10-21 31 views
2

我在想,如果從內核(Linux的在這種情況下)你叫ptrace_request與PTRACE_SINGLESTEP在進程上下文(系統調用,缺頁等)會發生什麼。它會單步執行用戶空間指令還是內核空間指令?我意識到,ptrace只能單步執行用戶指令,這就是爲什麼我對這會產生的行爲感到好奇。Ptrace從進程上下文中的單步執行內核?

只是提供多一點信息,我試圖從一個頁面故障處理程序這樣做(單步產生故障的指令,但改變PTE地,指令經過)。我想知道這是否甚至有可能,或者如果它需要另一種方法來做到這一點,例如重新安排進程運行等等......

這是因爲進程的task_struct(如果被搶佔)仍然會指向內核空間處理程序IIRC,因此單步執行ptrace會繞過這一步並執行正確的用戶空間指令,或者完全不執行該操作?

回答

1

我不完全理解你的意思,PTRACE_SINGLESTEP總是從內核的用戶上下文中調用:當你執行你的系統調用ptrace(PTRACE_SINGLESTEP)時,你將最終在內核上下文中執行該函數,像通常那樣運行,並且使您正在執行的進程執行一條指令,而不管您是否從頁錯誤處理程序調用該指令。像往常一樣在內陸地區,你將無法單步執行。

我建議你看一看弓/ 86 /內核/ ptrace.c瞭解如何一步實際工作。單步指令實際上是由內核模擬的,IIRC對此沒有硬件支持。

0

要理解回答你的問題,你需要了解英特爾的硬件。

首先我們先從最簡單的指令(因爲SINGLE_STEP是把Intel的CPU進入單步執行模式,並執行一個結構調查後又回到中斷處理程序):

MOVL(EAX),EBX

繼Intel的格式,這意味着採取的價值觀裏面EAX,把它當作一個內存指針,訪問內存,得到了4點字節的值,並將其複製到EBX。

這ONE彙編指令 - 當內核VS用戶上下文中執行將有不同的行爲/含義。

如果在內核中,內核的頁表將用於訪問內存,並將數據複製到ebx。在用戶進程中,用戶的頁表將被使用(通過MMU硬件),從內存中讀取數據並複製到ebx。 eax中的相同值,但CR3寄存器中的值不同(意味着不同的進程上下文),將觸發內存的不同部分進行讀取。所以在內核中跟蹤用戶空間程序,真的很荒謬。因爲你必須在執行用戶指令前後執行上下文切換(涉及整套寄存器存儲和恢復操作),這意味着有效地執行4次操作。如你所見,我沒有引用任何內核函數API,就像你提到過的那樣。首先是總體概念理解。