如何在ARM中实现ptrace

0 android arm

我发现ptrace将在__ptrace.S中使用__ptrace及其代码,如下所示:

ENTRY(__ptrace)
.save   {r4, r7}
stmfd   sp!, {r4, r7}
ldr     r7, =__NR_ptrace
swi     #0
ldmfd   sp!, {r4, r7}
movs    r0, r0
bxpl    lr
b       __set_syscall_errno
END(__ptrace)
Run Code Online (Sandbox Code Playgroud)

我不知道的是这个过程如何继续在swi#0和r7在这里做什么?

谢谢你的任何提示.

tan*_*grs 6

它正在执行系统调用.运行时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 */
...
Run Code Online (Sandbox Code Playgroud)

此特定代码是EABI内核syscall().较旧的旧OABI用于swi #__NR_ptrace向Linux内核发送功能号.该swi指令也称为svc.根据ARM 文档svc,该指令切换到管理程序模式并执行软件中断异常; 在地址0xffff00080x00000008.处理此问题的特定Linux代码位于entry-armv.S中.目前还不完全清楚它为什么要保留r4.该功能号被发送到EABI寄存器的Linux r7,其索引的表syscall()Linux的入口点.其他熟悉的程序是read(),write()