我正在开发一个自编译的 linux 内核。修改内核的人添加了一些系统调用。我想要做的是知道该特定数字的实际例程(.c 文件)在哪里,即 syscall(300),那么我怎么知道 300 的例程在哪里?
详细说明: syscall 应该知道当我执行 syscall (300) 时要调用哪个文件,这是一个已编译的 .c 文件,我想查看那个 .c 文件。
我正在使用 Ubuntu 9.10 期待您的意见,
我正在开发一个自编译的 linux 内核。修改内核的人添加了一些系统调用。我想要做的是知道该特定数字的实际例程(.c 文件)在哪里,即 syscall(300),那么我怎么知道 300 的例程在哪里?
详细说明: syscall 应该知道当我执行 syscall (300) 时要调用哪个文件,这是一个已编译的 .c 文件,我想查看那个 .c 文件。
我正在使用 Ubuntu 9.10 期待您的意见,
该文件syscall_table.S
应包含列表。
让我们看看系统调用是如何在 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
转储内核的反汇编。