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

什么是内核vsyscall?

  •  12
  • naumcho  · 技术社区  · 16 年前

    我得到了一个与我通常得到的内核非常不同的内核-大多数线程都在uu 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 回复  |  直到 16 年前
        1
  •  28
  •   Adam Rosenfield    16 年前

    __kernel_vsyscal 是linux-gate.so(linux内核的一部分)使用最快的可用方法(最好是 sysenter 指示这件事已被适当地解释了 Johan Petersson .

        2
  •  9
  •   Stefan Mai    16 年前

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

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

        3
  •  2
  •   Employed Russian Employed Russian    16 年前

    linux-gate.so 我想回答“为什么这个核心不同?”。最新(比2.5.68更新)的32位Linux系统使用VDSO页面(又名 linux-gate.so.1

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

        4
  •  -1
  •   Paulo Henrique Silva    15 年前

    正如亚当所说,主要原因是表现。请参阅此链接了解一些旧号码 http://lkml.org/lkml/2002/12/9/13

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