Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционные системы (лекции) (4 семестр).doc
Скачиваний:
9
Добавлен:
04.11.2018
Размер:
728.06 Кб
Скачать

Лекция №20 Динамически подключаемая библиотека (dynamic_link_library dll)

DLL – набор установленных функций. DLL представляет собой набор модулей исходного кода, в каждой из которых содержаться определенное число функций, которые могут вызвать как приложения, так и другая DLL.

Чтобы приложение могло вызвать функции, содержащиеся в DLL, образ её файла нужно спроецировать на адресное пространство вызывающего ее процесса. Это можно сделать за счет явного связывания за время выполнения при загрузке. После проецирования DLL на адресное пространство вызывающего процесса, все её функции достается всем потокам процесса. Когда поток вызывает какую- либо функцию из DLL, функция считывает параметры из стека потока. Любые созданные кодом DLL объекты принадлежат вызывающему потоку. Сама DLL ничем не владеет.

  1. Неявносвязывание: Самый распространенный и простой метод. Для создания DLL:

  1. Пишем заголовочный файл с прототипами функций, структурами и идентификаторами, которые будут экспортировать данные в DLL.

  2. Пишем на Си модуль исходного кода с телами функций.

  3. Компилируем, получаем объектный файл.

  4. Все объектные файлы собираются в один загруженный DLL – модуль, где двоичный код и глобальные переменные.

  5. Если компоновщик обнаружит, что DLL экспортирует хотя бы одну переменную или функцию, создается .LIB. В .LIB находится список символьных имен функций и переменных, экспортируемых из DLL.

  6. Во все модули исходного кода, где есть ссылки на внешнюю функцию, переменные, структуру данных или идентификатор, нужно включить заголовочные файлы.

После этого приложение на выполнение.

При запуске загрузчик выполняет следующие действия:

  1. Загрузчик ОС создает виртуальное адресное пространство для нового процесса и проецирует на него исполняемый модуль.

  2. Загрузчик анализирует отдел импорта, находит нужные DLL модули и проецирует на адресное пространство процесса.

  3. Поскольку DLL может импортировать функции из другой DLL, у неё может быть свой отдел импорта.

  4. Загрузчик просматривает отдел всего импорта каждой DLL и проецирует все DLL в адресное пространство процесса.

Явная загрузка DLL:

Проецирование DLL на адресное пространство.

Код приложения ссылается на идентификаторы, содержащиеся в DLL, и тем самым заставляет загрузчик неявно загружать DLL при запуске приложений.

  1. Явное связывание в период выполнения приложений.

Поток явно загружает DLL, получает адрес ………….и вызывает функцию по имеющемуся адресу. Это происходит при выполнении приложений.

2 функции:

MINSIANCE Load Library (PCISIR psz Path name)

MINSIANCE Load Library Ex (PCISIR psz Path name, HANDLE, hFile, Dword dw Flags)

Обе функции ищут образ DLL файла и пытаются спроецировать его на адресное пространство вызывающего процесса. Значение ……………………сообщает адрес виртуальной памяти, куда проецируют образ файла.

Параметры:

  • Имя (1 функция)

  • hFile (2 функция) – зарезервировано; через него можно передавать NULL

  • dw Flags – можно передавать либо 0, либо комбинацию флагов.

Флаги:

  1. DONT_ RESOLVE_ DLL_ REFERENDES (указывает системе спроецировать DLL на адресное пространство вызывающего процесса; проецируя DLL, система обычно вызывает из ……. DLL-main – с помощью этой функции инициализируется соответствующая библиотека; установка этого флага позволяет спроецировать DLL без обращения к DLL-main, проверки на загрузку дополнительной DLL не производиться)

  2. LOAD_ LIBRARY_ AS_DATAFILE (позволяет загрузить библиотеку с файлами данных. DLL-main не вызывается, DLL проецируется как файл данных (вызова DLL не происходит)

  3. LOAD_ WITH _ALTEREAD_SEARCH_PATH (изменяет алгоритм исполняемой функции при поиске DLL файла)

Алгоритм:

  1. каталог, заданный в первом параметре Pathname.

  2. текущий каталог процесса

  3. системный каталог WINDOWS

  4. основной каталог WINDOWS

  5. каталоги, перечисленные в переменном окружении.

Как только необходимость в DLL отпадает, её можно выгрузить из адресного пространства процесса.

Bool Free Library (HINSANCE hinds DLL)

Передаем тот параметр, который получили.

Чтобы получить явный адрес экспортируемого идентификатора (имя функции), существует вызов:

Far prog Get Prog Address (Hiwstance hinds DLL, PCISIR psz Symbol Name)

Symbol Name может быть указан в двух форматах:

  1. имя (например, HEYD)

  2. порядковый номер (например, 2)

В DLL может быть только одна функция входа – вызова. Используется для инициализации или очистки входа в DLL. Если инициализация не нужна, создавать необязательно.

Если нужно, то должна быть следующая:

H 300L WINAPI DLL MAIN (…)

{switch (fdw Reason)

case: DLL_PROCCESS_ATTACH

case: DLL_THREAD_ATTACH

case: DLL_ THREAD _DETACH

case: DLL_PROCCESS_DETACH}

DLL_PROCCESS_ATTACH вызывается только 1 раз; при вызове флажка будет выполняться инициализация.

DLL_THREAD_ATTACH – при создании нового потока система просматривает все DLL, спроецируемые на данный момент на адресное пространство данного процесса и…………………….

DLL_PROCCESS_DETACH – отключает, вызывается только 1 раз …………………. (DLL). Всю память очищают (инициализируют).