2012-06-18 49 views
8

我想改變Linux內核,以便每次當前的PID改變 - 即新的進程被切換 - 執行一些診斷代碼(下面的詳細解釋,如果好奇的話)。我做了一些挖掘,看起來每次調度程序選擇一個新進程時,函數context_switch()被調用,這是有道理的(這只是從粗略的分析sched.c/schedule())。kernel/sched.c/context_switch()保證每次切換進程時調用?

問題是,Linux調度程序對我來說基本上是黑魔法,所以我想知道這個假設是否正確。是否保證每次選擇一個新進程以在CPU上獲得一些時間時,會調用context_switch()函數?還是在內核源代碼中有其他地方可以在其他情況下處理調度? (或者我完全誤解了這一切?)

爲了給出一些上下文,我正在使用MARSS x86模擬器嘗試做某些儀器和某些程序的測量。問題是我的儀器需要知道某些代碼事件對應哪個執行過程,以避免誤解數據。這個想法是在MARSS中使用一些內置的消息傳遞系統來在每個上下文切換時傳遞新進程的PID,所以它總是知道當前正在執行的PID。如果任何人都可以想出一個更簡單的方法來實現這一點,那也將不勝感激。

回答

4

是的,你是對的。

schedule()將呼叫context_switch(),當schedule()已選擇新過程時,負責從一個任務切換到另一個任務。

context_switch()基本上做了兩件事。它叫switch_mm()switch_to()

switch_mm() - 開關爲新進程的虛擬存儲器映射

switch_to() - 從先前處理切換處理器狀態到新的處理(保存/恢復寄存器,堆棧信息和其他特定結構的東西)

至於你的方法,我想這很好。在使用內核時保持乾淨和乾淨非常重要,並且儘量保持相對容易,直到獲得更多知識。

相關問題