ции расширенной памяти LIM 4.0. Исходные страницы - логические
страницы, которые некоторым подмножеством стандартного размера
страниц спецификации расширенной памяти - 16Кбайт - были ведены
для обеспечения дополнительной гибкости оборудования и программ-
ного обеспечения расширенной памяти, способного поддерживать
меньшие размеры страниц. Например, менеджер расширенной памяти,
базирующийся на аппаратуре Intel 80386, мог бы поддерживать раз-
мер исходных страниц, равный 4Кбайт, обеспечивая надлежащим обра-
зом написанное программное обеспечение способностью управлять
расширенной памятью более эффективно, чем было бы возможно при
размере страниц в 16Кбайт. Менеджеры расширенной памяти специфи-
кации расширенной памяти 4.0, написанные для поддержки существую-
щих плат спецификации расширенной памяти, поддерживают идею ис-
ходных страниц тривиальным образом - размер исходной страницы
идентичен размеру стандартной страницы.
Исходные страницы размещаются с помощью функции 27, подфунк-
ции 1, "Разместить исходные страницы", спецификации расширенной
памяти. У функции 27 спецификации расширенной памяти также есть
подфункция 0, "Разместить стандартные страницы", которая обеспе-
чивает идентичную услугу для функции "Разместить страницы" специ-
фикации расширенной памяти LIM 3.2 с одним расширением: она поз-
воляет разместить нуль страниц для обработчика. Данное расширение
также имеет место для подфункции 1.
Адресация расширенной памяти
Адреса обычной памяти на процессорах Intel 80х86 (в режиме
реальных адресов) определяются парой 16-битовых компонент: значе-
- 7-34 -
нием сегмента, иногда именуемым селектором, и значением смещения
в байтах.
Формирование адреса элемента данных в расширенной памяти
несколько более сложное. Для начала, элементы данных в расширен-
ной памяти обладают логическим адресом из трех частей: номер об-
работчика, номер логической страницы и байтовым смещением в пре-
делах логической страницы. Кроме того, в отличие от элемента
данных в обычной памяти, положение которого остается постоянным с
момента размещения, физический адрес элемента данных в расширен-
ной памяти может меняться, так как он зависит от текущего состоя-
ния отображения системы расширенной памяти.
Эти характеристики делают задачу сохранения следа данных в
расширенной памяти двусторонней проблемой: управления логическими
адресами и управления физическими адресами.
Управление логическими адресами
Спецификация расширенной памяти LIM определяет обработчик как
16-битовую величину (даже когда поддерживается максимум 255 обра-
ботчиков) и номер логической страницы как 14-битовое число (логи-
ческие страницы нумеруются от 0 до 2047). Субадресация объектов
внутри логической страницы не имеет отношения к менеджеру расши-
ренной памяти, но является главной заботой разработчика приложе-
ния расширенной памяти. В особенности, данные какого типа следует
хранить в расширенной памяти и как ими следует управлять?
Общий метод сохранения следа элемента данных в расширенной
памяти без обращения к побитным трюкам требует от Вашей программы
обеспечивать три 16-битовые переменные на элемент - обработчик,
номер страниц и байтовое смещение внутри страницы. Эти накладные
расходы делают применение расширенной памяти наиболее пригодным
для запоминания структур данных, которые относительно велики по
сравнению с указателями, применяемыми для обращения к ним. Мало
смысла сохранять 4-байтовый элемент данных в расширенной памяти,
если при этом требуется 6-байтовый указатель для доступа к нему.
Еще одним фактором для рассмотрения является динамическое
поведение структур данных, которые Вы намереваетесь хранить в
расширенной памяти. Поддержание связного списка, состоящего из
элементов переменной длины могло бы быть интересным предложением,
если он размещается в расширенной памяти. Довольно сложная схема
управления памятью потребовалась бы для того, чтобы эффективно
уплотнять свободное пространство и обрабатывать переполнение,
когда размер списка превысит размер логической страницы.
В действительности, эффективные способы управления расширен-
ной памятью совершенно аналогичны методам поддержания файлового
буфера и индексации, применяемым системами управления базами дан-
ных. Существующая проблема является проблемой управления элемен-
тами данных переменного размера (записи, массивы и т.д.) в огра-
ниченном множестве буферов фиксированного размера (16-Кбайт в
случае спецификации расширенной памяти). Неудивительно, что неко-
торые программы баз данных для персональных компьютеров, совмес-
тимых с IBM PC, пользуются преимуществами данного сходства путем
хранения индексов файлов или, даже целых файлов, в расширенной
памяти, когда она имеется в наличии.
Потребовались бы значительные усилия для использования рас-
ширенной памяти в качестве средства управления памятью общего
назначения в Ваших программах. Однако, Вы можете эффективно ис-
пользовать расширенную память во многих обычных задачах сохране-
- 7-35 -
ния данных при простых специальных подходах. Примеры приложений,
перечисленные в конце данной главы показывают, какие относительно
несложные методы управления расширенной памятью достаточны для
обработки задач управления динамической памятью. Последующие раз-
делы в данной главе посвящены детальному рассмотрению нескольких
функций, добавленных в спецификации расширенной памяти LIM 4.0,
которые значительно сокращают усилия по программированию, необхо-
димые для работы с кодами и данными в расширенной памяти.
Управление физическими адресами
В спецификации расширенной памяти LIM 3.2 физический адрес
элемента данных в логической странице, которая в данный момент
отображается в физическую страницу, вычисляется по отношению к
базе 64-Кбайтного кадра страниц. Адрес сегмента для этого кадра
страниц получается посредством функции 2 "Получить адрес сегмен-
та кадра страниц", спецификации расширенной памяти. Деление раз-
мера кадра страниц на размер стандартной логической страницы дает
четыре физических страницы, пронумерованных от 0 до 3, которые
могут указываться в вызовах функции спецификации расширенной па-
мяти. Все четыре страницы являются смежными в памяти - адрес каж-
дой следующей на 16Кбайт выше, чем адрес предшествующей.
Спецификация расширенной памяти LIM 4.0, включающая в себя
идею многих, возможно несмежных, кадров страниц усовершенствован-
ной спецификации расширенной памяти AQA, делает вычисление физи-
ческого адреса или более простым или более сложным в зависимости
от Вашей точки зрения. В дополнение к функции 2 спецификации LIM
4.0 менеджер расширенной памяти может теперь обеспечить Вашу
программу таблицей номеров физических страниц и адресов сегмен-
тов, соответствующих каждой физической странице.
Функция 25, подфункция 1, "Получить отсчет элементов адресов
физической страницы", спецификации расширенной памяти возвращает
количество отображаемых физических страниц, поддерживаемых менед-
жером расширенной памяти. Используйте эту подфункцию для опреде-
ления размера массива, адрес которого передается функции 25, под-
функции 0, "Получить массив отображаемых физических адресов",
спецификации расширенной памяти, которая заполнит данный массив
адресами сегментов в нарастающем порядке и номерами соответствую-
щих страниц.
В то время как в спецификации расширенной памяти LIM 4.0 не
требуется от менеджера расширенной памяти обеспечивать более че-
тырех стандартных физических страниц, определенных в спецификации
3.2, менеджер расширенной памяти может обеспечивать до 36
16-Кбайтных физических страниц. До 12 страниц может размещаться в
пространстве между 768К и 960К (шестнадцатиричные адреса от С0000
до F0000) и до 24 страниц может размещаться между 256К и 640К
(шестнадцатиричные адреса от 40000 до A0000).
Доступ к кадру страниц над 640К возможен для любого приложе-
ния спецификации расширенной памяти. Доступ к отображаемой памяти
ниже 640К, на которую спецификация ссылается как на отображаемую
обычную память, предназначен для разработчиков расширений опера-
ционной системы, таких как Windows 2.0 фирмы Microsoft.
Количество физических страниц в кадре страниц над 640К может
изменяться в зависимости от раскладки пространства ПЗУ на конк-
ретной машине. Видеоадаптеры различных типов могут занимать су-
щественную долю пространства ПЗУ для своих дисплейных буферов.
Многие типы адаптеров ввода-вывода, включая сетевые платы и дис-
- 7-36 -
ковые контроллеры, содержат расширения ПЗУ BIOS, которые появля-
ются в адресном пространстве между C0000 и F0000.
Программные эмуляторы должны обычно размещать кадр страниц
спецификации расширенной памяти вне адресного пространства DOS,
ниже 640К, потому что у большинства компьютеров, совместимых с
IBM PC, нет ОЗУ между 640К и 960К. Некоторые программные эмулято-
ры спецификации расширенной памяти могут пользоваться преимущест-
вом возможности некоторых плат расширенной памяти отображать 64К
или более ОЗУ в пространство над 640К.
Опасно делать какие-либо упрощающие предположения о положе-
нии и выравнивании кадра страниц. Некоторые существующие приложе-
ния спецификации расширенной памяти делают такие допущения, пола-
гаясь на выравнивание кадра страниц, обычно обеспечиваемое
оборудованием спецификации расширенной памяти, для того чтобы
сохранить пространство памяти для указателей расширенной памяти
или для упрощения вычисления адресов в расширенной памяти. Одна-
ко, кадр страниц, обеспечиваемый чисто программными реализациями
менеджера расширенной памяти, может не обладать таким же выравни-
ванием, как кадр страниц платы спецификации расширенной памяти.
Для того чтобы позволить Вашим приложениям использоваться в сис-
темах с чисто программными менеджерами расширенной памяти, здесь
приводятся некоторые упрощающие допущения, которые Вам следует
избегать при программировании:
1. Поскольку аппаратура спецификации расширенной памяти
обеспечивает кадры страниц, выровненные на 16-Кбайтных границах,