Отправить прерывание на процессор, как клавиатура?

Можно ли как-то смоделировать аппаратные прерывания из пользовательской программы?
Я видел этот вопрос, отправленный много раз, но всегда не отвечал.

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

События высокого уровня и API-интерфейсы выходят за рамки, и вопрос скорее теоретический, чем практический (для предотвращения дискуссий «почему» 🙂

3

Решение

И да и нет.

На процессоре x86 (для одного примера) есть int инструкция, которая генерирует прерывание. Как только прерывание сгенерировано, процессор не обязательно1 различать прерывания, генерируемые аппаратным обеспечением, и прерывания, генерируемые программным обеспечением. Например, в исходном BIOS компьютера IBM выбрала прерывание, которое заставило бы выполнить команду print-screen. Выбранное ими прерывание (прерывание 5) было тем, которое тогда не использовалось, но, по словам Intel, было зарезервировано для будущего использования. В конечном итоге Intel использовала это прерывание — в 286 они добавили bound инструкция, которая проверяет, что значение находится в пределах границ, и генерирует прерывание, если это не так. bound инструкция по существу никогда не используется, потому что она генерирует прерывание 5, если значение выходит за пределы. Это означает (если вы используете что-то вроде MS-DOS, которое позволяет это), выполнить bound инструкция со значением, выходящим за пределы, выведет экран на экран.

Однако в современных ОС это обычно не разрешается. Вся генерация и обработка прерываний происходит в ядре. Аппаратное обеспечение имело 4 уровня защиты («кольца») и поддержку для определения кольца, на котором int Инструкция может быть выполнена. Если вы попытаетесь выполнить его из кода, запущенного на кольце 3, он не будет выполняться напрямую — вместо этого выполнение переключится на ядро ​​ОС, которое может обрабатывать его по своему выбору.

Это позволяет (например) Windows эмулировать MS-DOS, поэтому программы MS-DOS (которые делать использовать int Инструкция) может выполняться на виртуальной машине с виртуализированным вводом и выводом, поэтому, даже если они «думают», что работают напрямую с клавиатурой и оборудованием экрана, они фактически используют их эмуляцию, предоставляемую программным обеспечением.

Однако для «нативных» программ используется большинство int инструкции (то есть любое, кроме небольшого числа прерываний, предназначенных для связи с ядром) просто приведут к закрытию программы.

Итак, суть: да, аппаратное обеспечение поддерживает его, но аппаратное обеспечение также поддерживает его запрет, и почти каждая современная ОС делает именно это, по крайней мере, для большей части кода вне самого ядра ОС.


  1. Хотя при использовании стандартного аппаратного обеспечения обработчик прерываний может считывать данные из микросхемы программируемого контроллера прерываний (PIC), которая сообщает ему, произошло ли прерывание через PIC (то есть аппаратное прерывание) или нет (программное прерывание). Большая часть оборудования также поддерживает по крайней мере несколько прерываний, которые могут генерироваться только оборудованием, таким как NMI на x86. Они обычно зарезервированы для довольно узкого использования (например, NMI на ПК обычно используется для таких вещей, как ошибки четности памяти).
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]