Назад | Перейти на главную страницу

обработка программных прерываний ядра

Я читаю книгу о внутреннем устройстве Windows и кое-что не понимаю:

«Ядро обрабатывает программные прерывания либо как часть обработки аппаратных прерываний, либо синхронно, когда поток вызывает функции ядра, связанные с программным прерыванием».

Значит ли это, что программные прерывания или исключения будут обрабатываться только при следующих условиях:

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

Я правильно понимаю это?

Следующий бит:

«В большинстве случаев ядро ​​устанавливает внешние функции обработки прерываний, которые выполняют общие задачи обработки прерываний до и после передачи управления другим функциям, которые устанавливают прерывание».

Я не совсем понимаю, что это значит под «внешними функциями обработки ловушек» и «полем ловушки»?

Может кто-нибудь помочь мне?

Мне кажется, что программные прерывания обрабатываются либо A) в той же части кода ядра, что и аппаратные прерывания, либо B) ядро ​​ничего не делает в момент возникновения программного прерывания, но запомнит это прерывание произошло, и когда функция, связанная с программным прерыванием, будет вызвана, обработает прерывание.

В Windows есть нечто, называемое «отложенным вызовом процедур» (DPC), где основная часть обработки прерываний откладывается до удобного времени. Это происходит потому, что процессоры x86 имеют только одну линию IRQ, которая мультиплексируется внешним PIC или APIC. Когда инициируется IRQ, ЦП автоматически отключает IRQ до тех пор, пока процедура обслуживания прерывания не активирует их повторно. Но поскольку есть только одна строка IRQ, это означает, что когда IRQ отключены, это означает, что все IRQ отключены. Архитектура x86 имеет множество устройств, использующих IRQ, так что на самом деле это означает, что система (или, по крайней мере, этот конкретный процессор) является своего рода заложником, пока IRQ отключены. Таким образом, существует механизм DPC, обеспечивающий отключение IRQ на минимально необходимое время. В идеале ISR выполняет минимальный необходимый объем обработки перед повторным включением IRQ и перекладывает остальную работу на DPC.

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

Системные вызовы с использованием инструкции INT на языке ассемблера представляют собой программные прерывания (если Windows теперь не использует другой метод, например Linux с его уловкой linux-gate.so), а также исключения ЦП, включая ошибки страниц, деление на ноль,

Таким образом, все прерывания обрабатываются асинхронно в Windows и любой операционной системе, я думаю, по указанным выше причинам. Я не эксперт по ядру или что-то в этом роде, так что просто примите это как некоторую информацию.

Это пахнет домашним заданием, но я возьму его.

Для меня это звучит так, будто он говорит о том, что программные прерывания (которые, возможно, не то же самое, что исключения!) В недетерминированное время. По сути, ОС хочет быть эффективной и может обрабатывать их как часть другого прерывания (кажется, аппаратного) или когда вы входите в пространство ядра (скажем, делаете запрос ядра).

Что касается обработки прерываний во внешнем интерфейсе, это более или менее говорит о том, что ядро ​​выполняет выстрел до и после каждой обработанной ловушки. Например, некоторые из них не могут быть переданы в код пользователя, как бы вы ни старались. Ядро просто обрабатывает это и никогда не позволяет пользовательскому коду прикоснуться к нему. Другие могут быть столь же простыми, как настройка другого стека для обработки прерывания, а затем позволить пользовательскому коду нанести удар по нему. Если ни один из кодов пользовательского уровня не справится с этим, он в конечном итоге выполнит какое-то действие по умолчанию.