在linux中我可以找到所有系统调用的源代码,因为我有源树吗?另外,如果我想要查找特定系统调用的源代码和程序集,那么我可以在终端中输入类似-my_system_call的内容吗?
答案 0 :(得分:35)
您需要Linux内核源才能查看系统调用的实际来源。手动页面(如果安装在本地系统上)仅包含调用的文档,而不包含其源本身。
不幸的是,系统调用不会存储在整个内核树中的一个特定位置。这是因为各种系统调用可以引用系统的不同部分(进程管理,文件系统管理等),因此将它们存储在与系统的特定部分相关的树的部分之外是不可行的。 / p>
您可以做的最好的事情是寻找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);
}
希望能稍微清理一下。
答案 1 :(得分:2)
从应用程序的角度来看,system call是由kernel完成的基本和原子操作。
Assembly Howto解释了机器指令方面的情况。
当然,内核在处理系统调用时会做很多事情。
实际上,你几乎可以相信整个内核代码专门用于处理所有系统调用(这不完全正确,但几乎;从应用程序的角度来看,内核只能通过系统调用看到)。 Daniel Kamil Kozar的另一个answer正在解释什么内核函数开始处理某些系统调用(但通常,内核的许多其他部分间接参与系统调用;例如,调度程序间接参与实现fork
因为它管理由成功的fork
系统调用创建的子进程。
答案 2 :(得分:2)
我知道它已经过时了,但我也在寻找_system_call()
的来源并找到了这个花絮
system_call入口点的实际代码可以在/usr/src/linux/kernel/sys_call中找到。许多系统调用的实际代码可以在/usr/src/linux/kernel/sys.c中找到,其余的都在其他地方找到。找到你的朋友。
我认为这是过时的,因为我甚至没有那个文件。但是,grep在arch / x86 / kernel / entry_64.S中找到ENTRY(system_call)
,似乎是调用单个系统调用的东西。我现在没有使用我的英特尔语法x86 asm,因此你必须查看这是否是你想要的。