【问题标题】:What's the relationship between VDSO(7) and SYSCALL(2)?VDSO(7) 和 SYSCALL(2) 有什么关系?
【发布时间】:2018-10-15 13:49:56
【问题描述】:

this post学到了

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

然后我在http://man7.org/linux/man-pages/man2/syscall.2.html 中查找手册:

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

但我缺乏一些基本知识来理解这些陈述。

难道VDSO(7)syscall(2)的实现,还是syscall(2)会调用VDSO(7) 完成系统调用

如果不成立,VDSO(7)SYSCALL(2)是什么关系?

【问题讨论】:

    标签: c operating-system kernel system-calls


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,vongasy :P 看来我必须学习更深入。我准备好了!
    【解决方案2】:

    更仔细地阅读手册页syscalls(2)vdso(7) 以及system callsVDSO 上的维基页面。另请阅读operating system wikipage 和Operating Systems: Three Easy Pieces(可免费下载)。

    系统调用是基本的,它们是user-space 应用程序与操作系统kernel 交互并使用它提供的服务的唯一方式。所以每个程序都使用一些系统调用(除非它崩溃并被一些signal(7)终止)。系统调用需要用户到内核转换(例如通过SYSCALLSYSENTER 机器instruction on x86),这在某种程度上是“昂贵的”(例如可能需要一微秒)。

    VDSO 只是一个巧妙的优化(为了避免真正的系统调用的成本,对于像clock_gettime(2) 这样仍然作为真正的系统调用存在的极少数函数),有点像内核神奇地提供的一些共享库,没有任何真实文件。一些程序(例如静态链接的程序,或者不使用 libc 的程序,例如 BONES 或可能是 busybox)不使用它。

    您可以避免使用 VDSO(或不使用它),而早期的内核没有它。但是你不能避免做系统调用,程序通常会做很多。

    还可以使用strace(1) 了解应用程序或正在运行的进程完成的(许多)系统调用。

    【讨论】:

    • 感谢您的启发,这个问题实际上是从您刚刚提到的 ostep(第 6 章)提出的,虽然不是直接的。我对他们两个之间的关系了解很多。这是一个非常棒的答案:P
    • 哦,很抱歉,打错了,“如果你能来,我会感到荣幸”。
    猜你喜欢
    • 2013-11-25
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2021-03-18
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多