我怎样才能找到syscall(某些数字)例程?

时间:2012-04-08 04:49:54

标签: linux linux-kernel system-calls

我正在开发一个自编译的linux内核。修改内核的人添加了一些系统调用。我想要做的是知道该特定数字的实际例程(.c文件)在哪里,即系统调用(300),那么我怎么知道300的例程在哪里?

更详细说明:syscall应该知道在我执行syscall(300)时要调用哪个文件,这是一个已编译的.c文件,我想看看.c文件。

我正在使用Ubuntu 9.10 期待您的投入,

2 个答案:

答案 0 :(得分:0)

文件syscall_table.S应包含列表。

答案 1 :(得分: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,则可以执行以下操作:

# gdb vmlinux /proc/kcore

除此之外,您可以使用objdump -rd vmlinux转储内核的反汇编。