Обычная память - Conventional memory

Области памяти семейства IBM PC

В управлении памятью DOS , обычная память , которая также называется базовой памятью , это первый 640 килобайт из памяти на IBM PC или совместимые системы. Это память для чтения и записи, напрямую адресуемая процессором для использования операционной системой и прикладными программами. Поскольку цены на память быстро падали, это конструктивное решение стало ограничением в использовании большой емкости памяти до появления операционных систем и процессоров, которые сделали это неактуальным.

640 КБ барьер

Блоки памяти IBM PC, PC / XT , 3270 PC и PCjr
0-блок 1-й 64 КБ Обычная пользовательская память до 64 КБ (малая область памяти)
1-блок 2-й 64 КБ Обычная пользовательская память до 128 КБ
2-блок 3-й 64 КБ Обычная пользовательская память до 192 КБ
3-блок 4-й 64 КБ Обычная пользовательская память до 256 КБ
4-блок 5-я 64 КБ Обычная пользовательская память до 320 КБ
5-блок 6-я 64 КБ Обычная пользовательская память до 384 КБ
6-блок 7-я 64 КБ Обычная пользовательская память до 448 КБ
7-блок 8-я 64 КБ Обычная пользовательская память до 512 КБ
8-блок 9-я 64 КБ Обычная пользовательская память до 576 КБ
9-блок 10-я 64 КБ Обычная пользовательская память до 640 КБ
Блок 11-я 64 КБ Расширенная видеопамять ( EGA )
B-блок 12-я 64 КБ Стандартная видеопамять ( MDA / CGA )
C-блок 13-я 64 КБ Расширение ПЗУ (XT, EGA, 3270 ПК)
D-блок 14-я 64 КБ другое применение (картриджи PCjr, LIM EMS )
Электронный блок 15-я 64 КБ другое применение (картриджи PCjr, LIM EMS)
F-блок 16-я 64 КБ Система ROM-BIOS и ROM-BASIC

640 КБ барьера является архитектурным ограничением IBM PC совместимых персональных компьютеров. Intel 8088 CPU, используемый в оригинальной IBM PC , удалось решить 1 МБ (2 20  байт), так как чип предложил 20 адресных линий . В конструкции ПК память менее 640 КБ предназначалась для оперативной памяти на материнской плате или на платах расширения и называлась обычной областью памяти.Первый сегмент памяти (64 КБ) обычной области памяти называется нижней памятью или нижней областью памяти . Оставшиеся 384 КБ за пределами обычной области памяти, называемой областью верхней памяти (UMA), были зарезервированы для использования системой и дополнительными устройствами. UMA использовался для ROM BIOS , дополнительной постоянной памяти , расширений BIOS для фиксированных дисков и видеоадаптеров, памяти видеоадаптера и других устройств ввода и вывода с отображением в память . В дизайне оригинального компьютера IBM PC карта памяти адаптера цветной графики (CGA) помещена в UMA.

Потребность в большем объеме ОЗУ росла быстрее, чем потребность в оборудовании для использования зарезервированных адресов, в результате чего ОЗУ в конечном итоге отображалось в эти неиспользуемые верхние области для использования всего доступного адресного пространства. Это вводило зарезервированную «дыру» (или несколько дыр) в набор адресов, занятых оборудованием, которые можно было использовать для произвольных данных. Избежать такой дыры было сложно и уродливо, и она не поддерживалась ни DOS, ни большинством программ, которые могли работать в ней. Позже пространство между отверстиями будет использоваться в качестве блоков старшей памяти (UMB).

Для обеспечения совместимости со старыми операционными системами и приложениями барьер в 640 КБ оставался частью конструкции ПК даже после замены 8086/8088 процессором Intel 80286 , который мог адресовать до 16 МБ памяти в защищенном режиме . Барьер в 1 МБ также оставался, пока 286 работал в реальном режиме , поскольку DOS требовал реального режима, в котором сегменты и регистры смещения используются с перекрытием, так что адреса с более чем 20 битами невозможны. Он все еще присутствует в IBM PC-совместимых устройствах сегодня, если они работают в реальном режиме, например, используемом DOS. Даже в самых современных ПК Intel по-прежнему зарезервировано пространство от 640 до 1024  КБ . Однако это невидимо для программ (или даже большей части операционной системы) в более новых операционных системах (таких как Windows , Linux или Mac OS X ), которые используют виртуальную память , потому что они вообще не осведомлены об адресах физической памяти. Вместо этого они работают в виртуальном адресном пространстве, которое определяется независимо от доступных адресов RAM.

