API определен в заголовочном файле sysroot-*-kos/include/coresrv/io/irq.h
из состава KasperskyOS SDK.
API позволяет управлять обработкой аппаратных прерываний. Аппаратное прерывание – это сигнал процессору от устройства о необходимости немедленно переключиться с исполнения текущей программы на обработку события, связанного с этим устройством. Например, нажатие клавиши на клавиатуре вызывает аппаратное прерывание, которое обеспечивает требуемую реакцию на это нажатие (к примеру, ввод символа).
Аппаратное прерывание возникает при обращении устройства к контроллеру прерываний. Это обращение может осуществляться через линию аппаратного прерывания между устройством и контроллером прерываний или через память MMIO. Во втором случае устройство выполняет запись в память MMIO, вызывая прерывание MSI (англ. Message Signaled Interrupt).
В настоящее время функции для управления обработкой прерываний MSI не реализованы.
Каждой линии аппаратного прерывания соответствует одно прерывание с уникальным номером.
Сведения о функциях API приведены в таблице ниже.
Использование API
Чтобы связать прерывание с его обработчиком, нужно выполнить следующие шаги:
KnRegisterIrq()
.Одно прерывание можно зарегистрировать несколько раз в одном или нескольких процессах.
Дескриптор прерывания можно передать другому процессу через IPC.
KnIoAttachIrq()
.Этот шаг выполняется потоком исполнения, в контексте которого будет выполняться обработка прерывания.
Используя дескриптор, полученный при вызове функции KnRegisterIrq()
, можно привязать к прерыванию только один поток исполнения. Чтобы привязать к прерыванию несколько потоков исполнения в одном или нескольких процессах, нужно использовать разные дескрипторы этого прерывания, полученные при отдельных вызовах функции KnRegisterIrq()
. В этом случае функцию KnIoAttachIrq()
нужно вызывать с одними и теми же флагами в параметре flags
.
Дескриптор, полученный при вызове функции KnIoAttachIrq()
, нельзя передать другому процессу через IPC.
Чтобы запретить (маскировать) прерывание, нужно вызвать функцию KnIoDisableIrq()
. Чтобы разрешить (демаскировать) прерывание, нужно вызвать функцию KnIoEnableIrq()
. И хотя эти функции принимают дескриптор прерывания, через который к прерыванию привязан только один поток исполнения, их действие распространяется на все потоки исполнения, привязанные к этому прерыванию. Эти функции нужно вызывать вне потоков исполнения, привязанных к прерыванию. После регистрации прерывания и привязки к нему потока исполнения это прерывание не требуется демаскировать.
Чтобы инициировать отвязывание потока исполнения от прерывания, нужно вызвать функцию KnIoDetachIrq()
вне потока исполнения, привязанного к прерыванию. Отвязывание выполняет поток исполнения, привязанный к прерыванию, вызовом функции KnThreadDetachIrq()
, объявленной в заголовочном файле sysroot-*-kos/include/coresrv/thread/thread_api.h
. из состава KasperskyOS SDK.
Обработка прерывания
После выполнения привязки к прерыванию поток исполнения вызывает функцию Call()
, объявленную в заголовочном файле sysroot-*-kos/include/coresrv/syscalls.h
из состава KasperskyOS SDK. В результате этого вызова поток исполнения блокируется. При возникновении прерывания или вызове функции KnIoDetachIrq()
ядро KasperskyOS отправляет IPC-сообщение процессу, содержащему этот поток. Это IPC-сообщение содержит запрос на обработку прерывания или запрос на отвязывание потока исполнения от прерывания. Когда процесс получает IPC-сообщение, функция Call()
в потоке исполнения, привязанном к прерыванию, возвращает управление и предоставляет потоку содержимое IPC-сообщения. Поток исполнения извлекает из IPC-сообщения запрос и обрабатывает прерывание либо выполняет отвязывание от прерывания. Если выполняется обработка прерывания, то по ее завершении сведения об успехе или неуспехе обработки добавляются в ответное IPC-сообщение, которое отправляется ядру следующим вызовом функции Call()
в цикле.
При обработке прерывания нужно использовать функции IoGetIrqRequest()
и IoSetIrqAnswer()
, которые объявлены в заголовочном файле sysroot-*-kos/include/io/io_irq.h
из состава KasperskyOS SDK. Эти функции позволяют извлекать из IPC-сообщений и добавлять в IPC-сообщения данные для информационного обмена между ядром и потоком исполнения, привязанным к прерыванию.
Типовой цикл обработки прерывания включает следующие шаги:
IoSetIrqAnswer()
.Чтобы выполнить этот шаг, нужно вызвать функции Call()
. В параметре handle
требуется указать дескриптор, полученный при вызове функции KnIoAttachIrq()
. Через параметр msgOut
необходимо задать IPC-сообщение, которое будет отправлено ядру, а через параметр msgIn
необходимо задать IPC-сообщение, которое будет получено от ядра.
IoGetIrqRequest()
.Если запрос требует выполнить отвязывание от прерывания, то нужно выйти из цикла обработки прерывания и вызвать функцию KnThreadDetachIrq()
.
Дерегистрация прерывания
Чтобы дерегистрировать прерывание, нужно выполнить следующие шаги:
Чтобы выполнить этот шаг, нужно вызвать функцию KnThreadDetachIrq()
.
KnIoAttachIrq()
.Чтобы выполнить этот шаг, нужно вызвать функцию KnHandleClose()
. (Функция KnHandleClose()
объявлена в заголовочном файле sysroot-*-kos/include/coresrv/handle/handle_api.h
из состава KasperskyOS SDK.)
Чтобы выполнить этот шаг, нужно использовать функцию KnHandleClose()
и/или KnHandleRevoke()
, которые объявлены в заголовочном файле sysroot-*-kos/include/coresrv/handle/handle_api.h
из состава KasperskyOS SDK.
Одно прерывание может быть зарегистрировано несколько раз, а выполнение этих шагов аннулирует только одну регистрацию. Оставшиеся регистрации продолжают действовать. Каждую регистрацию одного прерывания нужно аннулировать отдельно.
Сведения о функциях API
Функции irq.h
Функция |
Сведения о функции |
---|---|
|
Назначение Регистрирует прерывание. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Привязывает вызывающий поток исполнения к прерыванию. Параметры
Возвращаемые значения В случае успеха возвращает Дополнительные сведения В параметре
|
|
Назначение Отправляет потоку исполнения запрос, в результате выполнения которого поток должен выполнить отвязывание от прерывания. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Разрешает (демаскирует) прерывание. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Запрещает (маскирует) прерывание. Параметры
Возвращаемые значения В случае успеха возвращает |