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

Необработанные исключения

При запуске каждого процесса существует обработчик, который сообщает о необработанных исключениях. В Windows 2000 он включается по умолчанию. Пример сообщения представлен на слайде. Если ОС не может обработать исключение в приложении, то процесс не завершается, выдается сообщение с вопросом, что делать, и при нажатии ОК процесс завершается.

Поддержка отчетов об ошибках

Важной компонентой любой программы является диагностика (диагностические сообщения). В ОС Windows тоже предусмотрена компонента, которая называется Windows Error Reporting.

Перехватив необработанное исключение, фильтр или программа исполнительной системы начинает проверять, нужно ли запускать дополнительно для анализа Windows Error Reporting. Если в реестре по умолчанию установлен ноль и нет строки debugger, загружается в аварийный процесс специальная DLL, которая вызывает функцию Report Fail. На слайде 35 представлено окно с отчетом.

Диспетчеризация системных сервисов

Диспетчеризация системных сервисов начинает выполняться после инструкции, за которой закреплен процесс диспетчеризации. Инструкция зависит от типа процессора, на котором работает Windows.

Диспетчеризация 32-разрядных системных сервисов

Для процессоров x86 для начала процессов диспетчеризации использовалась инструкция int 46. В результате выполнения этой инструкции срабатывала ловушка и Windows заносит в таблицу IDT запись под номером 46 – указатель на диспетчер системных сервисов.

Ловушка переключает выполняемый поток в режим ядра и запускает процесс диспетчера системных сервисов. Каждый системный сервис имеет свой номер. Номер запрошенного по int 46 сервиса передается числом в регистре eax. Регистр ebx передает указатель (адрес) на список параметров для выполнения системного сервиса.

На процессорах x86 Pentium II и выше Windows использует другую инструкцию SysEnter (слайд 38). SysEnter – команда процессора, которую Intel ввел специально для быстрой диспетчеризации системных сервисов. Эта инструкция также переводит процесс в режим ядра и запускает диспетчер. Отличия: номер передается в eax, а список параметров – в edx.

Для возврата в пользовательский режим процесс-диспетчер выполняет функцию SysExit. На 32-разрядных процессорах AMD введена машинная команда SysCall, работает по аналогии с SysEnter. Возврат из системног сервиса осуществляется через команду SysRet.

На слайде 37 показано, как заносится номер системного сервиса 183 (B7) и в edx адрес параметров.

Диспетчеризация системных сервисов режима ядра

Ядро также использует номер системного сервиса и ищет его в таблице диспетчеризации системных сервисов SystemServiceDispatchTable. Это таблица другая, отличная от IDT, но сходна тем, что каждая запись – ссылка. Замечание: в режиме ядра номера системных сервисов могут отличаться от одного пакета обновления к другому.

Диспетчер системных сервисов PSystemService берет аргументы, которые соответствуют вызываемому сервису и записывают их в стек ядра. После этого они становятся доступны.

Замечание: у каждого потока есть указатель на таблицу системных сервисов. Windows позволяет поддерживать до 4-х таблиц системных сервисов. Диспетчер определяет, в какой таблице находится ссылка на запрошенный сервис.

Слайд 39 показывает, что номер системного вызова делится на части и транслируется в индекс таблицы и индекс внутри таблицы. Главная таблица (KeServiceDescriptorTable) определяет главные сервисы ОС, реализуемые в ntoskernel. Другая таблица, называемая Shadow включает сервисы, относящиеся к User и GDI, реализованные в win32k.sys.

Возможно в некоторых версиях Windows добавлять в эти таблицы новые сервисы.

Замечание: Windows Server 2003 не поддерживает добавление новых таблиц системных сервисов.

Инструкции для диспетчеризации сервисов исполнительной системы Windows хранятся в библиотеке nt.dll.

Подсистемы окружения вызывают из nt.dll функции для реализации сервисов. На слайде 41 показано, что функции, относящиеся к User и GDI и относящиеся к функциям ядра выполняются из разных библиотек. Например, Windows функция WriteFile вызывает функцию NTWriteFile из nt.dll. Она вызывает срабатывание ловушки системного сервиса и передает номер системного сервиса в NTWriteFile. Для режима USER и GDI диспетчер работает с Win32.sys.