システムコールを実行しています。を実行する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に送信されますswi
svc
svc
r4
Linux in register 。Linux エントリ ポイントr7
のテーブルにインデックスを付けます。syscall()
その他のよく知られたルーチンはread()
、write()
、 などです。