vDSO: почему Linux использует их только для функций, связанных со временем?
Просто искал в ядре Linux хуки vdso (например, нашел это на kernel.org), и в настоящее время он используется в основном для системных вызовов, связанных со временем. Это напоминает два вопроса:
- Есть ли какие-либо другие системные вызовы, которые планируется использовать интерфейс vDSO в ближайшее время?
- Действительно ли clock_gettime() становилось достаточно узким местом, чтобы мотивировать дизайн vDSO? Есть ли какое-то конкретное приложение, для которого это было полезно? Если да, то какое приложение и на сколько?
Просто казалось странным спроектировать новый интерфейс системного вызова ядра для просто временных поисков. Я предполагаю, что это помогает высокопроизводительным серверам для таких вещей, как отметка времени ответов на запросы и журналов. Но я хочу знать, есть ли у кого-то здесь более конкретные детали, чем просто догадки.
1 ответ
Причины появления vDSO
На руководства страницеvDSO говорится о причине создания этой специальной библиотеки:
Почему вообще существует vDSO? Ядро предоставляет некоторые системные вызовы, которые в конечном итоге часто используются в коде пользовательского пространства до такой степени, что такие вызовы могут доминировать над общей производительностью. Это связано как с частотой вызовов, так и с накладными расходами на переключение контекста, возникающими в результате выхода из пользовательского пространства и входа в ядро.
Дальнейшее чтение расскажет вам о различных стратегиях, используемых для обеспечения возможности обмена данными между ядром и пользовательским пространством. Особенно:
Эта информация также не является секретом - любое приложение в любом привилегированном режиме (root или любой непривилегированный пользователь) получит такой же ответ.
Примечание: выделено мной.
Это говорит нам о том, что данные, предлагаемые через этот интерфейс vDSO, должны быть общедоступными, к чему любой процесс, запущенный в системе, в любом случае будет иметь доступ. Очевидно, это очень важно.
Итак, напомним, у нас есть две причины / ограничения для добавления функций в vDSO:
- Функции должны предоставлять информацию, которая не является секретной.
- Функций нужно использовать настолько много, что действительно стоит перейти на vDSO
Доступные функции
Если вы посмотрите дальше на странице руководства vDSO, вы увидите списки функций, поддерживаемых различными реализациями (см. Раздел * ЗАМЕЧАНИЯ, ОСОБЕННЫЕ ДЛЯ АРХИТЕКТУРЫ). Это дает нам еще одну информацию: версию Linux, когда то или иное было реализовано / доступно. Самая первая доступная реализация была в Linux 2.5 (в конце 2001 года, обратите внимание, что это была версия для разработки, поэтому первой доступной для пользователя версией была версия 2.6.1 в 2003 году).
В vDSO находим следующие функции:
sigreturn
rt_sigreturn
sigtramp
sigtramp32
sigtramp_rt32
sigtramp_rt64
syscall_via_break
syscall_via_epc
vsyscall
get_syscall_map
lws_entry
linux_gateway_entry
gettimeofday
clock_gettime
clock_gettime64
clock_getres
time
getcpu
get_tbfreq
sync_dicache
sync_dicache_p5
flush_icache
getpid
getppid
set_tid_address
set_thread_pointer
datapage_offset
Итак, в целом мы видим призывы к:
- Сигнал
- Система / Ядро
- Время
- ЦП / кэш
- Процессы
Для процессоров x86 это в основном ограничено временем и процессором. В i386 также есть функции, связанные с сигналами.