На некоторых материнских платах есть опция «Отверстие для памяти на 15 мегабайт», необходимая для определенных видеокарт VGA, которым требуется монопольный доступ к одному определенному мегабайту видеопамяти. Более поздние видеокарты, использующие шину AGP (пространство памяти PCI), могут иметь 256 МБ памяти с размером апертуры 1 ГБ .

Дополнительная память

Один из методов, который использовался на ранних компьютерах IBM XT, заключался в установке дополнительной ОЗУ в диапазон адресов видеопамяти и увеличении предела до начала адаптера монохромного дисплея (MDA). Иногда для этого требовалось программное обеспечение или специальный декодер адресов . Это увеличило барьер до 704 КБ (с MDA / HGC) или 736 КБ (с CGA).

Менеджеры памяти на 386 на основе систем (таких как QEMM или MEMMAX (+ V) в DR-DOS ) может достичь того же эффекта, добавив обычную память 640 КБ и перемещение барьера 704 КБ (до сегмента B000, начало MDA / HGC) или 736 КБ (до сегмента B800, начало CGA). В этой ситуации можно было использовать только CGA, потому что видеопамять с расширенным графическим адаптером (EGA) находилась непосредственно рядом с областью обычной памяти ниже линии 640 КБ; одна и та же область памяти не могла использоваться как для кадрового буфера видеокарты, так и для переходных программ.

Дополнительные модули управления памятью для всех компьютеров AllCard для XT- и Chargecard для компьютеров класса 286 / 386SX, а также надстройка MicroWay ECM (расширенная обычная память) позволили отобразить обычную память в A0000. -EFFFF ( шестнадцатеричный ) диапазон адресов, что дает до 952 КБ для программ DOS. Такие программы, как Lotus 1-2-3 , которые обращались к видеопамяти напрямую, требовали исправления, чтобы справиться с такой структурой памяти. Таким образом, барьер в 640 КБ был удален за счет аппаратной совместимости.

Также можно было использовать перенаправление консоли (либо путем указания альтернативного консольного устройства, такого как AUX: при первоначальном вызове COMMAND.COM, либо с помощью CTTY позже) для прямого вывода и приема ввода с немого терминала или другого компьютера, на котором запущен эмулятор терминала. . Если предположить, что системная BIOS по- прежнему позволяет машине загружаться (что часто имеет место, по крайней мере, с BIOS для встроенных ПК), тогда видеокарта может быть полностью удалена, и система может предоставить в общей сложности 960 КБ непрерывной памяти DOS для программ. загружать.

Подобное использование было возможно на многих DOS-совместимых, но не IBM-совместимых компьютерах с нефрагментированной компоновкой памяти, например, Victor 9000 / Sirius 1 или Apricot PC, который поддерживал до 896 КБ непрерывной памяти DOS для использования в пользовательской версии. MS-DOS.

Программное обеспечение драйвера DOS и TSR

Большинству стандартных программ, написанных для DOS, необязательно требуется 640 КБ или более памяти. Вместо этого в дополнение к стандартному программному обеспечению DOS можно использовать программное обеспечение драйверов и служебные программы, называемые программами Terminate и Stay Resident (TSR). Эти драйверы и утилиты обычно постоянно использовали некоторую обычную память, уменьшая общий объем доступной для стандартных программ DOS.

Вот некоторые очень распространенные драйверы DOS и TSR, использующие обычную память:

  • ANSI.SYS - поддержка цветного текста и различного разрешения текста
  • ASPIxDOS.SYS, ASPIDISK.SYS, ASPICD.SYS - все должны быть загружены для работы дисководов Adaptec SCSI и CDROM.
  • DOSKEY.EXE - позволяет вызывать ранее набранные команды DOS с помощью стрелки вверх
  • LSL.EXE, E100BODI.EXE (или другой сетевой драйвер), IPXODI.EXE, NETX.EXE - все они должны быть загружены для доступа по букве диска файлового сервера NetWare
  • MOUSE.EXE - поддержка устройств мыши в программах DOS
  • MSCDEX.EXE - поддержка доступа к дисководу CDROM и буквы дисковода, используется в сочетании с отдельным драйвером, зависящим от производителя. Требуется в дополнение к указанным выше драйверам SCSI для доступа к устройству SCSI CDROM.
  • SBCONFIG.EXE - поддержка аудиоустройства Sound Blaster 16 ; Драйвер с другим названием использовался для различных других звуковых карт, также занимающих обычную память.
  • SMARTDRV.EXE - установить кэш диска для ускорения чтения и записи на диск; хотя он мог выделить несколько мегабайт памяти сверх 640 КБ для кэширования диска, для работы ему по-прежнему требовалась небольшая часть обычной памяти.

