logo
ZH ос 20 вопр 36 стр

6.Объекты ядра. Процессы, потоки и модули в Win32.

Объекты kernel32.dll.

Объекты kernel32 являются ключевыми структурами данных ОС и находятся в куче, которой владеет kernel32. Например, в Windows 95,98 около 17 объектов, в Windows 2000 около 26 объектов. Примеры объектов: объект-процесс, объект-поток, объект-файл, объект-файл проецируемый в память, объект-семафор, объект-событие, объект-mutex, объект-почтовый слот, объект-сокет, объект-именованный программный канал.

Такая структура как модули не является объектом ядра. Каждый объект ядра начинается с заголовка. Он состоит из нескольких полей.

  1. Тип объекта. Заносится постоянная, характеризующая тип объекта. В зависимости от типа объекта интерпретируются другие поля.

  2. Счётчик ссылок на объект. Определяет, сколько раз программный код обращается к объекту. Когда оно станет равно 0, то ОС удаляет объект.

Модули Win32.

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

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

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

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

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

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

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

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

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

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

Рассмотрим структуру IMTE.

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

pModuleTableArray

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