34

在 Linux 中,如果我有源代码树,我在哪里可以找到所有系统调用的源代码?此外,如果我想查找特定系统调用的源代码和程序集,是否可以在终端中键入类似的内容 my_system_call

4

3 回答 3

40

您需要 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);
}

希望能把事情弄清楚一点。

于 2012-04-14T00:07:14.780 回答
3

从应用程序的角度来看,系统调用内核完成的基本原子操作。

Assembly Howto根据机器指令解释了正在发生的事情。

当然,内核在处理系统调用时会做很多事情。

实际上,您几乎可以相信整个内核代码都专用于处理所有系统调用(这并不完全正确,但几乎;从应用程序的角度来看,内核仅通过系统调用可见)。Daniel Kamil Kozar的另一个答案是解释什么内核函数开始处理某些系统调用(但通常,内核的许多其他部分间接参与系统调用;例如,调度程序间接参与实现 fork,因为它管理由成功的fork系统调用创建的子进程)。

于 2012-04-14T06:18:33.660 回答
2

我知道它很旧,但我也在寻找它的来源_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,所以你必须看看这是否是你想要的。

于 2014-02-04T14:50:20.850 回答