[英]Where can I find instruction address(PC value) in linux kernel?
所有。
當我分配一個新的物理頁面時,我正在嘗試打印當前的PC值。 在linux內核源代碼中,mm / memory.c負責分配頁面,但它沒有關於PC值的信息...有誰知道我在哪里可以找到這個PC值並在memory.c文件中使用它?
將我的評論寫成答案。
您正在尋找的不是當前的PC (一直在變化),而是觸發頁面錯誤的指令的PC。 要了解存儲的位置以及如何檢索它,讓我們深入挖掘一下。
當x86中發生異常 (陷阱或中斷)時,CPU將執行以下操作:
#GP
故障(一般保護[錯誤]); 因為它本身就是一個例外......如果它的門也是無效的...... #DF
(雙故障)......沖洗重復......如果無效 - 三重故障(它會重置CPU)。 %cs
成為內核1,處理程序成為一個低級中斷入口函數)。 #DF
機會...如果由於內核堆棧指針損壞或堆棧溢出到未映射的內存中而失敗,則會發生)。 書面信息包含:
flags
登記 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.