所有
当我分配新的物理页面时,我正在尝试打印当前的PC值。 在linux内核源码中,mm / memory.c负责分配页面, 但它没有关于PC值的信息...... 有谁知道我在哪里可以找到这个PC值并在memory.c文件中使用它?
答案 0 :(得分:1)
将我的评论写回答。
您正在寻找的不是当前PC (一直在变化),而是指令的PC触发页面错误。要了解存储的位置以及如何检索它,让我们深入挖掘一下。
当x86中发生异常(陷阱或中断)时,CPU将执行以下操作:
#GP
错误(一般保护[错误]);因为它本身就是一个例外......如果它的门也是无效的...... #DF
(双重故障)......冲洗重复......如果无效 - 三重故障(重置CPU很难) )。%cs
成为内核,并使处理程序成为一个低级别的中断入口函数)。#DF
机会...如果由于内核堆栈指针损坏或堆栈溢出而失败,则会发生进入未映射的内存)。书面信息包含:
flags
注册struct ptregs*
作为参数调用C函数 - 这是异常帧,由陷阱条目保存的寄存器状态(部分由HW / CPU本身,部分由条目存根代码保存)。这是实际用于处理陷阱/异常/中断的内容。从陷阱/中断返回时,x86 iret
指令用于展开CPU推送到内核堆栈的四个/五个字,以便恢复/返回。
这样,内核中的每个异常条目都被赋予相同的数据结构struct ptregs *
- 如上所述,对于大多数陷阱/中断,除了其他信息之外,还包含程序计数器/指令指针,其中说明了故障发生了。 struct pt_regs.ip
是您需要查看的字段。
尤其对于页面错误,请参阅do_page_fault()
并查看其使用位置/方式。