Операционные системы учебное пособие (1085734), страница 7
Текст из файла (страница 7)
Исключения в системах х86 и соответствующие им номера прерываний
Исключение | Номер прерывания |
0 | Divide Error (ошибка деления) |
1 | DEBUG TRAP (ловушка отладки) |
2 | NMI/NPX Error (ошибка NMI/NPX) |
3 | Breakpoint (точка прерывания) |
4 | Overflow (переполнение) |
5 | BOUND/Print Screen |
6 | Invalid Opcode (неправильный код операции) |
7 | NPX Not Available (NPX недоступен) |
8 | Double Exception (двойное исключение) |
9 | NPX Segment Overrun (выход за пределы сегмента NPX) |
A | Invalid Task State Segment (TSS) (неправильный TSS) |
B | Segment Not Present (сегмент отсутствует) |
C | Stack Fault (ошибка стека) |
D | General Protection (ошибка общей защиты) |
E | Page Fault (ошибка страницы) |
F | Зарезервировано Intel |
10 | Floating Point (ошибка в операции с плавающей точкой) |
11 | Alignment Check (ошибка контроля выравнивания) |
В отличие от прерываний, которые могут возникать в любой момент, исключения являются прямым следствием действий выполняемой программы. Windows вводит понятие структурной обработки исключений (structured exception handling, SEH), позволяющей приложениям получать управление при возникновении исключений. При этом приложение может исправить ситуацию, которая привела к исключению, провести раскрутку стека (завершив таким образом выполнение подпрограммы, вызвавшей исключение) или уведомить систему о том, что данное исключение ему не известно, и тогда система продолжит поиск подходящего обработчика для данного исключения.
В системах типа х86 все исключения имеют предопределенные номера прерываний, прямо соответствующие записям в ЮТ, ссылающимся на обработчики ловушек конкретных исключений.
Все исключения, кроме достаточно простых, которые могут быть разрешены обработчиком ловушек, обслуживаются модулем ядра — диспетчером исключений (exception dispatcher). Его задача заключается в поиске обработчика, способного «справиться» сданным исключением. Примерами независимых от архитектуры исключений могут служить нарушения доступа к памяти, целочисленное деление на нуль, переполнение целых чисел, исключения при операциях с плавающей точкой и точки прерывания отладчика.
Диспетчер объектов
Структура объектов
В Windows модель объектов позволяет получать согласованный и безопасный доступ к различным внутренним сервисам исполнительной системы. Диспетчер объектов (object manager) — компонент исполнительной системы, отвечающий за создание, удаление, защиту и отслеживание объектов.
В Windows существует два вида внутренних объектов: объекты исполнительной системы (executive objects) и объекты ядра (kernel objects). Первые реализуются различными компонентами исполнительной системы (диспетчером процессов, диспетчером памяти, подсистемой ввода-вывода и т. д.). Вторые являются более примитивными объектами, которые реализуются ядром Windows. Эти объекты, невидимые коду пользовательского режима, создаются и используются только в исполнительной системе.
Объекты исполнительной системы
Каждая подсистема окружения проецирует на свои приложения разные образы операционной системы. Объекты исполнительной системы и сервисы объектов — именно те примитивы, из которых подсистемы окружения конструируют собственные версии объектов и других ресурсов.
Как правило, объекты исполнительной системы создаются подсистемой окружения в интересах пользовательских приложений или компонентов операционной системы в процессе обычной работы.
Синхронизация
Концепция взаимоисключения (mutual exclusion) является одной из ключевых при разработке операционных систем. Ее смысл в следующем: в каждый момент к конкретному ресурсу может обращаться один — и только один — поток. Взаимоисключение необходимо, когда ресурс не предназначен для разделения или когда такое разделение может иметь непредсказуемые последствия.
Например, если бы два потока одновременно копировали данные в порт принтера, отпечатанный документ представлял бы собой нечитаемую мешанину. Аналогичным образом, если бы один поток считывал какой-то участок памяти, когда другой записывал бы туда данные, первый поток получил бы непредсказуемый набор данных. В общем случае доступные для записи ресурсы нельзя разделять без ограничений.
Рис. иллюстрирует, что происходит, когда два потока, выполняемые на разных процессорах, одновременно записывают данные в циклическую очередь.
Разделы кода, обращающиеся к неразделяемым ресурсам, называются критическими секциями (critical sections). В критической секции единовременно может выполняться только один поток.
Синхронизация ядра при высоком IRQL
Ядро должно гарантировать, что в каждый момент только один процессор выполняет код в критической секции. Критическими секциями ядра являются разделы кода, модифицирующие глобальные структуры данных, например базу данных диспетчера ядра или его очередь DPC. Операционная система не смогла бы корректно работать, если бы ядро не гарантировало взаимоисключающий доступ потоков к этим структурам данных.
Взаимоблокирующие операции
Спин-блокировки
Простейшая форма механизмов синхронизации опирается на аппаратную поддержку безопасных операций над целыми значениями и выполнения сравнений в многопроцессорной среде.
Спин-блокировки
Механизм, применяемый ядром для взаимоисключения в многопроцессорных системах, называется спин-блокировкой (spinlock). Спин-блокировка — это блокирующий примитив, сопоставленный с какой-либо глобальной структурой данных вроде очереди DPC
Взаимоблокирующие операции в исполнительной системе
-
Синхронизация при низком IRQL
-
Существует несколько дополнительных механизмов синхронизации, применяемых, когда спин-блокировки не годятся:
-
объекты диспетчера ядра (kernel dispatcher objects);
-
быстрые мьютексы (fast mutexes) и защищенные мьютексы (guarded mutexes);
-
блокировки с заталкиванием указателя (push locks);
-
ресурсы исполнительной системы (executive resources).
-
Компоненты исполнительной системы вне ядра также нуждаются в синхронизации доступа к глобальным структурам данных в многопроцессорной среде. Например, у диспетчера памяти есть только одна база данных блоков страниц. Обращение к ней осуществляется как к глобальной структуре данных, и драйверам устройств необходима гарантия получения монопольного доступа к своим устройствам. Вызывая функции ядра, исполнительная система может создать спин-блокировку, установить ее и снять.
Однако спин-блокировка лишь частично удовлетворяет потребности исполнительной системы в синхронизации, она применяется только при двух условиях:
-
требуется непродолжительное обращение к защищенным ресурсам без сложного взаимодействия с другим кодом;
-
код критической секции нельзя выгрузить в страничный файл, он не ссылается на данные в подкачиваемой памяти, не вызывает внешние процедуры (включая системные сервисы) и не генерирует прерывания или исключения.
Механизмы синхронизации режима ядра
Механизмы синхронизации режима ядра
Предоставляется драйверам устройств | Отключает Обычные АРС режима ядра доступ | Отключает Специальные АРС режима ядра | Поддерживает разделяемый и монопольный захват | Поддерживает Рекурсивный захват | |
Мьютексы диспетчера ядра | Да | Да | Нет | Да | Нет |
Семафоры диспетчера ядра | Да | Нет | Нет | Нет | Нет |
Быстрые мьютексы | Да | Да | Да | Нет | Нет |
Защищенные Мьютексы | Нет | Да | Да | Нет | Нет |
Блокировки с заталкиванием указателя | Нет | Нет | Нет | Нет | Да |
Ресурсы исполнительной системы | Да | Да | Нет | Да | Да |
LPC
LPC
LPC (local procedure call) — это механизм межпроцессной связи для высокоскоростной передачи сообщений. Он недоступен через Windows API напрямую и является внутренним механизмом, которым пользуются только компоненты операционной системы Windows. Вот несколько примеров того, где применяется LPC:
-
Windows-приложения, использующие RPC (документированный API), неявно используют и LPC, когда указывают локальный RPC — разновидность RPC, применяемую для взаимодействия между процессами в рамках одной системы.
-
Некоторые функции Windows API обращаются к LPC, посылая сообщения процессу подсистемы Windows.
-
Winlogon взаимодействует с процессом LSASS через LPC.
-
Монитор состояния защиты также взаимодействует с процессом LSASS через LPC.
Как правило, LPC используются для взаимодействия между серверным процессом и одним или несколькими клиентскими процессами. LPC-соединение может быть установлено между двумя процессами пользовательского режима или между компонентом режима ядра и процессом пользовательского режима.
LPC предусматривает три способа обмена сообщениями:
-
Сообщение длиной менее 256 байтов можно передать вызовом LPC с буфером, содержащим сообщение. Затем это сообщение копируется из адресного пространства процесса-отправителя в системное адресное пространство, а оттуда — в адресное пространство процесса-получателя.
-
Если клиент и сервер хотят обменяться данными, размер которых превышает 256 байтов, они могут использовать общий раздел, на который они оба спроецированы. Отправитель помещает данные в общий раздел и посылает получателю уведомление с указателем на область раздела, где находятся данные.
-
Если серверу нужно считать или записать данные, объем которых превышает размер общего раздела, то их можно напрямую считать из клиентского адресного пространства или записать туда. Для этого LPC предоставляет серверу две функции. Сообщение, посланное первой функцией, обеспечивает синхронизацию передачи последующих сообщений.
LPC экспортирует единственный объект исполнительной системы — объект «порт» (port object). Однако порты бывают нескольких видов:
-
Порт серверного соединения (server connection port) Именованный порт, служащий точкой запроса связи с сервером. Через него клиенты могут соединяться с сервером.
-
Коммуникационный порт сервера (server communication port) Безымянный порт, используемый сервером для связи с конкретным клиентом. У сервера имеется по одному такому порту на каждый активный клиент.
-
Коммуникационный порт клиента (client communication port)
-
Безымянный порт, используемый конкретным клиентским потоком для связи с конкретным сервером. Безымянный коммуникационный порт (unnamed communication port) Порт, создаваемый для связи между двумя потоками одного процесса.
Механизмы управления
Реестр
-
Просмотр и изменение реестра
-
Regedit и Regedt32
-
-
Использование реестра
-
В ходе загрузки системы
-
Explorer и некоторые другие Windows-компоненты
-
Приложения при запуске
-
Модификация реестра
-
При установки ПО
-
При установке драйвера
-
При изменении параметров через GUI
Логическая структура реестра
Логическая структура реестра
Корневой раздел | Описание |
HKEY_CURRENT_USER | Содержит данные сопоставленные с вошедшим пользователем в данный момент |
HKEY_USER | Хранит информацию обо всех учетных записях на компьютере |
HKEY_CLASSES_ROOT | Хранит сопоставления файлов и регистрационную информацию СОМ-объектов |
НКЕY_LOCAL_MACH1NЕ | Содержит информацию специфичную для системы |
HKEY_PERFORMANCE_DATA | Хранит сведения о производительности |
HKEY_CURRENT_CONFIG | Включает некоторые сведения о текущем профили оборудования |
Типы данных в реестре
Реестр - это база данных, структура которой аналогична структуре логического тома:
-
Содержит разделы и подразделы, корневые разделы
-
Параметры
Соглашение об именовании заимствовано у файловой системы