GETREGSET 获得“cpsr”注册
GETREGSET 获得“cpsr”注册 熟悉AArch64的人可能会注意到GETREGSET我们已经获得了“cpsr”注册,但硬件架构没有。 GETREGSET返回的内容已经从AArch64上可单独访问的字段合成为类似cpsr的布局。
两者之间更显着的差异是GETREGSET缺少orig_r0(或orig_x0)。这种缺乏与系统调用有关。在ARM 32位上,系统调用编号放在r7中,并且系统调用参数在系统调用(SVC)指令之前放在参数寄存器r0-r3中。从系统调用返回的值位于r0(根据通常的APCS,在特殊情况下为r7)。内核从 syscall 返回后,orig_r0将原始的第一个参数提供给 syscall (已被返回值覆盖)。
I实际上不知道“正常”应用程序应该使用什么用于这个原始的第一个参数。我们使用它来支持 restart_syscall ,其中返回值为ERESTART_RESTARTBLOCK。
不幸的是,缺乏orig_x0对我们来说是个问题,我们还没有在任何情况下解决。如果我们已经记录了系统调用的条目,那么我们就拥有了所需的所有信息。但是,如果我们在 restart_syscall 期间附加了,那么我们就不知道x0的原始值。我们唯一的选择是允许内核重新启动 syscall ,但这次重启对我们来说是低效的,因为我们无法优化系统调用的录制。
回到GETREGS与GETREGSET的主题:GETHBPREGS和NT_ARM_HW_BREAK也有很大不同。对于GETHBPREGS请求,使用 ptrace 调用中的 addr 字段来请求特定的硬件断点寄存器。 NT_ARM_HW_BREAK返回所有硬件断点寄存器。
查看评论 回复
"GETREGSET 获得“cpsr”注册"的相关文章
- 上一篇:缺乏orig_x0
- 下一篇:Linux x86 和ARM什么区别?