2012-01-24 36 views
5

朋友們,我試圖跟蹤包括運行在其上的進程在內的操作系統的完整執行情況。爲此,我想讓每個進程執行的指令及其執行跟蹤,我想這樣做,而不必去每個進程的objdump。當前正在執行的進程的pid

所以我的目標是:
1)建立每個PID的地址空間。
2)跟蹤每個pid的執行情況。

爲了實現上述目標,我在模擬器Qemu上運行基於Linux的操作系統。

當qemu第一次遇到一條指令時,我會使用一個io-port或一個已知的物理內存地址來檢查運行此指令的進程的pid。然後我可以使用這些信息來做我想要的東西。

我的問題是...... 在kernel/sched.c中,我可以知道下一步要執行的進程的pid。意思是我不能像一個函數調用 - > launch_process(pid)。有人請指點我在內核中的這個位置。或者在系統中有一個我們可以跟蹤地址空間的已知位置。一個是CR3,但我真的不能相信它。

對於一些人來說,這可能似乎是一個微不足道的指針,但我無法自己找到這個位置。

回答

3

每個過程都有相應的struct task_struct。您可以使用find_task_by_*()函數通過PID或task_pid_*()查找struct task_struct以獲取給定任務的PID。另請參閱「什麼是struct pid?」部分include/linux/pid.h

運行任務位於每個CPU runqueue中:請參閱struct rq定義kernel/sched.c

功能try_to_wake_up(),wake_up_process(),wake_up_new_task(),context_switch()和其他也與您的任務有關。

+0

@droid謝謝... context_switch是執行過程的pid更改的函數。這是我打算在下一個代碼中使用task_struct的地方。有沒有其他改變PID的其他入口?這種方法是否也適用於smp系統? –

+0

我對內核並不熟悉,因此無法確定地回答其他入口點。至於SMP - 我認爲一切都應該沒問題。 –

相關問題