Вы когда-нибудь задумывались, откуда ваш компьютер знает, что делать, когда вы нажимаете enter на клавиатуре или подключаете USB-накопитель? Это два распространенных примера обработки аппаратных прерываний, ключевого механизма ядра Linux практически в каждом взаимодействии между внутренними процессами и обмене данными между внешними устройствами. В этой статье мы рассмотрим, как обрабатываются прерывания в операционной системе Linux, начиная с того, что это такое и какую роль они выполняют.
Что такое прерывания?
Прерывания – это события, которые приостанавливают выполнение программ для выполнения других задач. Существуют аппаратные и программные прерывания, отправляемые либо аппаратными устройствами— либо определенными процессами, запущенными в операционной системе. Программируемый контроллер прерываний (PIC) отправляет запрос на прерывание (IRQ) в центральный процессор и выполняет процедуру обслуживания прерываний (ISR). Затем текущий процесс прерывается до завершения ISR.
Обработчики прерываний
Обработчик прерываний в ядре выполняет несколько запросов ISR. ISR обрабатывает событие запроса (аппаратное или программное прерывание), затем отправляет его в центральный процессор, приостанавливая активный процесс. По завершении ISR центральный процессор возобновит процесс. Обработка прерываний – самая сложная задача, управляемая ядром Linux. При обработке прерываний могут возникать различные проблемы:
- Прерывания могут возникать в любое время, обычно известные как асинхронные прерывания.
- Ядру Linux может потребоваться обработать новое прерывание, когда оно обрабатывает предыдущее. В этом случае ядро будет использовать подход first in, first out (FIFO).
- При непрерывном возникновении нескольких прерываний ядро должно отключать жизненно важные части, чтобы предотвратить серьезные проблемы, такие как ошибки прерывания (сбои в аппаратных устройствах, таких как CPU или RAM) или системные сбои, возникающие в результате программных ошибок или проблем ввода-вывода).
Основная роль прерываний
Операционные системы полагаются на сигналы для связи с аппаратными устройствами или между процессами. Вот где появляются прерывания: прерывание – это просто сигнал, который позволяет операционной системе знать, какие действия она должна предпринять, чтобы гарантировать, что система может взаимодействовать с внешним миром или своими внутренними процессами.
Типы прерываний
Ядро Linux должно обрабатывать три вида прерываний: программные прерывания, аппаратные прерывания и исключения.
Программные прерывания
Программные прерывания позволяют различным процессам, запущенным в системе, взаимодействовать друг с другом. Допустим, есть приложение с функцией удаления всех данных кэширования из браузера. Когда приложение пытается удалить данные кэширования, некоторые данные все равно будут использоваться браузером.
Прерывание блокирует удаление приложением данных кэширования в подобных случаях. Программные прерывания являются фундаментальной особенностью вычислений и частью встроенного в ядро процесса, который выполняется при загрузке компьютера.
Аппаратные прерывания
Устройства используют аппаратные прерывания для взаимодействия с центральным процессором. Если центральный процессор доступен, он приостанавливает текущий поток и выполняет задание по обработке прерываний для устройства. Например, системным администраторам необходимо ввести токен аутентификации, чтобы войти на рабочий сервер и обновить таблицу пользователей в базе данных MySQL.
Токен извлекается с устройства-токена, которое часто используется системными администраторами. Перед вводом токена системный администратор будет просматривать только экран входа в систему. После ввода токена аутентификации система проверяет его, и системный администратор может затем получить доступ к серверу для обновления таблицы пользователей. Благодаря тому, что ядро обрабатывает аппаратное прерывание, производственный сервер может немедленно проверить, действителен ли ввод токена.
Типы аппаратных прерываний
Аппаратные прерывания можно разделить на два типа:
Маскируемый
- Может быть отложено, отключено или проигнорировано в зависимости от его приоритета
- Используется с периферийными устройствами
- Может быть векторным или невекторным
Немаскируемый
- Требуется для немедленных действий при их возникновении
- Используется в чрезвычайных ситуациях, например, при отключении электроэнергии
- Может быть только векторным
Исключения
Когда центральный процессор выполняет команду, которая приводит к сбою, дополнительное выполнение прерывается. Если это происходит, появится окно предупреждения или в выводе консоли отобразится журнал ошибок трассировки стека.
Существует три типа исключений:
- Ошибки: Это некритические ошибки, и процесс может возобновиться в обычном режиме после их устранения.
- Прерывания: Это серьезные ошибки, которые не позволяют системе продолжить определенные процессы, возникающие в результате таких проблем, как физическое повреждение оперативной памяти или центрального процессора или неправильная конфигурация системы.
Как ядро обрабатывает аппаратные прерывания?
Прерывание является высокоприоритетной задачей, и ядро также должно обрабатывать его как можно быстрее, чтобы другим запущенным процессам не пришлось ждать слишком долго. Вот почему ядро Linux обрабатывает аппаратные прерывания в два этапа: сначала выполняется процесс, наиболее важный для ответа на прерывание, за которым следует менее срочный.
Можно ли избежать аппаратных прерываний?
Аппаратные прерывания позволяют аппаратному устройству взаимодействовать с операционной системой. Однако иногда аппаратные прерывания могут вызывать серьезные проблемы для производственного сервера. Например, сервер может выполнять сложные задачи подсчета для приложения с большими данными.
В этом сценарии аппаратные прерывания могут остановить процесс, не позволяя ему возобновиться. К счастью, существуют способы избежать аппаратных прерываний.
Маскируемые прерывания
Маскируемые прерывания можно включать или выключать, изменяя конфигурацию их флага. Например, в сборке x86 аппаратные прерывания можно отключить, установив значение флага прерывания равным 0.
Устройства также можно отключить, чтобы помешать им подключаться к производственному серверу. Например, чтобы отключить подключение устройств через USB в дистрибутиве Ubuntu, запустите следующую командную строку:
chmod 700 /usr/lib/gvfs/gvfsd-mtp
chmod 700 /usr/lib/gvfs/gvfsd-afc
Немаскируемые прерывания
К сожалению, можно отключить только маскируемые прерывания, чтобы избежать аппаратных прерываний; немаскируемых прерываний избежать невозможно.
Заключение
Обработка аппаратных прерываний – одна из важнейших задач ядра Linux. Понимание того, как Linux обрабатывает аппаратные прерывания, упростит работу и ускорит устранение неполадок. Более того, можно предотвратить критические проблемы, такие как высокая загрузка процессора, сбой приложений или даже потеря данных.