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