Расширенная память (Extended Memory)
Термин Extended memory относится к тому же пространству памяти, которое описано в предыдущем разделе, но обозначает другой способ доступа, а именно, непосредственную работу с его адресами. Такой способ доступа возможен при работе микропроцессора в защищенном режиме (protected-address mode). Напомним, что свое название режим получил потому, что микропроцессор контролирует адреса при любых обращениях к внешним устройствам, в том числе и к оперативной памяти.
Начиная с модели Intel 386, в защищенном режиме микропроцессоры оперируют 32-разрядными адресами, что соответствует пространству в 4 Гбайт или 4096 Мбайт. Это очень большое пространство, для рационального использования и контроля допустимости адресов оно делится на страницы размером по 4 Кбайт. Учитывая, что реальный объем оперативной памяти намного меньше 4 Гбайт, предусмотрен механизм подкачки страниц.
Как и при работе в реальном режиме, адрес ОЗУ состоит из двух частей, одна из которых находится в сегментном регистре, а другая – в индексных регистрах, регистрах указателях или в регистрах общего назначения. Отличие в том, что доступное пространство может быть больше чем 65 536 байтов, но оно всегда ограничено конкретной величиной, иначе будет невозможен контроль адресов. Также изменяется содержимое сегментных регистров (cs, ds, es, fs, gs, ss), в них кроме кода сегмента хранятся его характеристики, необходимые микропроцессору для контроля адресов.
DOS сама не использует и не поддерживает выполнение прикладных задач в защищенном режиме. Тем не менее задача может самостоятельно перевести микропроцессор в защищенный режим, а после выполнения, восстановить реальный режим перед возвратом в DOS. Однако в таком случае в ней придется выполнять много специфических действий, которые обычно возлагаются на операционные системы. Для выполнения таких действий предназначены расширители (DOS extenders), которые подключаются к прикладной задаче и создают на время ее выполнения вычислительную среду, необходимую для работы в защищенном режиме. Наиболее известными из них являются DOS4GW, DOS32A, PMODE/W.
В некоторых случаях DOS и служебные программы все же переключаются в защищенный режим для использования Extended memory. Поэтому BIOS выполняет простейшую форму поддержки работы в защищенном режиме. В данном разделе приведена ее краткая характеристика.
Менеджер Extended memory
В состав DOS входит драйвер, хранящийся в файле himem.sys, его спецификация обязательно указывается в первой строке файла config.sys. Этот драйвер выполняет несколько функций, связанных с доступом к дополнительной памяти режиме Extended memory.
Одна из них заключается в тестировании и определении объема дополнительной памяти, сообщение о том, что himem тестирует память, можно увидеть в процессе загрузки DOS. Тестирование можно запретить, указав в config.sys ключ /testmem:off. Основное назначение himem.sys заключается в загрузке в дополнительную память резидентной части DOS.
В дополнительную память могут загружаться и драйверы различного назначения. В autoexec.bat признаком этого является команда LH, которая предшествует спецификации файла драйвера. В config.sys в таком случае вместо команды DEVICE используется DEVICEHIGH. При первоначальной установке DOS на компьютере все драйверы загружаются в обычную память. После того как файлы autoexec и config окончательно сформированы (завершено конфигурирование системы), выполняется специальная задача memmaker.exe, которая перемещает драйверы в старшую память, для увеличения свободного пространства в обычной памяти.
Драйвер himem.sys только загружает резидентные задачи в старшую память. Для выполнения таких задач надо либо переводить микропроцессор в защищенный режим, либо вызывать их так, как будто они находятся в Expanded memory. При работе в среде DOS используется второй способ.
Поддержка BIOS
После выпуска микропроцессора Intel 286 в состав BIOS была включена группа функций с названием AT services, доступных через прерывание int ish. Две из них имеют отношение к работе с Extended memory, а еще одна используется для перехода в защищенный режим. Следует отметить, что изначально они создавались для специальных целей и не рассчитаны на использование в прикладных задачах. Полное описание всех функций группы ish можно найти в Tech Help или в одном из руководств по BIOS.
Функция 87h Move Extended Memory Block перемещает блок данных из расширенной памяти в обычную, или в обратном направлении. Размер блока, выраженный в словах, указывается в регистре сх, он не может превышать воооь, т. е. 32К слов, или 64 Кбайт. В регистры es:si помещается адрес Global Descriptor Table (GOT), содержащий описание источника и приемника.
Признаком успешного выполнения пересылки является очищенный С-разряд при возврате из BIOS. При возникновении аварийной ситуации BIOS прекращает пересылку, устанавливает С-разряд при возврате в задачу, а в регистре ah указывает код ошибки (1.2, 3).
Для GDT надо зарезервировать 48 байтов памяти, 38 из которых имеют постоянное значение, а 10 заполняются задачей перед обращением к BIOS, они содержат адреса и размеры источника и приемника. Напомним, что данные читаются из источника и записываются в приемник. Таблицу можно зарезервировать, например, с помощью директив, приведенных в примере Б.9.
Пример Б.9. Структура таблицы GDI.
GDtab: db 16 dup (0) 16 пустых байтов dw? размер источника в байтах (2*[сх]+1) dw? младшая часть адреса источника db? старшая часть адреса источника db 93h разрешены чтение и запись dw 0 пустое (резервное) слово dw? размер приемника в байтах (2*[сх]+1) dw? младшая часть адреса приемника db? старшая часть адреса приемника db 93h разрешены чтение и запись dw 0 пустое (резервное) слово db 16 dup (0) 16 пустых байтов