簡體   English   中英

哪里可以在linux內核中找到指令地址(PC值)?

[英]Where can I find instruction address(PC value) in linux kernel?

所有。

當我分配一個新的物理頁面時,我正在嘗試打印當前的PC值。 在linux內核源代碼中,mm / memory.c負責分配頁面,但它沒有關於PC值的信息...有誰知道我在哪里可以找到這個PC值並在memory.c文件中使用它?

將我的評論寫成答案。

您正在尋找的不是當前的PC (一直在變化),而是觸發頁面錯誤的指令的PC。 要了解存儲的位置以及如何檢索它,讓我們深入挖掘一下。

當x86中發生異常 (陷阱或中斷)時,CPU將執行以下操作:

  • 使用向量 (陷阱號/中斷號 - 這是HW隱式和/或可通過編程中斷控制器進行配置 - 是的,你可以使網絡中斷觸發頁面故障,技術上......)作為中斷描述符表的索引( IDT)
  • 它驗證存儲在那里的數據結構(所謂的門描述符
  • 如果無效......引發#GP故障(一般保護[錯誤]); 因為它本身就是一個例外......如果它的門也是無效的...... #DF (雙故障)......沖洗重復......如果無效 - 三重故障(它會重置CPU)。
  • 如果有效,則門將指定目標上下文 (通過代碼段 )並在其中指定處理程序地址 用非專業的話來說,這就是“進入下面的權限級別並調用這個處理程序”(通過使目標%cs成為內核1,處理程序成為一個低級中斷入口函數)。
  • 如果執行此操作涉及權限切換,則CPU將更改為目標權限級別,並切換堆棧指針。
  • CPU將中斷返回信息寫入該堆棧(請注意,此處的下一個#DF機會...如果由於內核堆棧指針損壞或堆棧溢出到未映射的內存中而失敗,則會發生)。 書面信息包含:
    1. 故障時的代碼段(始發“上下文”)
    2. 堆棧指針在故障時激活(即用戶堆棧),堆棧被切換
    3. flags登記
    4. 故障地址/ PC(不是所有類型的陷阱,但絕對是頁面錯誤)
  • 只有發生這一切之后,才會調用實際的中斷向量處理函數。 從這里開始,軟件 - 內核代碼接管:
    1. 在匯編代碼中,將通用寄存器的其余部分和其他必需的“上下文”信息保存到異常幀中 ,然后構造適合於調用C代碼的堆棧。
    2. 使用struct ptregs*作為參數調用C函數 - 這是異常幀,由陷阱條目保存的寄存器狀態(部分由HW / CPU本身,部分由條目存根代碼保存)。 這是實際用於處理陷阱/異常/中斷的內容。

當從陷阱/中斷返回時,x86 iret指令用於展開CPU推送到內核堆棧的四個/五個字,以便恢復/返回。

這樣,內核中的每個異常條目都被賦予相同的數據結構struct ptregs * - struct ptregs * ,對於大多數陷阱/中斷,除其他信息外,還包含程序計數器/指令指針,指出故障發生的位置。 struct pt_regs.ip是您需要查看的字段。

特別是對於頁面錯誤 ,請參閱do_page_fault()並檢查其使用位置/方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM