linux-syscall-support
Набор заголовочных файлов, предоставляющий безопасные и переносимые обёртки для прямых системных вызовов Linux. Библиотека позволяет выполнять системные вызовы напрямую, минуя стандартную библиотеку C (libc), что полезно для низкоуровневых компонентов, рантаймов и инструментов, требующих минимальных зависимостей или полного контроля над взаимодействием с ядром.
Особенности
- предоставляет макросы и функции для прямых системных вызовов Linux;
- независима от стандартной библиотеки C (libc);
- безопасные обёртки с проверкой ошибок и поддержкой 64-битных аргументов;
- совместима с различными версиями ядра Linux.
Основные компоненты
LSS состоит из набора заголовочных файлов, которые определяют макросы и inline-функции для выполнения системных вызовов. Каждый системный вызов инкапсулирован в безопасную обёртку, скрывающую архитектурные различия (подробнее с документацией можно ознакомиться здесь).
Обёртки для системных вызовов
Библиотека предоставляет макросы и функции для наиболее часто используемых системных вызовов, таких как управление памятью, файловый ввод-вывод, управление процессами и сетевая коммуникация. Каждая обёртка гарантирует правильную передачу аргументов и обработку возвращаемых значений.
Основные системные вызовы:
sys_mmap(),sys_munmap()— управление памятью;sys_open(),sys_read(),sys_write(),sys_close()— файловый ввод-вывод;sys_brk()— изменение размера сегмента данных;sys_clone(),sys_exit(),sys_waitpid()— управление процессами;sys_socket(),sys_connect(),sys_sendto(),sys_recvfrom()— сетевая коммуникация;sys_rt_sigaction(),sys_rt_sigprocmask()— управление сигналами.
Поддержка множества архитектур
LSS включает реализации системных вызовов для различных архитектур процессоров, используя соответствующие соглашения о вызовах и номера системных вызовов. Это позволяет одному и тому же коду работать на разных платформах без изменений.
Поддерживаемые архитектуры:
- x86 (32-битный) с использованием
int 0x80илиsysenter; - x86-64 (64-битный) с использованием
syscall; - ARM (32-битный) с использованием
swiилиsvc; - ARM64 (AArch64) с использованием
svc; - MIPS (32-битный и 64-битный);
- PowerPC (32-битный и 64-битный).
Безопасные обёртки и обработка ошибок
Все обёртки LSS проверяют результат системного вызова и возвращают ошибки в стандартизированном формате. Это упрощает обработку ошибок и делает код более надежным.
Особенности безопасных обёрток:
- Проверка возвращаемых значений на ошибки;
- Установка
errnoв случае ошибки (если используется вместе с libc); - Поддержка 64-битных аргументов на 32-битных архитектурах;
- Гарантия атомарности операций, где это требуется;
- Корректная обработка сигналов и прерываний.
Совместимость с разными версиями ядра
LSS учитывает различия в системных вызовах между разными версиями ядра Linux, обеспечивая корректную работу как на старых, так и на новых системах. Это включает поддержку устаревших системных вызовов и использование более новых, когда они доступны.
Особенности совместимости:
- Автоматическое определение доступных системных вызовов;
- Поддержка устаревших интерфейсов для обратной совместимости;
- Использование расширенных системных вызовов (например,
preadv2,pwritev2) при наличии; - Учет различий в ABI между версиями ядра.