我正在开发一个自编译的linux内核。修改内核的人添加了一些系统调用。我想要做的是知道该特定数字的实际例程(.c文件)在哪里,即系统调用(300),那么我怎么知道300的例程在哪里?
更详细说明:syscall应该知道在我执行syscall(300)时要调用哪个文件,这是一个已编译的.c文件,我想看看.c文件。
我正在使用Ubuntu 9.10 期待您的投入,
答案 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
值。
如果您有gdb
,vmlinux
和/proc/kcore
,则可以执行以下操作:
# gdb vmlinux /proc/kcore
除此之外,您可以使用objdump -rd vmlinux
转储内核的反汇编。