1

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