1

私は自己コンパイルされた Linux カーネルに取り組んでいます。カーネルを変更した人は、いくつかのシステムコールを追加しました。私がやりたいことは、その特定の番号の実際のルーチン (.c ファイル) がどこにあるか、つまり syscall(300) を知ることです。

詳細: syscall は、syscall (300) を実行するときに呼び出すファイル (コンパイル済みの .c ファイル) を認識している必要があります。その .c ファイルを確認したいのです。

Ubuntu 9.10 を使用しています。ご意見をお待ちしております。

4

2 に答える 2

0

ファイルsyscall_table.Sにはリストが含まれている必要があります。

于 2012-04-08T09:47:59.673 に答える
0

システムコールがx86_32にどのように実装されているかを見てみましょう(そこを見てください)。

 500 ENTRY(system_call)
 501        RING0_INT_FRAME                 # can't unwind into user space anyway
 502        pushl_cfi %eax                  # save orig_eax
 503        SAVE_ALL
 504        GET_THREAD_INFO(%ebp)
 505                                        # system call tracing in operation / emulation
 506        testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
 507        jnz syscall_trace_entry
 508        cmpl $(NR_syscalls), %eax
 509        jae syscall_badsys
 510 syscall_call:
 511        call *sys_call_table(,%eax,4)
 512        movl %eax,PT_EAX(%esp)          # store the return value
 [...]

ご覧のとおり、ここの511行目にシステムコールディスパッチ命令があります。

call *sys_call_table(,%eax,4)

sys_call_tableしたがって、最初に行う必要があるのは、アドレスを取得することです。次のことは$(NR_syscalls)価値を得ることです。sys_call_tableそして最後のことは単純です-すべての値を繰り返します。

を持っている場合、gdb次のことができます。vmlinux/proc/kcore

# gdb vmlinux /proc/kcore

objdump -rd vmlinuxそれに加えて、カーネルの分解をダンプするために使用できます。

于 2012-04-08T09:52:13.583 に答える