gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:05:53 34 4
gpt4 key购买 nike

我正在编写一个程序来解析在 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}开始,然后是 splr 的存储。

如果你对内核模式状态感兴趣,它被__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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com