代码之家  ›  专栏  ›  技术社区  ›  naumcho

什么是__kernel_vsyscall?

  •  15
  • naumcho  · 技术社区  · 17 年前

    我得到了一个看起来与我通常得到的内核非常不同的内核——大多数线程都在__kernel_vsyscall()中:

      9 process 11334  0xffffe410 in __kernel_vsyscall ()
      8 process 11453  0xffffe410 in __kernel_vsyscall ()
      7 process 11454  0xffffe410 in __kernel_vsyscall ()
      6 process 11455  0xffffe410 in __kernel_vsyscall ()
      5 process 11474  0xffffe410 in __kernel_vsyscall ()
      4 process 11475  0xffffe410 in __kernel_vsyscall ()
      3 process 11476  0xffffe410 in __kernel_vsyscall ()
      2 process 11477  0xffffe410 in __kernel_vsyscall ()
      1 process 11323  0x08220782 in MyClass::myfunc ()
    

    这是什么意思?

    编辑: 特别是,我通常在“pthread_cond_wait”和“__newselect_nocancel”中看到很多线程,现在这些线程都在每个线程的第二帧上——为什么这个核心不同?

    4 回复  |  直到 17 年前
        1
  •  28
  •   Adam Rosenfield    17 年前

    __kernel_vsyscal 是linux-gate.so(linux内核的一部分)使用最快的可用方法进行系统调用的方法,最好是 sysenter 指令。这件事被恰当地解释为 Johan Petersson .

        2
  •  9
  •   Stefan Mai    17 年前

    当你进行系统调用(如读取文件、与硬件通信、向套接字写入)时,你实际上是在创建一个中断。然后,系统在内核模式下处理中断,您的调用将返回结果。大多数时候,系统调用中有很多线程是不寻常的,除非你正在进行阻塞调用,在这种情况下,这是意料之中的。

    更具体地说,这意味着线程正在等待内核级系统调用。但这(不幸的是,我的观点)已经在名字里了:)

        3
  •  2
  •   Employed Russian Employed Russian    17 年前

    除了已经给出的很好的链接来解释什么 linux-gate.so 是的,我想回答“为什么这个核心不同?”。最新(比2.5.68更新)的32位Linux系统使用VDSO页面(又名 linux-gate.so.1 ),64位系统也将很快启动(64位VDSO在内核2.6.24中引入)。

    如果你在旧系统上开发,或者用旧的glibc开发,那么你永远不会看到 __kernel_vsyscall() ,这要么是因为内核根本没有创建VDSO,要么是因为(旧的)glibc即使在VDSO存在的情况下也不使用它。

        4
  •  -1
  •   Paulo Henrique Silva    16 年前

    正如亚当所说,主要原因是性能。请查看此链接以获取一些旧号码 http://lkml.org/lkml/2002/12/9/13 .

    如果你有一个启用了vDSO的内核,你就不会像Stefan所说的那样使用中断来运行系统调用,实际上是因为中断变得越来越慢,整个vDSO都被添加到了内核中。