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

События с автоматическим сбросом.

Освобождаются с помощью SetEvent(…), переходят в занятое состояние с помощью WaitForMultipleObjects(…), как только событие освобождается.

WaitForMultipleObjects(…);

.

.

.

SetEvent(…);

Для событий с автосбросом SetEvent(…) не используется.

Модули.

Модули – это версия в памяти кода данных и ресурсов исполняемого файла или dll. В каждом процессе имеется модуль для ехе файла, каждая dll – это модуль.

Если два или более процесса обращаются к одной dll они используют один и тот же модуль. Точно также, когда запущены 2 копии процесса, они используют один и тот же модуль.

Информация о модулях хранится в базе данных модуля. В Windows 95, 98, NT база данных модуля фактически представляет собой заголовок исполняемого файла. Любой процесс загружается в ВАП.

начало база данных

ехе файла модуля

При работе с модулями Win32 использует дескриптор модуля HMODULE.

GetModuleHandle(…) – получает дескриптор модуля, виртуальный адрес с которого загружается ехе или dll. Например для всех процессов, работающих под Windows 95, 98 это 00400000h.

База данных модуля находится в адресном пространстве процесса, кроме того, для оператив-ной работы с модулем W32 создаёт копию базы данных своей системной кучи.

ВАП

////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////

видны всем процессам

файл на диске

база данных

модуля

2 Гб

личная база данных модуля

начальный адрес

При работе с модулями возникают две проблемы:

  1. Проблема защиты информации, то есть создание закрытого адресного пространства для каждого процесса.

  2. Для оперативной работы ОС надо знать список всех загруженных модулей.

Эти проблемы решаются с помощью двух структур IMTE (Internal Module Table Entry) и MODREF – она поддерживает собственный список модулей для каждого процесса. И та и другая структуры находятся в системной куче ядра. Рассмотрим структуру IMTE.

таблица модулей IMTE

kernel32.dll

pModuleTableArray

user32.dll

gdi32.dll

my.exe

Начало таблицы модулей хранится в pModuleTableArray. Как только новый процесс или dll создаются, то kernel32 создаёт структуру IMTE, ищет свободный элемент в таблице модулей и записывает в него указатель на структуру IMTE. ОС сама следит за тем, чтобы не произошло заполнение таблицы модулей.

Лекция № 13 (26.04.02)

Структура imte.

  • Указатель на базу данных модуля, расположенного в куче kernel32.dll в области выше 2 Гб. Благодаря указателю kernel32 может получать информацию о любом модуле не переключаясь в контекст памяти.

  • Указатель на полное имя файла из которого был создан модуль. Память под полное имя модуля выделяется.

  • Указатель на строку с именем модуля. Этот указатель указывает внутрь предыдущей структуры.

  • Число символов в полном имени файла.

  • Число символов только в имени файла.

Зачем нужны эти два предыдущих поля? Например, функция GetModuleHandle с помощью указателя просматривает структуры IMTE и для ускорения поиска сравнивает длины запрашиваемого модуля и модуля в очередной структуре IMTE, если длины не совпадают, то сравнивать имена смысла не имеет.

  • Число разделов в модуле.

Например, раздел, содержащий данные, программный код и т.д.

  • Базовый адрес, по которому был запущен модуль.

  • Счётчик ссылок к модулю.

  • Счётчик числа ссылок в модуле, например, если какая-то программа была запущена на выполнение три раза, то для этой программы создаётся три объекта ядра процесса и одна база данных модуля.