Представьте, что вы находитесь на большом концерте. Чтобы попасть из зоны общего доступа за кулисы, куда допускаются только избранные, вы не можете просто пройти. Вам потребуется специальный пропуск, который дает доступ через определенную охраняемую дверь. В мире вычислений системные вызовы — это и есть такие специальные пропуски.
Что такое системные вызовы?
Системные вызовы, часто сокращаемые как syscalls, предоставляют процессам в пользовательском пространстве способ напрямую запрашивать услуги у ядра. Ядро предоставляет набор услуг через API системных вызовов. Эти услуги необходимы для таких операций, как чтение или запись в файл, управление памятью или обработка сетевых соединений. Количество доступных системных вызовов фиксировано; вы не можете произвольно добавлять новые. Ваша система поддерживает таблицу системных вызовов (syscall table), где каждый системный вызов зарегистрирован с уникальным идентификатором.
Механизм системного вызова в Linux
Когда вы запускаете такую программу, как ls, код внутри нее не выполняет команду system call linux напрямую. Вместо этого он использует библиотечную функцию, которая действует как оболочка (wrapper). Эта функция-оболочка настраивает необходимые параметры, а затем инициирует программное прерывание, или «ловушку» (trap).
Эта ловушка сигнализирует процессору о необходимости переключиться из непривилегированного пользовательского режима в привилегированный режим ядра. Оказавшись в режиме ядра, управление берет на себя обработчик системного вызова. Он использует уникальный идентификатор для поиска запрошенной функции в таблице системных вызовов и затем выполняет ее. Например, системный вызов stat(), используемый для запроса статуса файла, находится и выполняется таким образом. После того как ядро завершает задачу, оно переключает контекст обратно в пользовательский режим и возвращает коду состояния вашему процессу, указывая на успех или ошибку.
Просмотр системных вызовов с помощью strace
Вы можете наблюдать системные вызовы, которые делает процесс, в режиме реального времени с помощью команды strace. Этот инструмент невероятно полезен для отладки и понимания того, как программа взаимодействует с ядром.
Чтобы увидеть системные вызовы, выполняемые командой ls, вы бы ввели:
strace ls
Это выведет подробный список каждого системного вызова, который ls выполняет во время своей работы.