linux - 我如何找到系统调用(一些数字)例程的位置?

标签 linux linux-kernel system-calls

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

更多细节:当我执行 syscall (300) 时,syscall 应该知道调用什么文件,这是一个编译的 .c 文件,我想查看那个 .c 文件。

我正在使用 Ubuntu 9.10 期待您的意见,

最佳答案

让我们看看系统调用是如何在 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 来转储内核的反汇编。

关于linux - 我如何找到系统调用(一些数字)例程的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10060458/

相关文章:

去wait4函数

kernel - 向 FreeBSD 内核添加带参数的系统调用

linux-kernel - bpf_xdp_adjust_meta() 返回错误代码 -13(权限被拒绝)

JavaFx Jar 文件不能在 linux 上运行(在 windows 上运行良好)

linux - 在 ubuntu hardy 中重新索引 sphinx 的最佳方法

c - 如何获取传递给 C 代码中的 Autotools 配置脚本的 --prefix 值?

linux-kernel - 如何获得 Linux 字符设备的结构设备

linux - 具有多个子目录的 Linux 内核模块的 Makefile

linux - Fork 系统调用失败后 rax 中的返回值是多少?

linux - Linux Bash 中的一行命令