システムコールが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
それに加えて、カーネルの分解をダンプするために使用できます。