Стратегия системного вызова Linux через страницу vsyscall
Я читаю об управлении виртуальными машинами в Linux. По-видимому, для выполнения системного вызова есть страница 0xFFFFF000 на x86. называется vsyscall page. В прошлом стратегия вызова системного вызова заключалась в использовании int 0x80. Эта стратегия страницы vsyscall все еще использует int 0x80 под капотом, или она использует другую стратегию вызовов (например, код операции syscall?). Дополнительный вопрос: устарел ли метод int 0x80?
1 ответ
Если вы бежите ldd
в современном двоичном Linux вы увидите, что он связан с динамической библиотекой linux-vdso.1
(на amd64) или linux-gate.so.1
(на x86), который находится на этой странице vsyscall. Это общая библиотека, предоставляемая ядром, отображаемая в адресное пространство каждого процесса, которая содержит функции C, которые инкапсулируют особенности выполнения системного вызова.
Причиной такой инкапсуляции является то, что "предпочтительный" способ выполнения системного вызова может отличаться от одного компьютера к другому. Метод прерывания 0x80 всегда должен работать на x86, но последние процессоры поддерживают sysenter
(Intel) или syscall
(AMD) инструкции, которые намного эффективнее. Вы хотите, чтобы ваши программы использовали их, когда они доступны, но вы также хотите, чтобы один и тот же скомпилированный двоичный файл работал на процессорах Intel и AMD (и других), поэтому он не должен содержать кодов операций, специфичных для поставщика. linux-vdso
/linux-gate
библиотека скрывает эти решения для конкретного процессора за единообразным интерфейсом.
Для получения дополнительной информации см. Эту статью.