在 Linux 中,如果我有源代码树,我在哪里可以找到所有系统调用的源代码?此外,如果我想查找特定系统调用的源代码和程序集,是否可以在终端中键入类似的内容 my_system_call
?
3 回答
您需要 Linux 内核源代码才能查看系统调用的实际源代码。手册页,如果安装在您的本地系统上,只包含调用的文档,而不是它们的源代码本身。
不幸的是,系统调用并不仅仅存储在整个内核树中的一个特定位置。这是因为各种系统调用可以引用系统的不同部分(进程管理、文件系统管理等),因此将它们与与系统特定部分相关的树的部分分开存储是不可行的。
你能做的最好的事情就是寻找SYSCALL_DEFINE[0-6]
宏。它(显然)用于将给定的代码块定义为系统调用。例如,fs/ioctl.c
具有以下代码:
SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
{
/* do freaky ioctl stuff */
}
这样的定义意味着ioctl
系统调用被声明并接受三个参数。旁边SYSCALL_DEFINE
的数字表示参数的数量。例如,在, 中getpid(void)
声明的情况下kernel/timer.c
,我们有以下代码:
SYSCALL_DEFINE0(getpid)
{
return task_tgid_vnr(current);
}
希望能把事情弄清楚一点。
Assembly Howto根据机器指令解释了正在发生的事情。
当然,内核在处理系统调用时会做很多事情。
实际上,您几乎可以相信整个内核代码都专用于处理所有系统调用(这并不完全正确,但几乎;从应用程序的角度来看,内核仅通过系统调用可见)。Daniel Kamil Kozar的另一个答案是解释什么内核函数开始处理某些系统调用(但通常,内核的许多其他部分间接参与系统调用;例如,调度程序间接参与实现 fork
,因为它管理由成功的fork
系统调用创建的子进程)。
我知道它很旧,但我也在寻找它的来源_system_call()
并找到了这个花絮
system_call 入口点的实际代码可以在 /usr/src/linux/kernel/sys_call.S 中找到 许多系统调用的实际代码可以在 /usr/src/linux/kernel/sys.c 中找到,其余的在别处可以找到。找到是你的朋友。
我认为这是过时的,因为我什至没有那个文件。但是,ENTRY(system_call)
在 arch/x86/kernel/entry_64.S 中找到的 grep 似乎是调用各个系统调用的东西。我现在不了解我的 intel-syntax x86 asm,所以你必须看看这是否是你想要的。