如何在Linux中保存进程的寄存器(ARM体系结构)

时间:2011-07-19 11:23:09

标签: linux arm

我正在编写一个程序来解析在linux上运行的所有任务,从init_task开始为每个任务读取它的task_struct结构,它允许我得到它的PID,State,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链接的主机PC链接

Linux Kernel 2.6.35.7+正在板上运行(当然这个内核是为ARM架构编译的)

在主机PC上,我正在使用OPENOCD和GDB进行调试。

由于

2 个答案:

答案 0 :(得分:3)

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

如果您对用户模式状态感兴趣,请查看ptrace如何做到这一点。从快速查看源代码,task_pt_regs(task)是您应该查看的位置。显然,它们接近任务的内核堆栈的顶部(例如,看看vector_swi;它的开头附近有一个stmia sp, {r0 - r12},然后是sp的存储, lr)。

如果您对内核模式状态感兴趣,则会__switch_to将其保存到task->cpu_contextTI_CPU_SAVEcpu_contextstruct thread_info的偏移量)。正如另一个已经注意到的答案,它不会保存r0-r3,因为它不需要; switch_to的来电者认为他们会被__switch_to打击,所以他们的价值无关紧要。

答案 1 :(得分:1)

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

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