它正在执行系统调用。当您运行时swi #0
,控制权会交还给 Linux 内核,在该内核中处理 ptrace 请求。
快速谷歌发现 Linux 内核实现位于linux/kernel/ptrace.c中。
在 ARM EABI 调用约定中,r0-r3 是暂存寄存器,可以用作临时寄存器。如果您需要使用任何其他寄存器,则必须保存它们。在这种情况下, r7 用于保存系统调用号__NR_ptrace
。要在不违反约定的情况下使用 r7,需要保存并在完成后恢复。
在代码中,这是通过以下方式完成的:
...
stmfd sp!, {r4, r7} /* Save */
ldr r7, =__NR_ptrace /* Use */
...
ldmfd sp!, {r4, r7} /* Restore */
...
这个特定的代码是一个EABI内核syscall()
。较慢的旧OABI用于swi #__NR_ptrace
向Linux 内核发送函数号。该swi
指令也称为svc
. 根据ARM 上的文档svc
,该指令切换到超级用户模式并执行软件中断异常;在地址0xffff0008或0x00000008。处理此问题的特定 Linux 代码位于entry-armv.S中。目前尚不完全清楚为什么要保存r4
. 功能编号被发送到EABILinux in register r7
,它索引syscall()
Linux 入口点表。其他熟悉的例程是read()
,write()
等。