Как видно выше, многие из этих драйверов и TSR можно считать практически необходимыми для полноценной работы системы. Но во многих случаях выбор должен был быть сделан пользователем компьютера, чтобы решить, иметь ли возможность запускать определенные стандартные программы DOS или загружать все их любимые драйверы и TSR. Загрузка всего списка, показанного выше, вероятно, непрактична или невозможна, если пользователь также хочет запустить стандартную программу DOS.

В некоторых случаях драйверы или TSR должны быть выгружены из памяти для запуска определенных программ, а затем перезагружены после запуска программы. Для драйверов, которые не могли быть выгружены, более поздние версии DOS включали возможность меню запуска, позволяющую пользователю компьютера выбирать различные группы драйверов и TSR для загрузки перед запуском определенных стандартных программ DOS с высоким потреблением памяти.

Верхние блоки памяти и высокая загрузка

По мере того как в конце 1980-х - начале 1990-х приложения DOS становились все больше и сложнее, стало обычной практикой освобождать обычную память, перемещая драйверы устройств и программы TSR в блоки старшей памяти (UMB) в области верхней памяти (UMA) при загрузке. , чтобы максимально использовать обычную память, доступную для приложений. Это имело то преимущество, что не требовало изменений оборудования и сохраняло совместимость приложений.

Эта функция была впервые предоставлена ​​продуктами сторонних производителей, такими как QEMM , до того, как она была встроена в DR DOS 5.0 в 1990 году, а затем в MS-DOS 5.0 в 1991 году. Большинство пользователей использовали сопутствующий драйвер EMM386, входящий в MS-DOS 5, но продукты сторонних производителей от таких компаний, как QEMM, также оказались популярными.

При запуске драйверы могут быть загружены на высоком уровне с помощью директивы « DEVICEHIGH =», в то время как TSR могут быть загружены на высоком уровне с помощью директив « LOADHIGH », « LH » или « HILOAD ». Если операция не удалась, драйвер или TSR автоматически загрузятся в обычную обычную память.

CONFIG.SYS , загрузка ANSI.SYS в UMB, без поддержки EMS:

DEVICE=C:\DOS\HIMEM.SYS
DEVICE=C:\DOS\EMM386.EXE NOEMS
DEVICEHIGH=C:\DOS\ANSI.SYS

AUTOEXEC.BAT , загрузив MOUSE, DOSKEY и SMARTDRV в UMB, если это возможно:

LH C:\DOS\MOUSE.EXE
LH C:\DOS\DOSKEY.EXE
LH C:\DOS\SMARTDRV.EXE

Возможность DOS версии 5.0 и более поздних версий перемещать собственный системный код ядра в область верхней памяти (HMA) с помощью команды DOS = HIGH дала еще один импульс к освобождению памяти.

Оптимизация драйвера / TSR

Платы аппаратного расширения могли использовать любую область верхней памяти для адресации ПЗУ, поэтому блоки верхней памяти имели переменный размер и находились в разных местах для каждого компьютера, в зависимости от установленного оборудования. Некоторые окна верхней памяти могут быть большими, а другие - маленькими. При высокой загрузке драйверов и TSR нужно выбрать блок и попытаться уместить в него программу до тех пор, пока блок не будет найден там, где он подходит, или он уйдет в обычную память.

Необычным аспектом драйверов и TSR является то, что они используют разное количество обычной и / или верхней памяти в зависимости от порядка их загрузки. Это можно было бы использовать с пользой, если бы программы неоднократно загружались в разном порядке и проверяли, сколько памяти было свободно после каждой перестановки. Например, если было 50 КБ UMB и 10 КБ UMB, и были загружены программы, требующие 8 КБ и 45 КБ, 8 КБ могут уйти в 50 КБ UMB, предотвращая загрузку второй. Более поздние версии DOS позволяли использовать определенный адрес загрузки для драйвера или TSR, чтобы драйверы / TSR более плотно прилегали друг к другу.

В MS-DOS 6.0 Microsoft представила MEMMAKERавтоматизацию этого процесса сопоставления блоков в соответствии с функциональными возможностями, предлагаемыми сторонними диспетчерами памяти . Эта автоматическая оптимизация часто по-прежнему не давала того же результата, что и ручная, в смысле предоставления наибольшего свободного места в стандартной памяти.

