Что такое __kernel_vsyscall? - PullRequest
       28

Что такое __kernel_vsyscall?

13 голосов
/ 05 декабря 2008

Я получил ядро, которое сильно отличается от того, которое я обычно получаю - большинство потоков находится в __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 ()

Что это значит?

EDIT: В частности, я обычно вижу много потоков в "pthread_cond_wait" и "___newselect_nocancel", и теперь они находятся на втором кадре в каждом потоке - почему это ядро ​​отличается?

Ответы [ 4 ]

26 голосов
/ 05 декабря 2008

__kernel_vsyscal - это метод, используемый linux-gate.so (частью ядра Linux) для выполнения системного вызова, используя самый быстрый доступный метод, предпочтительно инструкцию sysenter Это правильно объяснил Йохан Петерссон .

9 голосов
/ 05 декабря 2008

Когда вы делаете системный вызов (например, чтение из файла, разговор с оборудованием, запись в сокеты), вы фактически создаете прерывание. Затем система обрабатывает прерывание в режиме ядра, и ваш вызов возвращается с результатом. В большинстве случаев для вас непривычно иметь много потоков в системном вызове, если вы не делаете блокирующие вызовы, в этом случае это ожидается.

Более конкретно, это означает, что поток ожидает системного вызова на уровне ядра. Но это (к сожалению, для моих очков) уже в названии:)

2 голосов
/ 07 декабря 2008

В дополнение к уже приведенной хорошей ссылке на объяснение, что такое 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.

0 голосов
/ 27 августа 2009

Как сказал Адам, главная причина - производительность. Смотрите эту ссылку для некоторых старых номеров http://lkml.org/lkml/2002/12/9/13.

Если у вас есть ядро ​​с поддержкой vDSO, вы не используете прерывания для запуска системных вызовов, как сказал Стефан, потому что прерывания становились медленнее, чем все ядро ​​vDSO было добавлено в ядро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...