Что-то с памятью ее стало ... или почему "игрушка" не хочет запускаться

Сколько перевидал я взволнованных пользователей, приходивших ко мне со словами: "Ну вот, запускаю я игрушку, а она твердит, что ей памяти не хватает (Out of memory или что-нибудь в этом роде). Куда ей еще - у меня восемь мегабайт! Купил еще восемь - тот же результат!"

Память памяти рознь. В персональных компьютерах столько разных видов памяти, что и я иногда в них начинаю путаться. Сейчас мы с Вами разберемся с теми видами памяти, из-за которых происходит сыр-бор.

Приготовьтесь, сейчас будет грустно...

История болезни: шизофрения у IBM PC

Шизофрения - это раздвоение личности. Создатели 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 программы так и работают в стандартном режиме, и поэтому предъявляют требования к обычной памяти. Так что, когда Ваша "игрушка" не запускается из-за нехватки памяти, то, скорее всего, не хватает именно обычной памяти.

Чем забита память компьютера и насколько виноваты в этом autoexec.bat и config.sys

Итак, напомню: если 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

Это самый короткий анекдот, который я только знаю.

Если программа требует EMS

Это бывает редко, но все-таки бывает. Например, замечательная игрушка 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