Системный вызов — определённый вход в ядро, через который код пользовательского пространства просит открыть файл, отобразить память, создать процесс, отправить сетевые данные или выполнить другую операцию. До выполнения ядро проверяет аргументы, учётные данные, состояние объектов и политику безопасности.
Ядро · Урок 3
Системные вызовы
Узнайте, как код пользовательского пространства вызывает службы ядра Linux и безопасно просматривать вызовы через `strace`.
Библиотеки и ABI системных вызовов
Приложения обычно вызывают функции библиотеки C, а не пишут специфичные архитектуре инструкции входа. Обёртка готовит регистры и память по ABI системного вызова, входит в ядро и преобразует результат в соглашение языка.
Соотношение функции и syscall не всегда один к одному:
- библиотечная функция может объединять несколько системных вызовов;
- некоторые функции полностью выполняются в пользовательском пространстве;
- оптимизированная функция vDSO получает отдельные данные ядра без полного перехода режима;
- один системный вызов поддерживает множество высокоуровневых API.
Что делает типичная обёртка системного вызова libc?
Вход в ядро и возврат
Обёртка помещает номер syscall и аргументы в определённые архитектурой места, затем выполняет инструкцию входа: например, syscall на x86-64 или svc на AArch64. Процессор переходит в настроенную привилегированную точку, а ядро диспетчеризует запрос.
После выполнения ядро возвращает значение или признак ошибки. Обёртки C обычно возвращают -1 и устанавливают локальный для thread errno. Другие языки и среды представляют ошибки иначе.
Называть каждый вход «программным прерыванием» неточно для современных архитектур: traps, быстрые инструкции syscall и supervisor calls реализуют связанные контролируемые переходы по-разному.
Кто проверяет аргументы и авторизацию системного вызова?
Номера и совместимость
Номера системных вызовов и соглашения вызова специфичны для архитектуры. Один символический вызов может иметь другой номер или компоновку структуры в другом ABI. Новые версии ядра добавляют вызовы, а стабильные пользовательские ABI стремятся сохранять существующее поведение.
Непривилегированный процесс не может вставлять произвольные обработчики в таблицу syscall работающего ядра. Расширение интерфейса требует кода ядра и тщательного проектирования ABI. Seccomp может фильтровать разрешённые вызовы процесса, но не создаёт новые реализации ядра.
Почему приложению не следует жёстко задавать номера syscall другой архитектуры?
Трассировка через `strace`
Проследите простую команду, сохранив вывод отдельно:
$ strace -o trace.log -- ls
При наличии разрешения следуйте дочерним процессам через -f или сузьте вывод выражением:
$ strace -f -e trace=%file -o trace.log -- command
strace может раскрывать пути, аргументы, данные из окружения, сетевые адреса, фрагменты файлов и ошибочно переданные через аргументы учётные данные. Храните трассы со строгими разрешениями и удаляйте по политике данных инцидента.
Что прежде всего наблюдает strace?
Осторожная интерпретация трасс
Трассировка меняет временное поведение и может значительно замедлять процесс. Неудачный вызов бывает ожидаемой пробой, а итоговая видимая ошибка может происходить из более ранней операции или политики приложения. Расшифровывайте файловые дескрипторы, следуйте связям процессов и сопоставляйте с журналами приложения.
Разрешения и политика безопасности ptrace ограничивают трассируемые процессы. Не подключайтесь к чужому или производственному процессу без разрешения: приостановки и изменение времени могут повлиять на службу.
Означает ли один неудачный syscall в трассе, что приложение сломано?
Урок завершён
Вы завершили Системные вызовы
Теперь вы можете проследить системный вызов от библиотечного API до проверенной работы ядра.
Отличать высокоуровневые функции от ABI syscall.
Связывать архитектурные инструкции входа с контролируемой диспетчеризацией ядра.
Считать номера и структуры syscall специфичными для архитектуры.
Использовать фильтрованный вывод
strace, защищая чувствительные данные.Интерпретировать ошибки и накладные расходы трассировки в контексте приложения.
Сохраните прогресс
Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.
Создать бесплатный аккаунт