Skip to content

Latest commit

 

History

History
27 lines (18 loc) · 6.11 KB

vdso.md

File metadata and controls

27 lines (18 loc) · 6.11 KB

vDSO

Источник: vDSO

vDSO (virtual dynamic shared object — виртуальный динамически подключаемый разделяемый объект) — механизм ядра, экспортирующий тщательно отобранный набор процедур пространства ядра в приложения пользовательского пространства, чтобы приложения могли вызывать эти процедуры ядра внутри собственного процесса — без накладных расходов на переключение режима с пользовательского на режим ядра, присущих вызову тех же процедур через интерфейс системных вызовов[1][2].

vDSO использует стандартные механизмы линковки и загрузки, то есть стандартный формат ELF (Executable and Linkable Format)[3][4]. vDSO — область памяти, выделяемая в пользовательском пространстве, которая открывает доступ к части функциональности ядра. vDSO выделяется динамически, обеспечивает повышенную безопасность за счёт рандомизации адресного пространства и поддерживает более четырёх системных вызовов. Некоторые стандартные библиотеки C, как, например, glibc, могут предоставлять ссылки vDSO так, что если ядро не поддерживает vDSO, выполняется обычный системный вызов[5]. vDSO помогает снизить накладные расходы вызова простых процедур ядра, а также может служить способом выбора оптимального метода системного вызова на некоторых архитектурах, например IA-32[6]. Преимущество перед другими методами в том, что такие экспортируемые процедуры могут предоставлять корректную отладочную информацию DWARF. Реализация обычно предполагает хуки в динамическом компоновщике для поиска vDSO.

vDSO был разработан, чтобы предоставить возможности vsyscall, преодолев его ограничения: небольшой объём статически выделенной памяти, допускающий лишь четыре системных вызова, и одинаковые адреса двоичного интерфейса приложений (ABI) в каждом процессе, что компрометирует безопасность. Проблема безопасности смягчена эмуляцией виртуального системного вызова, но эмуляция вносит дополнительную задержку[5].

В glibc есть поддержка vDSO для getrandom()[7].

Ссылки

  1. Enrico Perla; Massimiliano Oldani (16 декабря 2016). Kernel Hacking: Exploits verstehen, schreiben und abwehren (нем.). Franzis Verlag. С. 466–. ISBN 978-3-645-20503-0.
  2. "vDSO — overview of the virtual ELF dynamic shared object". Canonical. Архив оригинала от 4 марта 2016. Проверено 10 декабря 2015.
  3. "Creating a vDSO: the Colonel's Other Chicken". Linuxjournal.com. Проверено 16 февраля 2015.
  4. Corbet, Jonathan (8 июня 2011). "On vsyscalls and the vDSO". Lwn.net. Проверено 16 февраля 2015.
  5. "Community answer to question "What are vDSO and vsyscall?"". Проверено 19 ноября 2016.
  6. Drysdale, David (16 июля 2014). "Anatomy of a system call, part 2". Lwn.net. Проверено 19 ноября 2018.
  7. "sourceware.org Git — glibc.git/commit". sourceware.org. Проверено 13 ноября 2024.

Linux память vDSO