我正在编写一个程序来解析在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进行调试。
由于
答案 0 :(得分:3)
这取决于您感兴趣的寄存器组。
如果您对用户模式状态感兴趣,请查看ptrace
如何做到这一点。从快速查看源代码,task_pt_regs(task)
是您应该查看的位置。显然,它们接近任务的内核堆栈的顶部(例如,看看vector_swi
;它的开头附近有一个stmia sp, {r0 - r12}
,然后是sp
的存储, lr
)。
如果您对内核模式状态感兴趣,则会__switch_to
将其保存到task->cpu_context
中TI_CPU_SAVE
是cpu_context
中struct thread_info
的偏移量)。正如另一个已经注意到的答案,它不会保存r0-r3,因为它不需要; switch_to
的来电者认为他们会被__switch_to
打击,所以他们的价值无关紧要。
答案 1 :(得分:1)
cpu_context
包含调用__switch_to时寄存器的值,不存储调用者保存的寄存器。
如果您想在进入中断或系统调用时获得寄存器的值,您需要查看其他地方。