Системные вызовы
100%

Ядро · Урок 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, защищая чувствительные данные.

  • Интерпретировать ошибки и накладные расходы трассировки в контексте приложения.

Сохраните прогресс

Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.

Создать бесплатный аккаунт
Следующий Урок
Назад к Ядро