0

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)

私が知らないのは、swi #0 でプロセスがどのように継続され、r7 がここで何をしているのかということです。

ヒントをありがとう。

4

1 に答える 1

6

システムコールを実行しています。を実行する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()、 などです。

于 2013-05-29T05:51:38.327 に答える