3. Системные вызовы

Представьте, что вы находитесь на большом концерте. Чтобы попасть из зоны общего доступа за кулисы, куда допускаются только избранные, вы не можете просто пройти. Вам потребуется специальный пропуск, который дает доступ через определенную охраняемую дверь. В мире вычислений системные вызовы — это и есть такие специальные пропуски.

Что такое системные вызовы?

Системные вызовы, часто сокращаемые как syscalls, предоставляют процессам в пользовательском пространстве способ напрямую запрашивать услуги у ядра. Ядро предоставляет набор услуг через API системных вызовов. Эти услуги необходимы для таких операций, как чтение или запись в файл, управление памятью или обработка сетевых соединений. Количество доступных системных вызовов фиксировано; вы не можете произвольно добавлять новые. Ваша система поддерживает таблицу системных вызовов (syscall table), где каждый системный вызов зарегистрирован с уникальным идентификатором.

Механизм системного вызова в Linux

Когда вы запускаете такую программу, как ls, код внутри нее не выполняет команду system call linux напрямую. Вместо этого он использует библиотечную функцию, которая действует как оболочка (wrapper). Эта функция-оболочка настраивает необходимые параметры, а затем инициирует программное прерывание, или «ловушку» (trap).

Эта ловушка сигнализирует процессору о необходимости переключиться из непривилегированного пользовательского режима в привилегированный режим ядра. Оказавшись в режиме ядра, управление берет на себя обработчик системного вызова. Он использует уникальный идентификатор для поиска запрошенной функции в таблице системных вызовов и затем выполняет ее. Например, системный вызов stat(), используемый для запроса статуса файла, находится и выполняется таким образом. После того как ядро завершает задачу, оно переключает контекст обратно в пользовательский режим и возвращает коду состояния вашему процессу, указывая на успех или ошибку.

Просмотр системных вызовов с помощью strace

Вы можете наблюдать системные вызовы, которые делает процесс, в режиме реального времени с помощью команды strace. Этот инструмент невероятно полезен для отладки и понимания того, как программа взаимодействует с ядром.

Чтобы увидеть системные вызовы, выполняемые командой ls, вы бы ввели:

strace ls

Это выведет подробный список каждого системного вызова, который ls выполняет во время своей работы.

Войдите, чтобы сохранить ваш прогресс обучения

Вход

Упражнения

Практика ведет к совершенству! Хотя внутренняя работа системных вызовов сложна, понимание того, как программы пользовательского пространства взаимодействуют с ядром, является фундаментальным. Лучший способ понять это взаимодействие — попрактиковаться с командами, которые выполняют эти базовые операции. Вот несколько практических лабораторных работ для закрепления вашего понимания взаимодействия с файловой системой, которое в значительной степени зависит от системных вызовов:

  1. Навигация по файловой системе в Linux — Попрактикуйтесь в использовании основных команд, таких как ls, cd и pwd, для перемещения и проверки вашей файловой системы Linux, напрямую взаимодействуя со службами файловой системы ядра.
  2. Управление файлами и каталогами в Linux — Научитесь создавать, удалять, копировать и перемещать файлы и каталоги с помощью таких команд, как mkdir, rm, cp и mv, каждая из которых задействует системные вызовы для выполнения своих действий.
  3. Поиск файлов и команд в Linux — Освойте методы поиска файлов и команд с помощью find, whereis и which, что еще раз демонстрирует, как пользовательские команды используют службы ядра для взаимодействия с файловой системой.

Эти лабораторные работы помогут вам применить концепции взаимодействия с файловой системой в реальных сценариях и укрепить уверенность в базовых операциях Linux, которые неявно полагаются на системные вызовы.

Тест

What is used to switch from user mode to kernel mode? Please answer in English, using two words.