2015-04-22 97 views
2

在Linux x86_64上,當我使用ptrace停止進程時,所有線程的CPU上下文將被保存,還是隻保存進程的CPU上下文?ptrace會中斷CPU上下文,用戶空間堆棧還是內核堆棧?

進程的用戶空間堆棧或內核堆棧上的上下文是什麼?或者別的地方?或多個副本?

對於其他情況(而不是ptrace),哪裏可以中斷(包括異常和系統調用)CPU上下文保存,內核堆棧,用戶空間堆棧或其他地方?

ptrace是一箇中斷嗎?


更新

看來,ptrace的上下文pt_regs_x86_t,其中保存是由程序員決定。但內核是否也會爲中斷的上下文存儲副本?

回答

1

是的,內核將始終存儲任何當前未執行的線程的上下文。無論線程是否被跟蹤,該上下文在很大程度上都是相同的。區別在於如何/是否可以重新調度線程 - 如果正在進行抓取,跟蹤過程將決定何時可以恢復。

線程的用戶空間上下文存儲在內核堆棧上(但需要注意的是,每個線程都有一個獨立的內核堆棧區域)。無論線程是通過執行系統調用進入內核,還是由於中斷而被掛起 - 最終,這些都是線程可以暫停的唯一兩種方式。

正如你發現的那樣,當一個進程被追蹤時,追蹤程序可以訪問被追蹤的線程的寄存器,使其處於線程上次執行時的狀態。這是通過簡單地從被跟蹤的線程的內核堆棧複製保存的寄存器來完成的。

最後,值得注意的是,如果你看看linux內核代碼,你將無法找到任何具體的進程表示。一個進程只是一組相關的線程,它們共享其狀態的各個部分:進程ID,地址空間,文件描述符等。

+0

這裏異常和int 0x80包含在中斷中,對不對?這裏的系統調用是指sysenter/sysexit,對吧? – WindChaser

+0

是的,有實際的中斷(由外部事件/設備引起),直接由用戶進程調用的陷阱(sysenter,int 0x80等)以及由用戶代碼行爲引起的陷阱或錯誤(頁錯誤,零除,等)。但是所有的結果都會保存在內核中。 –

+0

內核代碼引起的故障如何,會發生什麼? – WindChaser