Как ядро ​​Linux обрабатывает прерывания

Мы предоставляем услуги удаленного администрирования серверов

Как ядро ​​Linux обрабатывает прерывания

Поделиться

Прерывания — неотъемлемая часть работы современных ЦП. Например, каждый раз, когда вы нажимаете клавишу на клавиатуре, процессор прерывается, чтобы ПК мог считывать ввод пользователя с клавиатуры. Это происходит так быстро, что вы не замечаете никаких изменений или ухудшения пользовательского опыта.

Более того, клавиатура — не единственный компонент, который может вызывать прерывания. В общем, существует три типа событий, которые могут вызвать прерывание ЦП: аппаратные прерывания , программные прерывания и исключения . Прежде чем перейти к различным типам прерываний, я определю некоторые термины.

Определения

Запрос прерывания ( IRQ ) запрашивается программируемым контроллером прерываний ( PIC ) с целью прерывания ЦП и выполнения процедуры обработки прерывания ( ISR ). ISR — это небольшая программа, которая обрабатывает определенные данные в зависимости от причины IRQ. Обычная обработка прерывается до завершения ISR.

В прошлом IRQ обрабатывались отдельным микрочипом — PIC — и устройства ввода / вывода подключались напрямую к PIC. PIC управлял различными аппаратными IRQ и мог напрямую общаться с CPU. Когда произошло прерывание, PIC записал данные в ЦП и поднял вывод запроса прерывания ( INTR ).

В настоящее время IRQ обрабатываются усовершенствованным программируемым контроллером прерываний ( APIC ), который является частью ЦП. Каждое ядро ​​имеет собственный APIC.

Типы прерываний

Как я уже упоминал, прерывания можно разделить на три типа в зависимости от их источника:

Аппаратные прерывания

Когда аппаратное устройство хочет сообщить ЦП, что определенные данные готовы к обработке (например, ввод с клавиатуры или когда пакет прибывает в сетевой интерфейс), оно отправляет IRQ, чтобы сигнализировать ЦП, что данные доступны. Это вызывает конкретную ISR, которая была зарегистрирована драйвером устройства во время запуска ядра.

Программные прерывания

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

Программные прерывания также важны, когда требуется возможность работы в реальном времени (например, в промышленных приложениях).

Исключения

Исключения — это тип прерывания, о котором вы, вероятно, знаете. Когда ЦП выполняет команду, результатом которой может быть деление на ноль или сбой страницы, любое дополнительное выполнение прерывается. В таком случае вы будете проинформированы об этом во всплывающем окне или увидев ошибку сегментации (дамп ядра) в выводе консоли. Но не каждое исключение вызвано ошибочной инструкцией.

Исключения можно разделить на Ошибки , Ловушки и Прерывания .

  • Ошибки:  Ошибки — это исключение, которое система может исправить, например, когда процесс пытается получить доступ к данным со страницы памяти, которая была перенесена на жесткий диск. Запрошенный адрес находится в адресном пространстве процесса, и права доступа правильные. Если страница отсутствует в ОЗУ, вызывается IRQ и запускается обработчик исключения сбоя страницы для загрузки нужной страницы памяти в ОЗУ. Если операция прошла успешно, выполнение продолжится.
  • Ловушки:  Ловушки в основном используются для отладки. Если вы устанавливаете точку останова в программе, вы вставляете специальную инструкцию, которая заставляет ее запускать ловушку. Ловушка может запускать переключение контекста, которое позволяет вашему отладчику читать и отображать значения локальных переменных. После этого казнь может быть продолжена. Ловушки также являются способом по умолчанию для выполнения системных вызовов (например, убийства процесса).
  • Прерывания:  прерывания вызваны отказом оборудования или несогласованными значениями в системных таблицах. При прерывании не указывается расположение инструкции, вызвавшей исключение. Это самые важные прерывания. Прерывание вызывает системный обработчик исключения прерывания , который завершает процесс, вызвавший его.

Получите практический опыт

IRQ упорядочены по приоритету в векторе APIC (0 = наивысший приоритет). Первые 32 прерывания (0–31) имеют фиксированную последовательность, определяемую ЦП. Вы можете найти их обзор на странице исключений OsDev . Последующие IRQ могут быть назначены по-другому. Таблица дескрипторов прерываний ( IDT ) содержит назначение между IRQ и ISR. Linux определяет вектор IRQ от 0 до 256 для назначения.

Чтобы распечатать список зарегистрированных прерываний в вашей системе, откройте консоль и введите:

cat /proc/interrupts

Вы должны увидеть что-то вроде этого:

Слева направо расположены следующие столбцы: вектор IRQ, количество прерываний на CPU ( 0 .. n), источник оборудования, информация канала источника оборудования и имя устройства, вызвавшего прерывание.

Внизу таблицы есть несколько нечисловых прерываний. Это прерывания, зависящие от архитектуры, такие как прерывание локального таймера ( LOC ) на IRQ 236. Некоторые из них указаны в векторном макете Linux IRQ в дереве исходных текстов ядра Linux.

Чтобы увидеть эту таблицу в реальном времени, запустите:

watch -n1 "cat /proc/interrupts"

Вывод

Правильная обработка IRQ важна для правильного взаимодействия оборудования, драйверов и программного обеспечения. К счастью, ядро ​​Linux действительно хорошо справляется со своей задачей, и обычный пользователь ПК почти ничего не заметит во всей обработке прерываний в ядре.

 2019-2020 © linuxadmins all rights reserved

Facebook Twitter Vkontakte