Как извлечь максимум из системной памяти DOS в высших адресах
Как извлечь максимум из системной памяти DOS в высших адресах
- Традиция запутывания терминологии
- Стандартная память
- Расширенная память
- HIMEM
- Дополнительная память
- Память в высших адресах DOS
- Размещение памяти в высших адресах DOS
- Известные проблемы
Чтобы добиться максимальной производительности работы компьютера, часто приходится совершенствовать свои знания в некоторых спецефических и сложных областях, однако немногие из них требуют знакомства со столь запутанными проблемами, как те, что связаны с дополнительной (expanded) и расширенной (extended) памятью. Если ваш компьютер основан на микропроцессоре 386, или это одна из машин с микропроцессором 286, то эти проблемы еще более усложняются, поскольку для компьютеров с микропроцессорами 286/386 существует возможность доступа к еще одной области памяти, называемой памятью в высших адресах (high memory).
-------------------¬ ¦ ПЗУ BIOS и др. ¦ ¦ 64 Кбайт F000 ¦__________________¦ ¦ ¦ ¦ кадр страницы EMS¦ ¦ 64 Кбайт E000 ¦__________________¦ ¦ ¦ ¦ память в ¦ ¦ ¦ высших адресах ¦ ¦ 96 Кбайт C800 ¦ ¦ +------------------+ ¦ ПЗУ VGA ¦ ¦ 32 Кбайт C000 +------------------+ ¦ ¦ ¦ видео- ¦ ¦ ¦ ПЗУ ¦ ¦ 128 Кбайт ¦ ¦ ¦ A000 ¦__________________¦ ¦ ¦ ¦ DOS ¦ ¦ ¦ ¦ ¦ ~~~~~~~~~~~~~~~~~~ ¦ ¦~~~~~~~~~~~~~~~~~~¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ L-------------------
Рис.1. Из 1 Мбайта оперативной памяти, имеющегося обычно в большинстве вычислительных систем, 640 Кбайт зарезервированы для DOS и работающих под ее управлением прикладных программ, а 384 Кбайт остаются недоступными для операционной системы.
Память в высших адресах - это область объемом 384 Кбайт, расположенная между границами 640 Кбайт и 1 Mбайт, зарезервированная для системного пользования - для видеопамяти, BIOS и проч. Такие программы, как QEMM (производства Quarterdeck) и 386max (производства Qualitas) управляют этой областью зарезервированной памяти таким образом, что вы можете поместить туда резидентные программы, тем самым освобождая больше обычной памяти под прикладные программы (см. рис. 1). Последние версии этих программ, QRAM (Quarterdeck) и Move'em (Qualitas), также дают возможность некоторым компьютерам с микропроцессорами 286 получить доступ к этой зарезервированной памяти. Эта статья посвящена подробному рассмотрению того, что представляет собой область памяти DOS в высших адресах и как можно ей воспользоваться, чтобы сделать систему максимально эффективной.
Традиция запутывания терминологии
Традиционная терминология, используемая для ссылок на память персонального компьютера, весьма запутанна. Расширенная память - это нечто совершенно другое, чем дополнительная память. Ни один из этих двух типов памяти не имеет никакого отношения к памяти в высших адресах, если не считать того, что дополнительная память использует область памяти в высших адресах для собственной индексации. Хотя эта терминология краткая и вполне отвечает действительности, прозрачной ее назвать нельзя.
Более того, память в высших адресах между 640 Кбайт и 1 Mбайтом не единственная; существует другая память в высших адресах. Это область памяти объемом 64 Кбайт (точнее, 64 Кбайт минус 16 байтов), к которой DOS может получить доступ на большинстве компьютеров с микропроцессорами 386/286, когда они работают в режиме реальной адресации. Вторая область памяти в высших адресах расположена непосредственно над границей 1MB, и осуществить доступ и управление этой областью памяти можно, используя драйвер HIMEM.SYS (Microsoft). Чтобы объяснить, как разобраться со всеми этими участками памяти, начнем с пояснения терминологии.
Стандартная память
Большинство читателей в основном знакомы с семейством центральных процессоров Intel 8086/8088. PC и PC-XT используют процессор 8088, 8-битовый вариант 16-битового 8086. Для удобства в дальнейшем будем ссылаться только на 8086, поскольку между ними нет принципиальных различий. В процессоре 8086 16 ножек (pin) посылают сигналы, соответствующие 16 битам текущих данных, которыми процессор обменивается с системным ОЗУ. Однако данные не имеют никакого смысла сами по себе, если нет возможности следить за тем, что они собой представляют. Системная шина должна знать, куда направляются конкретные данные или откуда они поступили. Для выполнения этой задачи процессор использует еще 20 из своих ножек для создания уникальных адресов памяти. Это дает возможность процессору семейства 8086/8088 адресовать 2 в степени 20 уникальных байтов - 1 Mбайт памяти.
В оригинальной архитектуре персонального компьютера 640 Кбайт из этого 1 Mбайт было зарезервировано под DOS и прикладные программы, работающие под ее управлением, а область с 640 Кбайт по 1 Mбайт была зарезервирована для системного пользования. Большая часть 640 Кбайт обычной памяти действительно используется почти постоянно, но верно и то, что существуют участки зарезервированной системной памяти, которые система не использует и которые могут быть сделаны доступными для других целей. QEMM и 386max управляют именно этой доступной частью участка памяти, расположенного между 640 Кбайт и 1Mбайт, и именно об этой части памяти следует рассказать подробнее.
Удобно и общепринято делить 1 Mбайт памяти на 16 последовательных участков по 64 Кбайт каждый. Эти участки, иногда называемые страницами, помечаются шестнадцатеричными целыми числами от 0 до F, т.е., 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. (Есть старая программистская шутка, что считать в шестнадцатеричной системе легко, если отрезать большие пальцы). Итак, DOS получает области 0 - 9 (10 участков по 64 Кбайт, всего 640 Кбайт), а система получает остальное: участки A, B, C, D, E, F.
Иногда участки по 64 Кбайт разбиваются далее каждый на 16 областей по 4 Кбайт. Области, разумеется, также помечаются шестнадцатеричными числами. Например, область А разбивается на дополнительные области от 0 до F: A0, A1, ... , AF. Как QEMM, так и 386max используют эти шестнадцатеричные адреса. Для завершения картины обе программы добавляют еще два числа, так что 386max ссылается на объединенную область А6 - А7 следующим образом: A600h - A800h. Последний вариант QEMM (версия 3.0) также принял этот синтаксис, тогда как предыдущие версии обозначили бы ту же самую область как A600h - A7FFh. Мы будем в дальнейшем придерживаться синтаксиса 386max, поскольку он применим теперь и к текущей версии QEMM.
Расширенная память
Расширенная память, дополнительная память и HI-MEM (Microsoft) это все средства получить больше памяти, чем стандартный 1MB. Плата микропроцессора 80286 имеет на четыре адресных линии больше, чем 8086 /8088, что позволяет адресоваться к количеству адресов, большему в 16 раз (2 в степени 4). Адреса памяти выше предела 1MB называются расширенной памятью. Когда микропроцессор 286 работает как 8088 (т.е., в режиме реальной адресации), он не может получить доступ к этой памяти. Чтобы использовать расширенную память, он должен работать в режиме виртуальной (защищенной) адресации.
Поскольку микропроцессор 286 был спроектирован до того, как Intel стало известно, каким успехом оказался 8088, его разработчики не предусмотрели простого способа переключаться обратно в режим реальной адресации из режима витруальной адресации (защиты). Чтобы осуществить это обратное переключение, используются разные хитрости, и в масштабе процессора оказывается, что они требуют значительного времени на выполнение, таким образом понижая производительность и угрожая потерей прерываний. В силу этих причин до последнего времени не было возможности осуществлять выполнение программы из расширенной памяти. В основном эта память использовалась под буферы ввода-вывода и печати.
Программа улучшения возможностей DOS, такая, как Release 3 в составе Lotus 1-2-3, работает, запуская на выполнение программу в расширенной памяти и переключаясь обратно в режим реальной адресации только тогда, когда вызывается сервисная программа DOS. Это возможно для прикладных программ, которые получают в свое распоряжение все ресурсы машины, но плохо работает для резидентных программ.
На компьютере с микропроцессором 286 можно получить до 15MB расширенной памяти (весь объем памяти - 16MB). Микропроцессор 386 физически способен адресовать 4 гигабайта памяти, т.к. он имеет 32 адресные линии (2 в степени 32 байтов). Большинство из машин семейства 386, тем не менее, устанавливают искусственное ограничение на объем памяти в 15MB, из-за используемых соединительных шин и BIOS.
OS/2 использует расширенную память. Однако, поскольку OS/2 работает в режиме виртуальной адресации (защиты), термин "расширенная память" становится излишним. Под управлением OS/2 все эти определения памяти не используются, есть только одна память - любой ее участок может быть использован.
HIMEM
Microsoft не был первооткрывателем HIMEM, как обычно считается. HIMEM использовалась ранее DESQview (Quarterdeck), хотя стала широко доступна только с версией Microsoft Windows 2.10. HIMEM использует всего лишь 64 Кбайт из доступной расширенной памяти - точнее говоря, первые 64 Кбайт (минус 16 байтов) расширенной памяти, памяти непосредственно над 1 Mбайт. Важной для HIMEM особенностью является то, что эти 64 Кбайт доступны из режима реальной адресации и могут быть использованы без средств расширения DOS. Одно из возможных применений HIMEM - позволить DOS разместить там часть себя, таким образом освобождая дополнительно часть памяти ниже 640 Кбайт для пользовательских программ.
HIMEM в действительности основана на ошибке, на разнице между микропроцессорами 80286 и 8088 в случае, когда 286 работает, как 8088. Кроме того, что процессор разбивает память на страницы - 16 взаимно не пересекающихся участков по 64 Кбайт,- процессор также представляет память в виде пересекающихся участков по 64 Кбайт, называемых сегментами, которые начинаются с каждых 16 байтов. Предположим, что процессор пытается получить доступ к одному из сегментов, который начинается очень близко к верхней границе 1MB. 8086 при этом совершит циклический переход к памяти в низших адресах, как показано на рис. 2.
+------------------+ ¦ Область памяти ¦ ¦ ¦ в высших адресах ¦ ¦ +------------------+ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ Обычное ¦ ¦ адресное ¦ ¦ пространство ¦ ¦ в реальном ¦ ¦ режиме ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦__________________¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ~~~~~~~~~~~~~~~~~~ ¦ ¦~~~~~~~~~~~~~~~~~~¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ +------------------+
Рис.2. Реально существует две области памяти в высших адресах. Вторая из этих областей имеет объем 64 Кбайт и расположена непосредственно за 1-Мбайтной границей. DOS может получать доступ к этой области при работе в реальном режиме на большинстве из систем, оснащенных процессорами 286 и 386.
В случае процессора 80286, однако, адрес, который будет получен в результате операции, находится в действительности непосредственно над границей 1 Мбайт. Это дает возможность в режиме реальной адресации адресовать первые 64 Кбайт (минус 16 байтов) расширенной памяти. Этот участок памяти меньше 64 Кбайт на 16 байтов потому, что последний сегмент начинается на 16 байтов ниже границы 1 Mбайт. Чтобы ликвидировать разногласия в случае, когда микропроцессор 286 работает как микропрочессор 8086, IBM встроила в шину специальные средства, которые заставляют память в режиме реального вроемени переходить циклически на низшие адреса, как это происходит в 8086/8088. Драйвер HIMEM занимается как раз тем, что выборочно отменяет действие этой поправки, чтобы программы, написанные особым образом с целью использования этой области, могли поместить там информацию. Это то, что делают Microsoft Windows, DESQview, Ventura Publisher и Carousel.
Дополнительная память
Дополнительная память (expanded memory), часто называемая EMS (Expanded Memory Specification) или LIM (согласно разработчикам, Lotus, Intel и Microsoft), представляет собой схему коммутации банков, которая позволяет процессору получить доступ к большому объему памяти посредством окна размером 64 Кбайт. (Коммутация банков - способ управления памятью, когда физическая память разбита на несколько сегментов (банков) длиной, равной размеру адресного пространства процессора. В каждый момент процессор работает с одним банком). Платы EMS занимают по одной области размером 64 Кбайт адресного пространства выше границы 640 Кбайт. При рассмотрении будем ссылаться на область, расположенную в адресах D000h - E000h, поскольку она принята по умолчанию для большинства плат. К этой области обращаются, как к рамке страницы. Память EMS логически подразделяется на участки размером по 16 Кбайт, называемые страницами.
Эти страницы отличаются от страниц размером 64 Кбайт в адресном пространстве процессора 8086, хотя, так же как и страницы по 64 Кбайт, они не пересекаются. Платы дополнительной памяти имеют специальное аппаратное обеспечение, которое может переключаться на те четыре из этих страниц, к которым осуществляется доступ, когда процессор посылает команду чтения или записи, обращенную к памяти с адресами в рамке страницы. Передвигая это окно посредством программных команд, процессор может получить доступ к такому количеству памяти, которое имеется физически на плате, хотя в каждый момент доступен лишь небольшой участок. Спецификация LIM 4.0 и ранние EEMS расширяли понятие, делая возможным передвигать не только рамку страницы, но (при соответствующем аппаратном обеспечении) также и другие области адресного пространства 8086. При соответствующем аппаратном обеспечении этот способ подкачки может быть использован для многозадачного режима DESQview и Windows.
Дополнительная память особенно полезна потому, что, в отличие от расширенной памяти и HIMEM, она использует только адреса ниже границы 1MB; следовательно, она может использоваться на машинах с процессорами 8086/8088.
Теперь к этой путанице карт и разной памяти присоединился микропроцессор 386, который обладает свими собственными средствами работы с памятью. Микропроцессор 386 поддерживает справочную таблицу, которая позволяет различать физическую и логическую память; он может определить, какая физическая память соответствует данной логической памяти. Примером может служить дублирование ПЗУ. Видео-ПЗУ на многих адаптерах работает значительно медленнее, чем ОЗУ компьютера с процессором 386. Можно программно скопировать ПЗУ в ОЗУ, затем привести в соответствие справочные таблицы таким образом, чтобы обращения к адресам, которые логически принадлежат ПЗУ, в действительности передавались копии, расположенной в значительно более быстродействующем ОЗУ. Информация, которая, как будут считать программы, размещается в нормальных адресах ПЗУ (логических адресах), будет в действительности размещена в различных физических адресах ОЗУ.
Спецификация LIM 4.0 является стандартной спецификацией организации дополнительной памяти. Для доступа к защищенной памяти существуют две спецификации: XMS (Extended Memory Specification), спецификация Microsoft, и VCPI (Virtual Control Program Interface). VCPI дает возможность программе запрашивать защищенные ресурсы у программы управления памятью в режиме виртуальной адресации (защиты), такой, как 386max или QEMM. Программы, работающие в режиме виртуальной адресации (защиты), например, Mathematica и Interleaf, могут работать в среде этих программ управления памятью только потому, что они поддерживают VCPI.