Сколько перевидал я взволнованных пользователей, приходивших ко мне со словами: "Ну вот, запускаю я игрушку, а она твердит, что ей памяти не хватает (Out of memory или что-нибудь в этом роде). Куда ей еще - у меня восемь мегабайт! Купил еще восемь - тот же результат!"
Память памяти рознь. В персональных компьютерах столько разных видов памяти, что и я иногда в них начинаю путаться. Сейчас мы с Вами разберемся с теми видами памяти, из-за которых происходит сыр-бор.
Приготовьтесь, сейчас будет грустно...
Шизофрения - это раздвоение личности. Создатели IBM PC наградили ее раздвоенной, растроенной, расчетверенной и т.п. памятью. А все от того, что вначале хотели сделать все попроще и подешевле. Но простота порой хуже воровства...
Лет пятнадцать-двадцать назад, когда создавались первые персональные компьютеры, память в мегабайт-два считалась роскошью даже на "больших" машинах. Персональные же компьютеры создавались скорее для дома, чем для офиса. К тому же фирма IBM с опозданием появилась на рынке персональных компьютеров, и ей нужно было перебить соперников если не качеством, то хотя бы ценой. Вот поэтому-то и было принято решение, из-за которого по сей день маются миллионы пользователей во всем мире, а тысячи компьютерных специалистов зарабатывают деньги на устранении этих неприятностей.
Решение это заключалось в следующем: для "персоналки" память больше 1Мб никогда не понадобится: а значит, проектировать IBM PC нужно расчетом на эту память (реально, кстати, в первых моделях IBM PC было вообще 32-64Кб памяти). Нужно сказать, что максимальный объем памяти - это один из основных параметров при проектировании компьютеров. От него зависит система адресации, а от системы адресации зависит, как будет устроен процессор. Тот факт, что памяти будет заведомо меньше 1Мб, сильно упрощал и удешевлял компьютер, и IBM пошла по этому пути. В первые годы это решение принесло громадный успех.
Но, не гнался бы ты, поп, за дешевизной: прошло два-три года: память резко подешевела, конкуренты стали продавать модели с 2-4Мб, а перед IBM встала нелегкая дилемма: или ломать напрочь структуру компьютера и аннулировать все разработанные за это время программы, или как-то совмещать коня и трепетную лань.
К тому же, на самом деле MS DOS использовала для работы не весь мегабайт, а только первые 640Кб (conventional memory, или обычная память. Еще ее нередко называют основной памятью: просто слово conventional можно перевести и так, и так). Память от 640К до 1М (upper memory, старшая память, но ее нередко называют верхней памятью) была занята чем попало - и видеобуфером экрана, и областями специально для компьютера PS/2, и так далее.
Когда разработчикам программ перестало хватать обычной памяти, первым делом они стали посягать на старшую память. Там было много неиспользуемых кусков (например, если у Вас цветной монитор, то видеопамять для монохромного монитора не используется). Были написаны специальные драйверы (программы, управляющие этой памятью).Один из наиболее используемых драйверов - EMM386, с ним мы чуть попозже познакомимся.
Тем временем искались пути для того, чтобы шагнуть за предел 1Мб.
Некоторые фирмы-разработчики предлагали расширенную память (expanded memory, EMS), которая продавалась на отдельной плате со своим процессором. Некоторое время expanded memory пользовалась популярностью, и многие разработчики программ ориентировались на ее использование.
Кроме того, стала широко использоваться дополнительная память (extended memory, XMS. Кстати, иногда возникает путаница из-за того, что и слово extended, и слово expanded переводят как "расширенная" или "дополнительная". Чтобы не путать себя и Вас, я не буду говорить "дополнительная" или "расширенная", а буду говорить XMS или EMS). Прелесть ее была в том, что она была организована так же, как и основная: никаких дополнительных плат, процессоров - просто наращиваешь память теми же SIMM.
Чтобы в дальнейшем не было путаницы, что имеется в виду под верхней памятью, а что под старшей, что мы называем расширенной памятью, а что дополнительной, так вот, на этом рисунке все названо так, как в документации Microsoft. Этой терминологии мы и будем придерживаться. Но, читая различные книги и общаясь с другими пользователями, не забывайте спрашивать их, что они имеют в виду, когда говорят о расширенной памяти - XMS или EMS.
0-640K - обычная (conventional) память
640K-1024K - старшая (upper) память (UMB)
1024K-1088K - верхняя (high) память (HMS)
1088К и выше - дополнительная (extended) память (XMS)
и, наконец, отдельно и на отдельной плате- расширенная (expanded) память (EMS)
Наконец, начиная с 386-х машин, IBM (а точнее, Intel - фирма-производитель процессоров) реализовала так называемый расширенный режим адресации. Теперь адрес не ограничивался 1М, и программы, работающие в расширенном режиме, нормально работали со всей имеющейся памятью.
Однако болезнь оказалась наследственной: расширенный режим используется только в Windows, а при работе в DOS программы так и работают в стандартном режиме, и поэтому предъявляют требования к обычной памяти. Так что, когда Ваша "игрушка" не запускается из-за нехватки памяти, то, скорее всего, не хватает именно обычной памяти.
Итак, напомню: если DOS-программе не хватает памяти, то не хватает именно обычной памяти. Так куда ж она девается?
Чтобы понять это, вспомните, как вообще работает компьютер. Ну, ну, напряглись? Вы включаете компьютер, память пока пуста. Компьютер первым делом отыскивает на дисках операционную систему и загружает ее в память.
В какую? Конечно, в обычную. Вот уже объем доступной обычной памяти и уменьшился килобайт на сорок, если не больше.
А потом пошло-поехало. В файле config.sys указаны драйверы (специальные программы), которые нужно "насовсем" загрузить в память. Например, если этот файл выглядит так:
device=C:\WIN95\COMMAND\display.sys con=(ega,,1)
Country=007,866,C:\WIN95\COMMAND\country.sys
C:\SB16\DRV\CTSB16.SYS /UNIT=0 /BLASTER=A:240 I:5 D:1 H:5
C:\SB16\DRV\CTMMSYS.SYS
C:\SB16\DRV\SBCD.SYS /D:MSCD001 /P:240
то уже пять программ "прописались" в обычной памяти, или, как говорится, стали резидентными. Я специально выделил их имена жирными буквами, чтобы они были заметнее. Для нас сейчас неважно, что делают эти программы, для нас сейчас важно, что они занимают память.
А потом загрузка продолжается, еще к тому же отрабатывает файл autoexec.bat, который имеет, к примеру, такой вид (опять-таки имена резидентных программ я выделил жирными буквами):
C:\WINDOWS\COMMAND\MSCDEX.EXE /D:MSCD001 /V /M:15
keyrus blank=off
mouse
nc
Опять-таки, не вдаваясь в подробности, скажу, что еще четыре программы "осели" в памяти.
Это можно сделать только тогда, когда Windows не загружен. Точнее, это можно делать и из-под Windows, но тогда данные будут, мягко говоря, ошибочными. Когда из-под Windows запускается сеанс DOS, Windows виртуозно обманывает DOS-программу: у нее создается иллюзия того, что она работает на отдельной машине со своей памятью. Впрочем, сейчас эти детали несущественны. Сейчас главное - понять принцип, а поэтому - если Вы в Windows, то или перезагрузитесь в режиме DOS, или запустите DOS-сеанс.
А теперь наберите команду mem (и, конечно, нажмите [Enter]). Программа MEM находится или в каталоге DOS или каталоге Windows\Commands.
Не буду пока комментировать остальные строки, но строка "Максимально допустимый размер программы" показывает то, что осталось от 640Кб после загрузки DOS и резидентных программ. А вот, чтобы посмотреть, куда ушли 153 Кб, которые Вы видите в столбце "Занято". Нужно команду mem ввести вот так:
mem /c
Вот они, истинные враги, которые не дают Вам запустить любимую игрушку, которой надо не 487Кб (которые, как Вы видите в последней строке отчета mem), а вовсе даже 520Кб!
Итак, кто виноват, известно, и встает извечный вопрос русской интеллигенции: "Что делать?".
"Лишние вещи за борт!" - кричит уже некий последователь учения Бармалея. Не лишено логики. Посмотрим, без чего, в принципе, можно обойтись. Еще раз взглянем на config.sys и autoexec.bat. Напомню, что у Вас эти файлы могут выглядеть очень даже иначе. Не надо выполнять все эти действия буквально: сейчас я излагаю типичный путь рассуждений, а не конкретные инструкции.
Это - config.sys
device=C:\WIN95\COMMAND\display.sys con=(ega,,1)
Country=007,866,C:\WIN95\COMMAND\country.sys
C:\SB16\DRV\CTSB16.SYS /UNIT=0 /BLASTER=A:240 I:5 D:1 H:5
C:\SB16\DRV\CTMMSYS.SYS
C:\SB16\DRV\SBCD.SYS /D:MSCD001 /P:240
Три последних строки никуда не денешь. Они нужны для того, чтобы работали Ваша звуковая карта CD-привод. А ведь Вы, напомню, задались целью освободить память именно под игрушку. Впрочем, если Вы запускаете игрушку не с компакт-диска, а с винчестера, можно убрать последнюю строчку, отвечающую за работу с компакт-дисками. А вот без display.sys и country.sys Вы в данном конкретном случае можете обойтись. Правда, не советую немедленно стирать эти строки. Первое правило системщика - не навреди. Лучше поставьте перед ними точку с запятой, вот так:
;device=C:\WIN95\COMMAND\display.sys con=(ega,,1)
;Country=007,866,C:\WIN95\COMMAND\country.sys
и они будут восприниматься как комментарии. Конечно, нужно сохранить изменения в файле config.sys.
А вот теперь посмотрим, что можно сделать с autoexec.bat
C:\WINDOWS\COMMAND\MSCDEX.EXE /D:MSCD001 /V /M:15
keyrus blank=off
mouse
nc
Опять-таки, если Ваша игрушка запускается не с CD, первую строку можно и превратить в комментарий (но это делается уже не с помощью точки с запятой, а с помощью команды REM):
REM C:\WINDOWS\COMMAND\MSCDEX.EXE /D:MSCD001 /V /M:15
Keyrus - это русификатор: стало быть, его можно "закомментарить", если Вы не будете использовать русские буквы.
mouse - это драйвер мышки. Скорее всего, он понадобится, поскольку большинство игр требуют сейчас мышь.
И, наконец, Norton Commander. Его лучше всего оставить, чтобы быстро попасть в нужный каталог. Потом его можно и закрыть.
Вот так, или примерно так, рассуждаете Вы, пытаясь освободить основную память путем "закомментаривания" ненужных строк в config.sys и autoexec.bat.
Ценная мысль. Прежде, чем изменять config.sys и autoexec.bat, скопируйте их в специально созданный каталог SAVE. Так, на всякий случай: очень вероятно, что Вы изуродуете эти файлы до неузнаваемости.
Ценная мысль. После того, как Вы измените config.sys и autoexec.bat, и сохраните эти файлы, нужно перезагрузить компьютер. Пока Вы не перезагрузитесь, новые config.sys и autoexec.bat не вступят в силу.
Упражнение. 1.
Запустите mem и определите размер свободной обычной памяти. 2.
Посмотрите config.sys и autoexec.bat и попытайтесь найти файлы, ненужные для запуска Вашей программы. Закомментируйте команды запуска этих программ. 3.
Перезагрузитесь и снова запустите mem.
На самом деле способ, который Вы сейчас изучили - далеко не лучший. Во-первых, когда Вы запускаете разные программы, требующие различных сочетаний резидентных программ, то Вам придется непрерывно перезагружаться и менять config.sys и autoexec.bat. А во-вторых, резидентные программы вовсе не обязательно "убивать". Их можно вытолкать в старшую и верхнюю память. Чем мы сейчас и займемся.
С верхней памятью (HMA) все просто. Эта память располагается сразу за первым мегабайтом, занимает 64Кб, и туда ничего нельзя поместить, кроме DOS. Зато поместить туда DOS можно очень просто, добавив в config.sys две команды:
DEVICE=C:\DOS\HIMEM.SYS
DOS=HIGH
Первая команда запускает драйвер управления дополнительной памятью himem.sys, а вторая заставляет DOS загрузиться в верхнюю память.
Эксперимент. Запомните объем доступной обычной памяти, добавьте в config.sys строки для загрузки DOS в верхнюю память, сохраните config.sys и перезагрузитесь. Изменился ли объем доступной обычной памяти? Что, не получилось? Тогда, скорее всего, у Вас нет himem.sys, или он есть, но не в каталоге C:\DOS. Где он еще может быть? Скорее всего, в каталоге WINDOWS. Тогда исправьте команду так:
DEVICE=C:\WINDOWS\HIMEM.SYS
и повторите процедуру.
Да, он изменился, но отнюдь не на 64Кб. Оно и понятно: DOS не может полностью перебраться в high memory, кое-что остается в обычной памяти.
А теперь займемся старшей памятью. Для того, чтобы ею пользоваться, нужно всего две вещи: 1.
Загрузить какую-нибудь программу управления памятью (в составе DOS и Windows есть такая программа - EMM386.exe) 2.
Использовать вместо DEVICE в config.sys DEVICEHIGH, а вместо имени программы в autoexec.bat - комбинацию LOADHIGH имя-программы.
Казалось бы, все просто. Берем и переписываем наши файлы так:
Это - config.sys
device=c:\dos\emm386.exe
devicehigh=C:\WIN95\COMMAND\display.sys con=(ega,,1)
Country=007,866,C:\WIN95\COMMAND\country.sys
devicehigh=C:\SB16\DRV\CTSB16.SYS /UNIT=0 /BLASTER=A:240 I:5 D:1 H:5
devicehigh=C:\SB16\DRV\CTMMSYS.SYS
devicehigh=C:\SB16\DRV\SBCD.SYS /D:MSCD001 /P:240
Это - autoexec.bat
loadhigh C:\WINDOWS\COMMAND\MSCDEX.EXE /D:MSCD001 /V /M:15
loadhigh keyrus blank=off
loadhigh mouse
loadhigh nc
Однако довелось мне как-то читать один кулинарный рецепт: столько-то муки, столько-то масла, столько-то сахара и соли, плюс - умелые ручки. При чем тут умелые ручки? А при том. Старшая память - это не просто 384Кб "одним куском". Некоторые блоки старшей памяти используются оборудованием (например, дисплеем), причем не всегда одинаково (например, цветной и монохромный дисплеи используют разные участки старшей памяти). При этом программы, которые мы загружаем в старшую память, имеют разные размеры. Если мы просто напишем DEVICEHIGH и LOADHIGH, то программы будут загружаться в старшую память как попало, и некоторым из них там не хватит места. По-хорошему, нужно в команде использовать конкретные адреса, например, так:
DEVICEHIGH /L:1,10416 =C:\SB16\DRV\CTMMSYS.SYS
Но это уже - задача для профессионалов. А как же быть Вам? В DOS есть программа-утилита memmaker, которая предельно упростит Вам задачу. Нужно всего лишь запустить ее на выполнение, правильно выполнить ее, и она все устроит наилучшим образом и расставит DEVICEHIGH и LOADHIGH где нужно и как нужно.
Внимание! Memmaker нужно запускать строго из DOS, так что выйдите из Windows, если Вы в нем находитесь.
Запустите программу Memmaker. Дальше Вам не нужно принимать решения, а только нажимать [Enter]. Первый вопрос, который Вам задаст эта утилита: "Express Setup or Custom Setup?". То есть, намерены ли вы выполнить экспресс-установку или пользовательскую. Пользовательскую установку мы даже не будем рассматривать, для Вас она пока сложна. По умолчанию указано Express Setup, поэтому просто нажмите [Enter].
Следующий вопрос касается расширенной памяти, по умолчанию считается, что Вы ее использовать не собираетесь, Поэтому нажмите [Enter].
Что такое? Что случилось? Почему компьютер перезагружается?
Все нормально. Memmaker желает лично проследить, какие программы в autoexec резидентные, какие нет, и сколько они на самом деле занимают памяти. Без перезагрузки это не выяснишь.
А вот и грабли, на которые наступают все, кто впервые пользуются Memmaker. Перезагрузка прошла, запустился Norton Commander, и Вы в нетерпении нажимаете [Ctrl+L], вглядываетесь в информационную панель, чтобы увидеть, сколько памяти освободилось. А нисколько! Дело в том, что Memmaker еще не закончил работу. Он застрял на определении памяти, занимаемой Norton Commander, и двинется дальше только после того, как Вы выйдете из Norton Commander.
Вышли? Ну вот, работа пошла дальше. Memmaker сообразил, как нужно изменить config.sys и autoexec.bat, изменил их и спрашивает Вас, довольны ли Вы изменениями. Скорее всего, да, поэтому нажмите [Enter].
Что такое?! Опять перезагрузка!!!
Ну, а как же Вы думали? А как же иначе - ведь измененные config.sys и autoexec.bat еще не действуют! А вот заботливый Memmaker спрашивает Вас, хорошо ли загрузилась система. Нажмите [Enter] последний раз.
Ну вот, дело сделано. Перезагрузитесь для верности еще раз, и запустите mem, чтобы определить, сколько обычной памяти Вы выгадали.
Обычно все эти манипуляции проходят без проблем. Однако, если что-то не так, или же Вы хотите запустить пользовательскую установку, то обратитесь к документации по MS-DOS версии 6.0 и выше. Там работа с Memmaker описана просто превосходно и очень подробно.
Анекдот кстати. Из всего вышесказанного ясно, что для того, чтобы иметь доступ к старшей памяти, нужно сначала запустить EMM386.EXE. Наверное, Вы уже в состоянии понять, почему я чуть не умер со смеху, увидев на одной машине в config.sys такую строку:
DEVICEHIGH=C:\DOS\EMM386.EXE
Это самый короткий анекдот, который я только знаю.
Это бывает редко, но все-таки бывает. Например, замечательная игрушка ALADDIN ни в какую не хочет запускаться, если в компьютере не установлена EMS. Напомню, что расширенная память сейчас почти не используется, а когда использовалась, поставлялась на специальных платах с собственным процессором. И что же теперь делать? Добывать эту плату, чтобы поиграть в ALADDIN?
Ничего подобного. Драйвер EMM386 на самом деле выполняет не одну, а две функции. С первой Вы уже знакомы: управление старшей памятью. А вторая - эмуляция расширенной памяти. Что такое эмуляция? Эмуляция - это моделирование оборудования при помощи программ. Некая программа, например, ALADDIN, хочет работать с расширенной памятью. В Вашей машине нет расширенной памяти, зато есть дополнительная. EMM386 представляет дело так, как будто дополнительная - это и есть расширенная. Когда ALADDIN обращается к расширенной памяти, EMM386 коварно перехватывает обращение и подсовывает дополнительную память (на самом деле там все еще круче, для обмана используется специальное "окно" в старшей памяти, но Вам это можно пока и не знать).
Итак, если программа требует EMS, нужно просто указать EMM386, что она, кроме управления старшей памятью, должна еще и эмулировать расширенную. Это можно сделать двумя способами.
Можно еще раз запустить MEMMAKER. Как Вы помните, первый вопрос его был "использовать экспресс-установку или пользовательскую", а второй "используют ли ваши программы расширенную память?". Так вот, на этот второй вопрос нужно ответить "Yes", высветив это слово нажатием клавиши [ПРОБЕЛ], а потом нажав [Enter]. Дальше нужно довести работу MEMMAKER до конца, со всеми его тремя перезагрузками. Результат будет таков: команда запуска EMM386 будет выглядеть не так:
DEVICE=C:\WINDOWS\EMM386.EXE
а так:
DEVICE=C:\WINDOWS\EMM386.EXE RAM
В принципе, вы можете проделать это и без MEMMAKER, просто откорректировав config.sys. Это и есть второй способ.
Вообще, можно долго рассказывать о том, как вручную или с помощью пользовательской установки управлять параметрами EMM386 (а их много). Но это - тема не для начинающих. Еще одна интересная тема - как сделать меню в config.sys и autoexec.bat, чтобы загружать разные варианты настроек. А вот если приложение Windows жалуется на нехватку памяти, то, как правило, оперативная память совершенно ни при чем, зато очень даже при чем память на винчестере. Но все это - как-нибудь в следующий раз.
Опубликовано: ON LINE 1997 N2
© Алексей Бабий 1997