代码之家  ›  专栏  ›  技术社区  ›  Chen Li

VDSO(7)和SYSCALL(2)之间的关系是什么?

  •  -1
  • Chen Li  · 技术社区  · 6 年前

    this post ,我学会了

    • syscall 是进入内核模式的默认方式 x86-64
    • 实际上,最近的内核正在实现 VDSO公司

    然后我在 http://man7.org/linux/man-pages/man2/syscall.2.html :

    第一个表列出了用于转换到内核的指令 模式(这可能不是转换到 内核,因此您可能必须参考vdso(7)),该寄存器用于 指示系统调用号,用于返回sys–的寄存器 tem调用结果,以及用于发出错误信号的寄存器。。。。。

    但我缺乏一些必要的知识来理解这些陈述。

    是真的吗 VDSO(7) 是否实施 系统调用(2) 系统调用(2) 将调用 VDSO(7) 要完成 系统调用 ?

    如果不是真的,那么 VDSO(7) 系统调用(2) ?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Eric Lee    6 年前

    VDSO(7)不是syscall(2)的实现。 如果没有VDSO(7),系统调用将在用户空间应用程序中运行。在这种情况下会发生上下文切换。 如果使用VDSO(7),将在不切换上下文的情况下运行syscall。 内核使用vDSO自动映射到所有用户空间应用程序的地址空间。

        2
  •  1
  •   Basile Starynkevitch    6 年前

    仔细阅读手册页 syscalls(2) ,则, vdso(7) 和上的wikipages system calls VDSO .另请阅读 operating system wikipage和 Operating Systems: Three Easy Pieces (可免费下载)。

    系统调用是基本的,它们是 只有 方式a user-space 应用程序可以与操作系统交互 kernel signal(7) ).系统调用需要用户到内核的转换(例如通过 SYSCALL SYSENTER 机器 instruction on x86 )这在某种程度上是“昂贵的”(例如,可能需要一微秒)。

    VDSO只是一种聪明的优化(为了避免真正的系统调用的成本,对于像 clock_gettime(2) 它还以真正的系统调用形式存在),有点像内核神奇地提供的共享库,没有任何真正的文件。一些程序(例如静态链接的程序或不使用 libc 喜欢 BONES 或者可能 busybox )不要使用它。

    您可以避免VDSO(或者不使用它),而早期的内核没有VDSO。但您无法避免进行系统调用,而程序通常会进行大量调用。

    同时使用 strace(1)