Также в некоторых случаях сторонние компании писали специальные многофункциональные драйверы, которые объединяли бы возможности нескольких стандартных драйверов DOS и TSR в одну очень компактную программу, которая использовала всего несколько килобайт памяти. Например, функции драйвера мыши, драйвера CD-ROM, поддержки ANSI, вызова команды DOSKEY и кэширования диска будут объединены вместе в одной программе, потребляя всего 1-2 килобайта обычной памяти для обычного доступа к драйверу / прерыванию, и сохранение остальной части многофункционального программного кода в памяти EMS или XMS.

Расширители DOS

Барьер был преодолен только с появлением расширителей DOS , которые позволили приложениям DOS работать в 16-битном или 32-битном защищенном режиме , но они не очень широко использовались за пределами компьютерных игр . С 32-битным расширителем DOS игра могла бы выиграть от 32-битного плоского адресного пространства и полного 32-битного набора инструкций без префиксов 66h / 67h операнда / переопределения адреса. 32-разрядные расширители DOS требовали поддержки компилятора (32-разрядные компиляторы), в то время как XMS и EMS работали со старым компилятором, предназначенным для 16-разрядных приложений DOS реального режима. Двумя наиболее распространенными спецификациями для расширителей DOS были VCPI и более поздние версии DPMI, совместимые с Windows 3.x.

Наиболее заметным DPMI-совместимым расширителем DOS может быть DOS / 4GW , поставляемый с Watcom . Это было очень распространено в играх для DOS. Такая игра будет состоять либо из 32-битного ядра DOS / 4GW, либо из заглушки, которая загружает ядро ​​DOS / 4GW, расположенное по пути или в том же каталоге, и 32-битный «линейный исполняемый файл». Доступны утилиты, которые могут исключить DOS / 4GW из такой программы и позволяют пользователю экспериментировать с любым из нескольких и, возможно, улучшенных клонов DOS / 4GW.

До появления расширителей DOS, если пользователь устанавливал дополнительную память и хотел использовать ее под DOS, ему сначала нужно было установить и настроить драйверы для поддержки либо спецификации расширенной памяти (EMS), либо спецификации расширенной памяти (XMS), а также запускать программы, поддерживающие одну из эти спецификации.

EMS была спецификацией, доступной для всех ПК, в том числе на базе Intel 8086 и Intel 8088 , что позволяло дополнительному оборудованию загружать и выгружать небольшие фрагменты памяти ( переключение банков ) из адресного пространства «реального режима» (0x0400– 0xFFFF). Это позволяло 16-битным программам DOS реального режима получать доступ к нескольким мегабайтам ОЗУ через дыру в реальной памяти, обычно (0xE000–0xEFFF). Тогда программа должна будет явно запросить доступ к странице перед ее использованием. Эти ячейки памяти затем могут использоваться произвольно, пока не будут заменены другой страницей. Это очень похоже на современную выгружаемую виртуальную память . Однако в системе виртуальной памяти операционная система обрабатывает все операции подкачки , тогда как подкачка была явной с EMS.

XMS предоставил базовый протокол, который позволял 16-битным программам DOS загружать фрагменты расширенной памяти 80286 или 80386 в нижнюю память (адрес 0x0400-0xFFFF). Типичный драйвер XMS должен был переключиться в защищенный режим, чтобы загрузить эту память. Проблема с этим подходом состоит в том, что в защищенном режиме 286 прямые вызовы DOS не могут быть выполнены. Обходной путь состоял в том, чтобы реализовать механизм обратного вызова, требующий сброса 286. На 286 это была серьезная проблема. Intel 80386 , который представил « виртуальный режим 8086 », позволили гостевому ядру подражать 8086 и запустить операционную систему хоста , не имея на самом деле заставить процессор обратно в «режиме реального времени». HIMEM.SYS 2.03 и выше использовали нереальный режим на процессорах 80386 и выше, в то время как HIMEM.SYS 2.06 и выше использовали LOADALL для изменения недокументированных внутренних регистров на 80286, значительно улучшая задержку прерывания, избегая повторяющихся переключений реального режима / защищенного режима.

Windows устанавливает собственную версию HIMEM.SYS для DOS 3.3 и выше. Windows HIMEM.SYS запускает поставщика услуг XMS (n) .0 в 32-разрядном режиме для диспетчера виртуальных машин Windows, который затем предоставляет службы XMS (n-1) .0 для устройств DOS и 16-разрядной машины Windows (например, DOS 7 HIMEM.SYS - это XMS 3.0, но при выполнении команды «MEM» в окне DOS Windows 95 отображается информация XMS 2.0).

Смотрите также

использованная литература

дальнейшее чтение