Dr.*_*all 28 linux filesystems assembly system-calls linux-kernel
在linux中我可以找到所有系统调用的源代码,因为我有源代码树吗?另外,如果我想要查找特定系统调用的源代码和程序集,那么我可以在终端中输入类似-my_system_call的内容吗?
Dan*_*zar 34
您需要Linux内核源才能查看系统调用的实际来源.手动页面(如果安装在本地系统上)仅包含调用的文档,而不包含其源本身.
不幸的是,系统调用不会存储在整个内核树中的一个特定位置.这是因为各种系统调用可以引用系统的不同部分(进程管理,文件系统管理等),因此将它们存储在与系统的特定部分相关的树的部分之外是不可行的.
你能做的最好的事情就是寻找SYSCALL_DEFINE[0-6]宏.它(显然)用于将给定的代码块定义为系统调用.例如,fs/ioctl.c具有以下代码:
SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
{
/* do freaky ioctl stuff */
}
Run Code Online (Sandbox Code Playgroud)
这样的定义意味着声明了ioctlsyscall并且接受了三个参数.旁边SYSCALL_DEFINE的数字表示参数的数量.例如,在getpid(void)声明的情况下kernel/timer.c,我们有以下代码:
SYSCALL_DEFINE0(getpid)
{
return task_tgid_vnr(current);
}
Run Code Online (Sandbox Code Playgroud)
希望能把事情搞清楚一点.