2012-04-08 14 views
1

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

さらに詳しいこと:syscallは、私がsyscall(300)を実行するときに呼び出すコンパイルされた.cファイルであることを知っていなければなりません。

私はUbuntuの9.10 をusuing AMは

+0

*私がしたいのは、特定の番号の実際のルーチンがどこにあるのかを知ることです。つまり、300のルーチンがどこにあるのか分かりますか? 「どこですか?」という意味ですか?カーネルの.cファイルに実装が含まれていることを意味しますか?または、このsyscallを使用するためにあなたのuserspaceプログラムに含める必要がある.hファイルは何ですか? –

+0

完了、私はそれが今より明確であることを願っています。ありがとうジョージ。 – Louis

答えて

0

のは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の値を繰り返します。

あなたがgdbvmlinux/proc/kcoreを持っている場合は、次の操作を行うことができます:あなたはあなたのカーネルの分解をダンプするobjdump -rd vmlinuxを使用できることに加えて

# gdb vmlinux /proc/kcore 

を。

0

ファイルsyscall_table.Sリストを含める必要があり、あなたの入力のための楽しみください。

関連する問題