2012-04-13 102 views
22

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

+2

http://kernel.org/ – TJD 2012-04-13 23:36:20

回答

29

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

希望扫清事情了一点。

2

从应用的角度来看,system call是由kernel完成的基本和原子操作。

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

当然,内核在处理系统调用时会做很多事情。实际上,你几乎可以相信整个内核代码专门用于处理所有系统调用(这不完全正确,但几乎;从应用程序的角度来看,内核只能通过系统调用可见)。 Daniel Kamil Kozar的其他answer解释了什么是内核函数开始处理某些系统调用(但很多时候,内核的许多其他部分间接参与系统调用;例如,调度程序间接参与实现fork,因为它管理由成功的系统调用创建的子进程)。

1

我知道这是老了,但是我正在寻找的源_system_call()过,发现这个珍闻

为system_call入口点实际的代码可以在/ usr/src/linux目录/内核/ sys_call找到。 S很多系统调用的实际代码可以在/usr/src/linux/kernel/sys.c中找到,其他地方可以在其他地方找到。找到是你的朋友。

我认为这是过时的,因为我甚至没有该文件。但是,grep在arch/x86/kernel/entry_64.S中发现ENTRY(system_call),似乎是调用单个系统调用的东西。我现在还没有用我的intel-syntax x86 asm,所以你必须看看是否这是你想要的。

+0

'entry_64.S'不再存在于主线4.8中。 – sherrellbc 2016-12-28 20:07:53

相关问题