【发布时间】:2015-01-17 21:19:51
【问题描述】:
我的问题是关于 Linux 中的系统调用。我听说一个在提示符中只打印“hello world”的简单程序可能需要多达 50 个系统调用。这是正确的吗?如果正确,所有这些调用中发生了什么?
【问题讨论】:
-
系统调用的数量很大程度上取决于语言和编译选项。所以我不会说很多是必需的。
-
我听说计算机科学讨论中提到的数字多达 230% 被夸大了。
我的问题是关于 Linux 中的系统调用。我听说一个在提示符中只打印“hello world”的简单程序可能需要多达 50 个系统调用。这是正确的吗?如果正确,所有这些调用中发生了什么?
【问题讨论】:
您可以使用工具strace 打印出系统调用。只需启动前面带有 strace 的任何程序,如下所示:strace echo "Hello World"。您可能需要成为 root 用户才能使用它。
【讨论】:
write(stdout, "Hello World", 11) 和exit()。任何其他都来自您用于开发的语言的运行时库,并且可以支持更复杂程序中使用的功能。
因此,即使软件很简单,您仍然需要考虑硬件在幕后发生的所有事情。在您的示例中,“一个仅在提示符中打印 'hello world' 的简单程序”,发生了很多事情。要开始思考为什么涉及这么多系统调用,请问问自己从磁盘获取文件并在 CPU 上执行其指令的底层机制是什么(其中一部分涉及写入输出流和更改监视器上的像素)。每次我们的用户空间应用程序想要访问这些硬件时,我们都需要进行系统调用。对于 hello world,我们需要在 hello-world.c 文件和 stdio.h 文件之间创建链接。这将需要许多系统调用。然后我们需要将链接的文件映射到内存中,(以便处理器可以执行)需要更多的系统调用。以此类推。
【讨论】:
在 Linux(和 Windows)中,系统调用通常通过在 EAX 寄存器中传递 SysCallId 并执行int 0x80(软件中断)或SYSENTER(新指令)来执行
基本上这会将控制权转移给内核,然后内核将使用传递的索引在其系统服务表中找到要执行的函数并执行它。
【讨论】: