П2.1. Управление памятью
Поддерживаемые MS-DOS 5.0 средства управления памятью
представляют среди других преимуществ этой системы наибольший интерес.
Наряду с уменьшением
накладных расходов по управлению памятью MS-DOS 5.0 обеспечивает:
1) размещение большей части ядра DOS в НМА-памяти;
2) загрузку драйверов устройств и резидентных программ
в UMB-память. Перемещение постоянно находящихся в памяти системных
программных кодов из стандартной (640-Кбайт) в верхнюю (НМА— и
UMB-) память ведет к тому, что прикладным программам может
быть выделено больше оперативной памяти, чем ранее.
Две названные функции по
управлению памятью реализуются различными аппаратными и программными
средствами.
Размещение ядра DOS в НМА-памяти
возможно только на машинах класса AT и старше при наличии
расширенной памяти, Для этого необходимо:
1) подключить к системе
драйвер расширенной памяти, поместив в файл CONFIG.SYS строку вида
DEVICE=HIMEM.SYS
2) явно указать DOS, что ее ядро необходимо
разместить в НМА-памяти, для чего задать в файле CONFIG.SYS команду
DOS = HIGH
Драйвер HIMEM.SYS выделит для ядра DOS первые 64 Кбайт
расширенной памяти (которые станут НМА-памятью), а также
обеспечит доступ ко всей остальной расширенной памяти в соответствии со
спецификацией XMS 2.0 (последнее
нас сейчас не интересует). После интерпретации команды DOS=HIGH ядро DOS будет реально размещено в подготовленной НМА-памяти. По
умолчанию же, независимо от того, подключен ли драйвер HIMEM.SYS, принимается команда DOS = LOW. Она обеспечивает
размещение ядра DOS в нижней памяти, т.е. в начале стандартного
ОЗУ. При размещении ядра DOS в НМА-памяти
в стандартной Памяти остаются занятыми всего около 20 Кбайт. Таким образом, по
сравнению с DOS 3.3 освобождается примерно
40 Кбайт, а по сравнению с DOS 4.0 — 56 Кбайт памяти.
Загрузки драйверов и резидентных программ в UMB-память, как правило,
возможна только на ПЭВМ с МП 80386(SX) или 80486(SX), конечно, при наличии
расширенной памяти. Для реализации этого необходимо подключить
драйвер, управляющий такой загрузкой, и затем использовать соответствующие команды DOS для ее производства.
MS-DOS содержит
внешний драйвер EMM386.EXE (усовершенствованный
вариант драйвера EMM386.SYS), который как раз и
обеспечивает управление UMB-памятью,
но только для машин класса 386(SX) и старше.
Чтобы его подключить, достаточно в CONFIG.SYS поместить
строку вида
DEVICE=EMM386.EXE RAM
Этот драйвер наряду с
управлением UMB-памятью обеспечивает
также:
— эмуляцию отображаемой
памяти в расширенной памяти на ПЭВМ с МП -80386(SX) или 804S6(SX) в соответствии со
стандартом LIM EMS 4.0;
— поддержку сопроцессора
плавающей точки фирмы Weitek.
Команда DEVICE= для подключения драйвера
EMM386.EXE имеет следующий формат
DEVICE = [dir\]ЕММ38б.EХЕ
[ON| OFF| AUTO] s
[W=ON|OFF] [/X=m-n]...
[/I = r-q] ... [/Mx]
[/FRAME=f] [/Ph = t]
[/B=b]
[/L*l] [/A=a] [/H=e] [/D=c]
[/Y=file]
[RAM] [NOEMS]
Драйвер EMM386.EXE может быть также запущен из командной строки
как обычная программа для оперативного реконфигурирования DOS:
EMM386 [ON| OFF| AUTO] [W=ON|OFF]
Аргументы и переключатели
интерпретируются следующим образом:
ON —
активизировать отображаемую память;
OFF —
дезактивировать отображаемую память;
AUTO — активизировать
отображаемую память по запросу из программы;
s — выделить
для использования драйвером с целью эмуляции отображаемой памяти s Кбайт
расширенной
памяти. Допустимы значения в диапазоне 16 — 32768, а по умолчанию принимается
256. Заданное число округляется до значения, кратного 16-ти. Если
указан размер, превышающий емкость доступной расширенной памяти, то на экране
будет отображено ее значение, которое впоследствии можно будет использовать;
W=ON|OFF — включить (ON) или отключить (OFF) поддержку сопроцессора плавающей
точки фирмы Weitek;
/Х=т—п — исключить использование в
качестве окна отображаемой памяти области стандартного адресного пространства,
границы которой определяются значениями тип.Это шестнадцатеричные числа
(без явного указания Н) в терминах параграфов;
/I=r-q — разрешить использование в качестве окна отображаемой
памяти области стандартного адресного пространства, границы которой
определяются значениями г и q. Это шестнадцатеричные
числа (без явного указания Н) в терминах параграфов;
/Мx —
разместить окно отображаемой памяти по адресу, закодированному числом х (см. описание драйвера EMM386.SYS в п. 5Д0.3);
/FRAME =f
—
разместить окно отображаемой памяти по адресу /, заданному
в терминах параграфов в шестнадцатеричной системе счисления (без явного
указания Н). Допустимо число в диапазоне 8000 — 9000 или С000 — Е000 с шагом
400;
/Ph=t — разместить
страницу h по
адресу t, заданному
в терминах параграфов в шестнадцатеричной системе счисления (без явного
указания Н). Допустимы те же значения, что и в предыдущем переключателе;
/В=b — специфицировать наименьший допустимый адрес
для свопинга страниц отображаемой памяти. Число Ъ задается в
шестнадцатеричной системе счисления (без Н) в терминах параграфов, причем в
диапазоне 1000 — 4000. По умолчанию принимается 4000;
/L=l — оставить после подключения драйвера
минимум I Кбайт расширенной памяти (по умолчанию — 0);
/А=a — создать a банков быстрых регистров
для смены страниц отображаемой памяти (банки быстрых регистров используются в случае
многозадачного режима работы). Допустимо число в диапазоне 0 — 254, по
умолчанию принимается 7. Каждый банк увеличивает размер резидентной части DOS примерно на 200 байт;
/Н=e — сформировать е обработчиков отображаемой памяти,
которыми может пользоваться драйвер. Число е должно принадлежать
диапазону 2 — 255. По умолчанию принимается 64;
/D=c — сформировать буфер
для прямого доступа к памяти размером с Кбайт;
/Y
= file —
указать
посредством file полную спецификацию файла
с драйвером EMM386.EXE;
RAM —
обеспечить доступ как к отображаемой, так и к UMB-памяти;
NUBMS —
запретить использование отображаемой памяти, выделив для UMB-памяти максимальное число
«дыр».
Драйвер EMM386.exe следует подключать к системе непосредственно за
драйвером HIMEM.SYS, чтобы исключить
конфликт»! с другими драйверами.
Запуск EMM386.EXE как программы без
аргументов и переключателей обеспечивает отображение информации о статусе
драйвера.
Одного лишь подключения
данного драйвера недостаточно; чтобы использование UMB-памяти стало
действительно возможным, необходимо в CONFIG.SYS включить еще одну команду,
а
именно:
DOS=UMB
По умолчанию вместо UMB действует NOUMB, запрещая доступ к UMB-памяти. Команды DOS = HIGH и DOS = UMB можно совместить в одной
строке. Вообще формат команды DOS= следующий:
DOS =
[HIGH
| LOW][,UMB | NOUMB]
Если
ни HIGH,
ни LOW
не указано, то запятую можно опустить.
Загрузка драйверов в UMB-память осуществляется командой
конфигурирования DEVICEHIGH=, которая имеет формат,
аналогичный команде DEVICE=:
DEVICEHIGH =
file
[arglist] [переключатели]
или
DEVICEHIGH SIZE=s file [arglist] [переключатели]
Вторая
форма дополнительно к первой специфицирует размер необходимой для драйвера
памяти в s
байтов, заданный в шестнадцатеричной системе
счисления. Необходимость в этом возникает тогда, когда драйвер при своей
инициализации дополнительно (динамически) запрашивает память. В (случае размещения драйвера в UMB-памяти ее может не хватить, что приведет к краху системы.
Для решения данной проблемы сначала загрузите драйвер в стандартную память И определите реальный
его размер, выдав команду MEM /PROGRAM Затем
укажите требуемое значение при установке драйвера в UMB-память.
Загрузка в UMB-память резидентных
программ может
быть выполнена:
1) командой конфигурирования INSTALLHIGH= (полный синтаксический
аналог команды INSTALL=);
2) командой LOADHIGH (LH), допустимой в командной строке,
в частности, в командном файле, и имеющей формат
LOADHIGH file
Заметим, что расширение в
аргументе file задавать необязательно, а
справа можно приписать требуемые аргументы и переключатели.
Когда драйвер или
резидентная программа в UMB-память помещены быть не
могут по причине ее занятости, осуществляется загрузка в стандартную память.
Размещение драйверов и
резидентных программ в UMB-памяти позволяет
высвободить для прикладных программ дополнительно до 133 Кбайт стандартной
памяти, что особенно актуально для Windows.