Можно ли как-то смоделировать аппаратные прерывания из пользовательской программы?
Я видел этот вопрос, отправленный много раз, но всегда не отвечал.
Я хочу знать о низкоуровневых прерываниях (например, смоделировать ситуацию, когда клавиша нажата на клавиатуре, чтобы драйвер клавиатуры прерывал прерывание).
События высокого уровня и API-интерфейсы выходят за рамки, и вопрос скорее теоретический, чем практический (для предотвращения дискуссий «почему» 🙂
И да и нет.
На процессоре 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
инструкции (то есть любое, кроме небольшого числа прерываний, предназначенных для связи с ядром) просто приведут к закрытию программы.
Итак, суть: да, аппаратное обеспечение поддерживает его, но аппаратное обеспечение также поддерживает его запрет, и почти каждая современная ОС делает именно это, по крайней мере, для большей части кода вне самого ядра ОС.
Других решений пока нет …