C++ 什么是内核vsyscall?

C++ 什么是内核vsyscall?,c++,gdb,C++,Gdb,我得到了一个与我通常得到的内核非常不同的内核-大多数线程都在uu kernel_vsyscall()中: 这是什么意思 编辑: 特别是,我通常在“pthread\u cond\u wait”和“\uuuuuu newselect\u nocancel”中看到很多线程,现在它们位于每个线程的第二个帧上——为什么这个核心不同呢?当您进行系统调用(比如读取文件、与硬件对话、写入套接字)时,实际上是在创建中断。然后系统在内核模式下处理中断,您的调用返回结果。大多数情况下,系统调用中有大量线程是不寻常的,

我得到了一个与我通常得到的内核非常不同的内核-大多数线程都在uu kernel_vsyscall()中:

这是什么意思

编辑:
特别是,我通常在“pthread\u cond\u wait”和“\uuuuuu newselect\u nocancel”中看到很多线程,现在它们位于每个线程的第二个帧上——为什么这个核心不同呢?

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


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

\u kernel\u vsyscal
是linux-gate使用的方法。因此(linux内核的一部分)使用可用的最快方法,最好是
syscenter
指令进行系统调用。除了已经给出的关于什么是
linux-gate的好链接之外,

正确地解释了这一点。因此,
是,我想回答“为什么这个核心不同?”。最新(比2.5.68更新)的32位Linux系统使用VDSO页面(aka
Linux gate.so.1
),64位系统也将很快启动(64位VDSO在内核2.6.24中引入)


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

正如Adam所说,主要原因是性能。请参阅此链接了解一些旧号码


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

详细回答如下:链接中的文章不见了:(是回答时最新的快照:(我的桌面Waterbox抛出了一个XML解析错误,但其他浏览器看得很好)。
  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 ()