在哪里可以找到系统调用源代码?
- 2024-11-13 08:36:00
- admin 原创
- 23
问题描述:
在 Linux 中,如果我有源代码树,我在哪里可以找到所有系统调用的源代码?此外,如果我想查找特定系统调用的源代码和汇编代码,我可以在终端中输入什么吗 my_system_call
?
解决方案 1:
您需要 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:
从应用程序的角度来看,系统调用是内核执行的基本原子操作。
汇编指南用机器指令解释了正在发生的事情。
当然,内核在处理系统调用时会做很多事情。
实际上,您几乎可以相信整个内核代码都用于处理所有系统调用(这并非完全正确,但几乎如此;从应用程序的角度来看,内核仅通过系统调用可见)。 Daniel Kamil Kozar 的另一个回答解释了哪个内核函数正在启动某些系统调用的处理(但通常,内核的许多其他部分会间接参与系统调用;例如,调度程序间接参与实施, fork
因为它管理由成功的系统调用创建的子进程fork
)。
解决方案 3:
我知道它已经过时了,但我也在寻找它的来源_system_call()
,并发现了这个小道消息
system_call 入口点的实际代码可以在 /usr/src/linux/kernel/sys_call.S 中找到。许多系统调用的实际代码可以在 /usr/src/linux/kernel/sys.c 中找到,其余的可以在其他地方找到。find 是你的朋友。
我认为这个已经过时了,因为我甚至没有那个文件。但是,ENTRY(system_call)
在 arch/x86/kernel/entry_64.S 中找到 grep,它似乎是调用各个系统调用的东西。我现在不熟悉我的 intel-syntax x86 asm,所以你必须看看这是否是你想要的。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件