のはx86_32上で実装されたシステムコールが(thereを見て)方法を見てみましょう:
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
を持っている場合は、次の操作を行うことができます:あなたはあなたのカーネルの分解をダンプするobjdump -rd vmlinux
を使用できることに加えて
# gdb vmlinux /proc/kcore
を。
*私がしたいのは、特定の番号の実際のルーチンがどこにあるのかを知ることです。つまり、300のルーチンがどこにあるのか分かりますか? 「どこですか?」という意味ですか?カーネルの.cファイルに実装が含まれていることを意味しますか?または、このsyscallを使用するためにあなたのuserspaceプログラムに含める必要がある.hファイルは何ですか? –
完了、私はそれが今より明確であることを願っています。ありがとうジョージ。 – Louis