如何在Linux(ARM架构)中获取进程的保存寄存器

3
我正在编写一个程序,解析Linux上运行的所有任务,从init_task开始,对于每个任务,我读取它的task_struct结构,这使我能够获得它的PID,状态,Oncpu等信息。
但是我还需要找到该任务的保存寄存器,特别是寄存器R0到R10,IP,SP,FP和PC。
此外,在task_struct中,我找到了一个指向cpu_context结构的指针,其中包含寄存器R4到PC。
所以问题在于,我不知道如何获取R0到R3寄存器。我尝试手动解析任务的堆栈,但没有找到任何相关值。
因此,我的问题如下:
-不在运行的任务的堆栈(或内存中的其他位置)中保存寄存器的位置在哪里?
-我可以相信在cpu_context结构中找到的R4到PC寄存器的值吗?
我使用包含ARM Cortex A9 MPCore处理器(2个核心)的板子,并通过JTAG Link与主机PC链接。
板子上运行Linux内核2.6.35.7+(当然,该内核是针对ARM架构编译的)。
在主机PC上,我使用OPENOCD和GDB进行调试。
谢谢。
2个回答

4

这取决于您感兴趣的寄存器集。

如果您对用户模式状态感兴趣,请看一下ptrace是如何实现的。从源代码中快速浏览,您应该查看task_pt_regs(task)。显然,它们位于任务的内核栈顶附近(例如,看一下vector_swi;它在开头附近有一个stmia sp,{r0-r12},接着是一个splr的存储)。

如果您对内核模式状态感兴趣,则由__switch_to保存到task->cpu_context中(TI_CPU_SAVEstruct thread_infocpu_context的偏移量)。正如另一个答案已经指出的那样,它不保存r0-r3,因为它没有必要;switch_to的调用者假设它们将被__switch_to破坏,所以它们的值并不重要。


1

cpu_context 包含寄存器的值,当调用 __switch_to 时,调用者保存的寄存器不会被存储。

如果你想要在中断或系统调用进入时获取寄存器的值,需要在其他地方查找。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接