Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АВМиС - бывшее АПЭВМ / apvem / всякаявсячина.doc
Скачиваний:
42
Добавлен:
15.09.2014
Размер:
670.72 Кб
Скачать

46. Библиотеки dll

Функции DLL пишутся в расчете на то, что их будет вызывать какое-то приложение (ЕХЕ- файл) или другая DLL. Чтобы приложение (или другая DLL) могло вызывать функции из DLL, исполняемый файл нужно сначала спроецировать на адресное пространство вызывающего процесса. Это делается либо неявной компоновкой при загрузке, либо явной — в период выполнения. Как только DLL спроецирована на адресное пространство вызывающего процесса, ее функции доступны всем потокам этого процесса. Фактически библиотеки при этом теряют почти всю индивидуальность: для потоков код и данные DLL — просто дополнительный код и данные, оказавшиеся в адресном пространстве процесса. Когда поток вызывает из DLL какую-то функцию, та считывает свои параметры из стека потока и размещает в этом стеке собственные локальные переменные. Кроме того, любые созданные кодом DLL объекты принадлежат вызывающему потоку или процессу — DLL в Win32 ничем не владеет.

Неявная компоновка(implicit linking) — самый распространенный метод проецирования образа DLL-файла на адресное пространство процесса. При сборке приложения компонов­щику нужно указать набор LIB-файлов. Каждый такой файл содержит список функций данной DLL, вызов которых разрешен приложениям (или другой DLL). Обнаружив, что приложение ссылается на функции, упомянутые в LIB-файле для DLL, компоновщик вне­дряет имя этой DLL в конечный исполняемый файл. При загрузке ЕХЕ - файла система про­сматривает его образ на предмет определения необходимых ему DLL, после чего пытается спроецировать их на адресное пространство процесса. Поиск DLL осуществляется в :

1. каталоге, содержащем ЕХЕ - файл;

2. текущем каталоге процесса;

3. системном каталоге Windows;

4. основном каталоге Windows;

5. каталогах, указанных в переменной окружения PATH.

Если файл DLL не найден, система открывает окно с сообщением и немедленно завершает процесс.

Библиотеки, спроецированные на адресное пространство этим методом, не отключаются от него до завершения процесса.

Явная компоновка

Образ DLL-файла можно спроецировать на адресное пространство процесса явным образом для чего один из потоков должен вызвать либо LoadLibrary, либо LoadLibraryEx:

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

 

47.Виртуальная память процессора

Процессор i80286 может непосредственно адресовать до 16 мегабайт физической памяти, однако реально компьютеры редко имеют оперативную память такого размера. Обычный размер оперативной памяти для IBM AT составляет 2-4 мегабайта. Механизм виртуальной памяти, реализованный в процессоре i80286, позволяет организовать память большого размера с использованием относительно небольшой физической оперативной памяти и дисковой памяти. Основная идея - хранение (и обновление) содержимого большой виртуальной памяти на диске, подкачивая отдельные участки виртуальной памяти в реальную оперативную память по необходимости. Процесс "подкачки" сегментов с диска в память и их выгрузки после изменения на диск называется свопингом. Операционная система должна вести учёт сегментов и знать, какие сегменты находятся в памяти, а какие - на диске. Процессор i80286 может оказать ей в этом существенную помощь. Последние два поля дескриптора - бит присутствия сегмента в памяти P и бит обращения к сегменту памяти A - предназначены для аппаратной реализации учёта сегментов. Бит P должен быть установлен в 1 для тех сегментов, которые находятся в физической памяти. Сегменты, временно отсутствующие в памяти и находящиеся на диске, помечаются в дескрипторе битом P, сброшенным в 0. Установкой и сбросом бита P занимается операционная система. А вот проверка этого бита - работа для процессора. Когда программа обращается к отсутствующему в физической памяти сегменту (загрузкой селектора в сегментный регистр), выполнение программы прерывается и управление передаётся операционной системе. Та, в свою очередь, подкачивает нужный сегмент в оперативную память и устанавливает для него бит P в 1, после чего работа программы возобновляется. Время от времени операционная система должна находить сегменты, к которым было обращение, и в случае их изменения сбрасывать на диск. Кроме того, если для закачки нового сегмента в физической памяти недостаточно свободного места, можно выгрузить самые старые сегменты из физической памяти на диск и на их место загрузить новый сегмент. Процессор может оказать помощь операционной системе в определении тех сегментов, к которым было обращение. Для этих сегментов бит обращения A устанавливается процессором в 1. Сбросить бит обращения можно только из программы, поэтому такая работа возлагается на саму операционную систему. Недостаток: так как все сегменты имеют разные размеры, и все они подкачиваются по очереди в одну область физической памяти, возможно возникновение фрагментации физической памяти. Операционная система может выполнить перемещение сегментов в физической памяти, изменив соответствующим образом 24-битовые базовые адреса сегментов в таблицах дескрипторов. После перемещения сегментов можно объединить все свободные участки памяти в один и использовать этот участок для загрузки нового сегмента. Так как программы защищённого режима не знают физических адресов памяти (они работают только с селекторами), перемещение сегментов никак не отразится на их работе.