Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ОС.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
194 Кб
Скачать
☆

Прерывания apc (Asynchronous Procedure Call)

Позволяют выполнять пользовательские приложения и системный код ОС в одном контексте (адресном пространстве) пользовательского процесса.

Замечание: APC ставятся в очередь и выполняются при IRQL уровне ниже DPC и на работу их также накладывается ограничение. APC, как и DPC, описываются управляющим APC-объектом ядра.

APC, ждущие своего выполнения, находятся в очереди, как и DPC. Очередь рассасывается ядром.

Замечание: поскольку APC (в отличие от DPC) специфичны для конкретного процесса, у каждого своя очередь APC. При запросе на постановку в APC очередь ядро помещает его в ту очередь, которая соответствует процессу. Ядро генерирует программное прерывание, которое выполняет APC при выполнении процесса.

APC, кроме того, бывают двух видов: режима ядра и пользовательского режима.

В первом случае для его выполнения в контексте процесса не нужно разрешения процесса. APC режима ядра прерывает процесс и выполняет процедуру без вмешательства или согласия процесса. APC режима ядра, в свою очередь, тоже бывает двух типов: обычные и специальные. Процесс может отключить все APC режима ядра, повысив уровень до APC level, либо процесс может отключить обычные, некоторые.

Замечание: исполнительная система использует APC режима ядра для тех задач ОС, которые нужно выполнить в контексте (адресном пространстве) конкретного процесса. Например, через специальный APC режима ядра может быть прекращено выполнение какого-нибудь системного сервиса. APC также применяется драйверами устройств. Например, если инициирован ввод-вывод и процесс переходит в ожидание окончания ввода-вывода, может быть инициирован другой процесс, причем он может быть выполнен в контексте прерванного процесса.

Диспетчеризация исключений

Примечание: исключения, в отличие от прерываний, есть следствия выполнения какой-либо программы.

В Windows вводят понятие структурной обработки исключений, которая называется Structured Exception Handling (SEH). Его задача: передача управления приложению для того, чтобы обработать или исправить исключение. Это позволяет строить обработку исключений таким образом, что она не зависит от конкретного языка программирования, т.е. строить на основе системного механизма.

Все исключения, как и прерывания, имеют предопределенные номера прерываний, которым соответствуют записи в IDT. Записи в IDT ссылаются на обработчики ловушек конкретных исключений.

В таблице на слайде 32 представлены номера прерываний, соответствующий некоторым исключениям. Все исключения, так же как и прерывания, обслуживаются диспетчером исключений (Exception Dispatcher). Задача его – подключить обработчик, который может справиться с данным исключением, например, исправить неправильный доступ к памяти, деление на ноль и др.

Следует помнить, что ядро обрабатывает почти все исключения прозрачно, т.е. невидимо для пользовательского приложения. Если исключение невозможно устранить, приложению возвращается код возврата, свидетельствующий об ошибке. Например, команда ассемблера при возврате из процедуры ret имеет возможность указать код завершения, например ret 4. Это значит, что при возврате в вызываемый модуль в регистре eax, например, будет находится 4.

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

Диспетчеризация исключений представлена на слайде 3. Если исключение возникает в пользовательском режиме, диспетчер исключений предпринимает следующие действия: сначала анализируется, существует ли порт отладки (слайд 33) и порт исключений. Они нужны для приема и выдачи сообщений исключений на экран. Примером исключений являются точки трассировки при отладке какой-либо программы. Если исключение произошло при работе отладчика, это один тип обработки исключений. Если процесс не работает при отладке, т.е. отладчик не может отработать исключение, некому, то диспетчер исключений вызывает процедуру поиска соответствующего фрейма. Все это дает как бы два предупреждения об исключении. Если вдруг отладчик не запущен и фреймы подходящие не найдены, просто ядро посылает соответствующее сообщение.