4

我想知道是否有任何 libc 函数不调用任何 syscall()?例如,对于 libc 函数“strcpy()”,它是否有任何系统调用(让我们考虑所有可能的 linux 系统)。

4

2 回答 2

5

系统调用在性能方面非常繁重,因为它们意味着将上下文切换到内核中。因此,对于像这样的简单库函数strcpy(其功能实际上等效于while(*d++ = *s++),但可能针对架构进行了优化),系统调用没有任何意义。

请注意,复制期间的页面错误可能会导致内核上下文切换和系统调用的出现,但这不是strcpy直接调用系统调用的结果。

于 2012-10-07T00:36:50.543 回答
4

系统调用有点像从用户空间(程序运行的地方)到内核空间的接口。当你在做一些只有内核才能做的事情时需要它们,比如与硬件通信(例如从网卡读取字节,启动进程,甚至通过 malloc(使用brk)分配内存等)。

另一方面,Userland 函数,例如strcpy,并没有缩进来执行系统调用。他们不需要特殊的权限来做他们所做的事情,他们只是在用户空间中对进程的内存进行操作。

由于系统调用引入了主要的性能损失(将模式从用户更改为内核空间并返回代价高昂),因此strcpy从设计的角度来看,将它们置于经常调用的函数中是没有意义的,因此不太可能被看到。

于 2012-10-07T00:26:23.470 回答