【问题标题】:does libc function "strcpy()" invoke any syscall?libc 函数“strcpy()”是否调用任何系统调用?
【发布时间】:2012-09-27 17:12:29
【问题描述】:

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

【问题讨论】:

    标签: posix libc system-calls strcpy


    【解决方案1】:

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

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

    【讨论】:

    • strcpy 需要写入虚拟内存,那么在操作系统层次结构中,虚拟内存驻留在哪里?在内核空间还是用户空间?
    • 虚拟内存由内核管理;用户程序只能看到虚拟内存。
    【解决方案2】:

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

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

    由于系统调用会带来重大的性能损失(将模式从用户模式切换到内核模式并返回代价高昂),因此从设计的角度来看,将它们放在像 strcpy 这样经常调用的函数中是没有意义的,因此不太可能被看到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2015-07-18
      相关资源
      最近更新 更多