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