Какая связь между VDSO (7) и SYSCALL (2)? - PullRequest
0 голосов
/ 05 мая 2018

Из этот пост , я узнал

  • syscall - это стандартный способ входа в режим ядра на x86-64.
  • На практике в последних ядрах реализовано VDSO

Тогда я смотрю руководство, в http://man7.org/linux/man-pages/man2/syscall.2.html:

В первой таблице перечислены инструкции, используемые для перехода к ядру. режим (который может быть не самым быстрым или лучшим способом перехода к ядро, так что вам, возможно, придется обратиться к vdso (7)), регистр, используемый для указать номер системного вызова, регистр, используемый для возврата системы результат вызова и регистр, используемый для сообщения об ошибке .....

Но мне не хватает некоторых необходимых знаний, чтобы понять утверждения.

Верно ли, что VDSO (7) является реализацией syscall (2) или syscall (2) вызовет VDSO ( 7) для завершения системного вызова ?

Если это не так, какова связь между VDSO (7) и SYSCALL (2) ?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Внимательно прочитайте справочные страницы syscalls (2) , vdso (7) и вики-страницы по системным вызовам и VDSO, Читайте также операционная система wikipage и Операционные системы: три простых компонента (свободно загружается).

Системные вызовы являются фундаментальными, они являются только способом, которым пользовательское пространство приложение может взаимодействовать с операционной системой kernel и использовать предоставляемые им сервисы. Таким образом, каждая программа использует некоторые системные вызовы (если она не завершается сбоем и не завершается некоторым сигналом (7) ). Системные вызовы требуют перехода от пользователя к ядру (например, через SYSCALL или SYSENTER машина инструкция на x86 ), что несколько «дорого» (например, может занять микросекунду).

VDSO - это только умная оптимизация (чтобы избежать затрат на подлинный системный вызов, для очень немногих функций, таких как clock_gettime (2) , которые также существуют как подлинные системные вызовы), немного похоже на некоторые общие библиотека волшебным образом предоставлена ​​ядром без какого-либо реального файла. Некоторые программы (например, статически связанные или не использующие libc, например BONES или, вероятно, busybox ) не используют его.

Вы можете избежать VDSO (или не использовать его), и более ранние ядра не имели его. Но вы не можете избежать системных вызовов, и программы обычно делают их много.

Играйте также с strace (1) , чтобы понять (многие) системные вызовы, выполняемые приложением или запущенным процессом.

0 голосов
/ 05 мая 2018

VDSO (7) не является реализацией syscall (2). Без VDSO (7) syscall будет запускаться в приложениях пользовательского пространства. В этом случае произойдет переключение контекста. если использовать VDSO (7), будет запущен системный вызов без переключения контекста. Ядро автоматически отображается в адресное пространство всех приложений пользовательского пространства с помощью vDSO.

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