システムコールを実行しています。を実行するswi #0と、制御が Linux カーネルに戻され、そこで ptrace の要求が処理されます。
簡単な Google で、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が Linux カーネルに関数番号swi #__NR_ptraceを通知するために使用する速度が遅い。命令はとしても知られています。のARMドキュメントによると、この命令はスーパーバイザ モードに切り替わり、ソフトウェア割り込み例外を実行します。アドレス0xffff0008または0x00000008で。これを処理する特定の Linux コードはentry-armv.S にあります。保存している理由は完全には明らかではありません。機能番号がEABIに送信されますswisvc svcr4Linux in register 。Linux エントリ ポイントr7のテーブルにインデックスを付けます。syscall()その他のよく知られたルーチンはread()、write()、 などです。