我发现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在这里做什么?
谢谢你的任何提示.
它正在执行系统调用.运行时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,该指令切换到管理程序模式并执行软件中断异常; 在地址0xffff0008或0x00000008.处理此问题的特定Linux代码位于entry-armv.S中.目前还不完全清楚它为什么要保留r4.该功能号被发送到EABI寄存器的Linux r7,其索引的表syscall()Linux的入口点.其他熟悉的程序是read(),write()等