- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一个程序来解析在 linux 上运行的所有任务,从每个任务的 init_task 开始,我读取它的 task_struct 结构,它允许我得到它的 PID、状态、Oncpu..
但是我还需要找到那个任务保存的寄存器,特别是寄存器 R0 到 R10、IP、SP、FP 和 PC
同样在 task_struct 中,我发现了一个指向名为 cpu_context 的结构的指针,该结构将寄存器 R4 保存到 PC
所以问题是我不知道如何获取寄存器R0到R3我试图手动解析任务的堆栈,但我没有找到任何相关值
所以这是我的问题:
-堆栈中的哪个位置(或内存中的其他位置)保存了未运行的任务的寄存器?
-我可以将寄存器 R4 的值信任到在结构 cpu_context 中找到的 PC 吗?
我正在使用包含 ARM Cortex A9 MPCore 处理器(2 核)的开发板,通过 JTAG 链接与主机 PC 链接
板子上运行的是Linux Kernel 2.6.35.7+(当然这个内核是为ARM架构编译的)
在主机上,我使用 OPENOCD 和 GDB 进行调试。
谢谢
最佳答案
这取决于您对哪一组寄存器感兴趣。
如果您对用户模式状态感兴趣,请查看 ptrace
是如何实现的。通过快速查看源代码,task_pt_regs(task)
是您应该查看的地方。显然,它们位于任务的内核堆栈顶部附近(例如,查看 vector_swi
;它在其附近有一个 stmia sp, {r0 - r12}
开始,然后是 sp
和 lr
的存储。
如果你对内核模式状态感兴趣,它被__switch_to
保存到task->cpu_context
中(TI_CPU_SAVE
是offset of struct thread_info
中的 cpu_context
)。正如另一个答案已经指出的那样,它不会保存 r0-r3 因为它不必保存; switch_to
的调用者假定它们将被 __switch_to
破坏,因此它们的值无关紧要。
关于linux - 如何在 Linux 中获取进程保存的寄存器(ARM 架构),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6746344/
我是一名优秀的程序员,十分优秀!