Windows 9x и много памяти: точки над i


Начнем с традиционных «отмазок». Описываемые функции, особенности работы ОС и используемые алгоритмы документированы крайне скудно, либо не документированы вообще. Информация, добытая из разных источников, оказалась частично противоречивой. Я постарался сложить ее кусочки воедино, но гарантировать, что нигде и ни в чем не ошибся, не могу. Попытки теми или иными путями выйти на людей, хорошо знакомых с внутренним устройством упоминаемых здесь модулей ОС, оказались безуспешными - слишком много лет прошло. И в некоторых случаях не оставалось ничего иного, как заниматься реконструкцией, вроде того как по нескольким найденным костям устанавливают облик какого-нибудь динозавра. Поэтому если вдруг вы обнаружите ошибку или неточность, я буду благодарен за высказанные замечания. А теперь переходим к нашим «баранам».

Хотя Windows 98 и Windows Me можно с уверенностью назвать устаревшими системами, они все еще установлены на достаточно большом числе компьютеров. Причины этого могут быть самыми различными - от недостаточной мощности компьютеров, не «тянущих» современные ОС, до наличия программ и оборудования, не работающих под Windows 2000 и ХР.

И если на старых машинах с памятью может возникать только одна проблема - её недостаток, то на новых ситуация оказывается более сложной.

Например, крутится в компании на старой машине некая учетная или бухгалтерская программа, написанная много лет назад и все еще вполне устраивающая тех, кто ее использует. Но вот беда, старый компьютер сломался, на новом компьютере с ХР программа не работает. Или стоит у человека старый сканер, который нужен от случая к случаю и вполне устраивает своего владельца. Но для WinXP драйверов этого сканера не существует, а выбрасывать его и покупать новый - жалко. Да и незачем - ведь работает!

В таких случаях самым очевидным решением является установка на новый компьютер Windows 98 или Windows Me либо в конфигурациях с двойной загрузкой, либо как единственной системы.

Но если в компьютере достаточно много оперативной памяти, то эти ОС могут вообще не установиться, либо то и дело зависать во время работы. Недаром в форумах и конференциях так много утверждений о том, что Windows 98 не способна использовать больше 512 Мб памяти.

Попробуем разобраться, в чем тут дело. Сразу отбросим в сторону ситуации, когда для нового «железа» отсутствуют драйверы для Windows 98 (здесь и далее если речь идет о Win98 и явно не оговорено иное, подразумеваются три операционные системы: Win98, Win98SE и WinMe), не отключена гиперпоточность в пентиумах 4 и т. п. Речь пойдет только об одном - особенностях работы Windows 98 при большом объеме установленной оперативной памяти.

Как правило, если памяти не больше 512 Мб, то никаких проблем не возникает. При особо неудачной конфигурации железа и использовании программ, занимающих мало памяти, но обрабатывающих много данных, система может изредка зависать и при меньшем объеме ОЗУ, но происходит это довольно редко и обычно списывается на «глюки» системы.

Но если памяти больше 512 Мб, то проблемы начинают вылезать гораздо чаще, вплоть до постоянных зависаний, а то и невозможности установки системы или загрузки, если память была добавлена после установки. Может случиться и так, что компьютер начнет циклически перезагружаться.

Извлечение «лишних» модулей памяти обычно оказывается радикально действующим лекарством, и все проблемы как рукой снимает. Но назвать это решение удовлетворительным можно далеко не всегда - не каждый согласится разбирать компьютер и вытаскивать память перед загрузкой Win98 и снова вставлять перед загрузкой WinXP.

Что же сделает в такой ситуации разумный пользователь? Правильно, он пойдет на сайт базы знаний Microsoft. И если у него есть некоторые навыки поиска, он довольно быстро отыщет статьи, в которых описывается эта проблема или родственные ей: 184447, 253912, 304943, 311871.

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

После внимательного анализа следует сразу же отбросить статью 311871. По стилю изложения и полноте информации она сильно отличается от прочих, и можно с уверенностью предположить, что ее написал один из моих коллег-MVP, безусловно, неплохо знающий Windows 98, но недостаточно знакомый с ее внутренним устройством.

Утверждение о том, что эта система не рассчитана на использование 1 Гб ОЗУ, неверно. Она рассчитывалась на использование до 2 Гб, но реальная граница из-за решений, унаследованных от предыдущих версий, как правило, меньше.Количество установленной памяти

Мне довелось наблюдать (заочно, через обсуждение в конференции) самый первый случай ненормальной работы Windows 98 с большим объемом памяти. В феврале 1998 года один из бета-тестеров попытался поставить Windows 98 (кажется, RC0, то есть кандидат в финальные версии, уже не бета-версия, но еще и не финальная) на сервер с одним гигабайтом памяти. В ходе установки появился синий экран с сообщением о недостатке памяти для инициализации Windows. Установка смогла продолжиться только после уменьшения объема памяти до 928 Мб.

Никому из разработчиков и в голову не пришло сказать, что на гигабайт система не рассчитана. Наоборот, ответ был примерно такой: «система рассчитана на использование до 2 Гб памяти, поэтому налицо какая-то ошибка, но сейчас разбираться с этим мы не будем, поскольку до выпуска осталось мало времени, да и никто из обычных пользователей с этой проблемой не столкнется». Если вспомнить типовые конфигурации компьютеров того времени, это утверждение было, безусловно, справедливым. Достаточно сказать, что гигабайт памяти в злополучном сервере набирался модулями по 16 Мб.

В других статьях базы знаний говорится о необходимости ограничивать дисковый кэш до 512 Мб, а также объем оперативной памяти до 1 Гб, 768 Мб или даже до 512 Мб - в разных статьях по-разному.

В статье 253912 можно найти краткое упоминание о выделении под кэш адресов в четвертом гигабайте, в ней же говорится и о возможности ограничить размер кэша. Но в статье 304943 сказано, что в некоторых случаях ограничение кэша не помогает и необходимо ограничивать объем используемой памяти.

Итак, база знаний подтверждает, что при работе с большими объемами памяти Windows может не загружаться или работать нестабильно. Но в чем же может быть дело, если разработчики уверенно говорили о двух гигабайтах?

В общем, дело ясное, что дело темное. Никто толком ничего не знает, а если и знает - то не говорит, и «урезание», либо физическое уменьшение оперативной памяти часто подается как единственная работающая мера. Попробуем разобраться в проблеме досконально.

Начнем с описания того, как Windows использует память.

32-разрядное адресное пространство в процессорах 80386 и старше делится на страницы памяти размером 4 Кб каждая. Управление каждой из этих страниц осуществляется независимо от других. Таких адресных пространств может быть много, но реальное (физическое) адресное пространство доступно только ядру системы и драйверам, лишь они могут непосредственно обратиться к физической памяти. Другие компоненты системы и все прикладные программы работают в виртуальных адресных пространствах, с виртуальными адресами.

Понятие «виртуальная память» несколько неоднозначно. Достаточно часто его используют как противопоставление понятию «физическая память», но в общем случае виртуализацию следует понимать как форму абстрагирования от реального устройства. Очевидно, что программа может выполняться только из физической памяти, а не тогда, когда ее код выгружен в файл подкачки. Но сама программа в общем случае не может определить, находятся ли ее куски в физической памяти или выгружены на диск. Она не может определить и то, в каком именно месте реальной физической памяти находятся ее код и данные - операционная система транслирует адреса ОП, к которым программа обращается в своем виртуальном адресном пространстве, в те адреса, которые программа реально занимает в физической памяти. А если участок виртуальной памяти, к которой обратилась программа, выгружен на диск, ОС приостанавливает работу программы и подгружает нужную страницу в физическую память, после чего программа продолжает работу как будто страница всегда была в памяти.

Чтобы обеспечивать такую трансляцию, операционная система ведет специальную таблицу страниц, в которой указывается текущее соответствие виртуальной страницы и участка физической памяти или участка файла подкачки, в котором действительно хранятся данные.

Таких таблиц несколько - для каждой программы ведется отдельная таблица. Разные программы могут использовать одни и те же виртуальные адреса, но для каждой программы будет установлено свое соответствие между виртуальными и реальными страницами, так что реально обращение будет происходить к разным участкам физической памяти.

И раз уж речь зашла о распределении памяти, стоит отметить, что память выделяется программе только по ее запросам. Операционная система может отказать программе в выделении памяти, но не может выделить программе больше памяти, чем запрошено. Поэтому раздающиеся иногда вопросы «Почему ОС не отдает всю память моей любимой программе, ведь свободной памяти еще море» - бессмысленны. «Перекормить» программу памятью, то есть заставить использовать больше ее, чем хочет сама программа, не удастся.

Итак, мы уже разобрались, что надо отличать физическое адресное пространство от виртуального. Один из компонентов ядра операционной системы - диспетчер памяти - организует, помимо прочего, трансляцию виртуальных адресов, используемых программами и другими компонентами ядра, в реальные адреса физической памяти.

В Windows 98 память распределяется следующим образом (см. рис. ниже). В левой части показано собственно распределение адресного пространства программ и системы, а в правой - пример распределения физической памяти.Распределение памяти

Все виртуальное адресное пространство программ делится на четыре области. Первая область занимает диапазон адресов от нуля до 4 Мб и недоступна для адресации программами для Windows. С программами для ДОС и драйверами устройств дело обстоит несколько иначе, но рассмотрение этих особенностей уведет нас в сторону от темы, поэтому не будем останавливаться на деталях.

Область от 4 Мб до 2 Гб является рабочим пространством программ. С точки зрения программ эта область заполнена оперативной памятью в том количестве, которое потребуется программе (но, конечно, не более 2 Гб), причем, как уже говорилось, у каждой программы это своя собственная память, не имеющая ничего общего с памятью, выделенной другим программам.

Третий гигабайт используется как виртуальное адресное пространство, общее для всех программ и для системы. В эту область Windows загружает свое графическое ядро, а также динамические библиотеки. Фактически, конечно, эти модули находятся в реально имеющейся физической памяти в области гораздо меньших адресов, но нужен механизм, дающий программам возможность обращаться к системным модулям. Виртуализация памяти и является таким механизмом.

Четвертый гигабайт (адреса c0000000-ffffffff) также является общим для всех программ и для системы, он используется в нескольких целях. Во-первых, в него система загружает свое ядро, драйверы и другие модули, работающие на уровне ядра (если такие модули имеются в системе). Этот участок виртуализован подобно третьему гигабайту.

Во-вторых, в этом адресном пространстве выделяется область памяти, используемая дисковым кэшем (VCACHE), также виртуализованная.

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

В-четвертых, здесь же выделяется адресное пространство для виртуальных машин ДОС.

Рассмотрим использование четвертого гигабайта более подробно.

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

Когда больше десяти лет назад Microsoft начала разрабатывать дисковый кэш с динамически изменяемым размером (модуль VCACHE впервые появился в Windows 3.11 для рабочих групп, вышедшей в 1993 году), гигабайтные размеры памяти казались чем-то из области фантастики. Напомню тем, кто не знает, что в первой IBM PC, выпущенной в 1980 году, стояло 64 Кб ОЗУ, а в 1993 году нормой были компьютеры с четырьмя мегабайтами. Экстраполируя на наше время, получим, что в 2006 году можно было ожидать наличия в массовых компьютерах 256 Мб ОЗУ. К тому же никто не думал, что эта ОС и ее прямые потомки проживут так долго.

Так что у программистов не было причин заботиться об экономии адресного пространства, и они щедрой рукой отвели четвертый гигабайт, в том числе и под адресное пространство дискового кэша. Оказалось, что менее накладно выделить под кэш изменяемого размера линейное виртуальное адресное пространство и затем средствами диспетчера памяти отображать его на реально используемую физическую память, нежели вести постоянный учет выделенной памяти в самом модуле кэша.

Поэтому на этапе загрузки системы часть адресного пространства в четвертом гигабайте резервируется под использование дисковым кэшем. Размер этой части зависит от версии операционной системы, от некоторых характеристик оборудования и от количества ОП, установленной в компьютере. Обычно он почти равен объему ОЗУ, но ограничен верхним пределом в 800 Мб.

Еще одно использование четвертого гигабайта - обеспечение доступа к памяти устройств. Если вы застали времена ДОС, то знаете, что нередко для повышения скорости работы программы напрямую писали свои данные в память устройств, например, видеоадаптера (EGA или VGA).

С переходом в 32-разрядный режим работы процессора ничего в этом отношении не изменилось. По-прежнему прямая запись осталась наиболее быстрым способом обращения к устройству, только адреса памяти устройств были вынесены из первого мегабайта в конец адресуемой области, в тот же самый четвертый гигабайт. Да еще между программой и устройством обычно имеется прослойка в виде драйвера.

В этом же четвертом гигабайте выделяется адресное пространство и для виртуальных машин ДОС, в которых выполняются запущенные вами программы для ДОС. При этом возникает необходимость в двойной переадресации: когда программа обращается к адресу в первом мегабайте, вместо него подставляется соответствующий адрес виртуальной машины (в четвертом гигабайте), а поскольку этот адрес виртуальный, то происходит вторая переадресация - на адрес физической памяти, в котором находится нужная страница виртуальной машины. Такова плата за поддержку старых программ. Впрочем, на деле накладные расходы оказываются невелики.

Но вернемся к общим проблемам четвертого гигабайта.

В отличие от Windows XP и других ОС семейства NT, Windows 98 имеет одно-единственное адресное пространство для двух старших гигабайт. Оно оказывается общим и для виртуальной памяти, и для адресов устройств, и его должно хватить для всех способов использования, иначе работа системы будет нарушена.

Влиять на использование адресов памяти устройствами ОС, как правило, не может - эти адреса в большинстве случаев зафиксированы самим оборудованием.

Теперь рассмотрим, как происходит распределение памяти при загрузке Windows. Самый первый этап - загрузка ДОС. Затем из нее запускается ядро Windows - VMM.VXD. Этот файл содержит много модулей, и один из них - диспетчер виртуальных машин (именно он управляет распределением памяти) по своей структуре является обычной программой для ДОС. Но только по структуре и только для того, чтобы его можно было запустить из ДОС. После своего запуска он переводит процессор в защищенный режим и использует ДОС преимущественно как драйвер различных устройств, в первую очередь диска и видеоадаптера.

Затем диспетчер виртуальных машин начинает загружать в память другие модули (драйверы), находящиеся в файле VMM.VXD, драйверы, на которые есть ссылки в реестре или в файле system.ini, а также затребованные ранее загруженными программами для ДОС (в качестве примера можно привести программу кэширования дисков smartdrv, которая при загрузке Windows передает ей требование загрузить модуль smartdrv.vxd, хранящийся в теле файла smartdrv.exe).

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

Если при загрузке Windows включить создание протокола загрузки, то в нем (файл bootlog.txt) эти стадии отчетливо видны. Сначала идут пары сообщений Loading и LoadSuccess для каждого драйвера, затем выполняется инициализация диспетчера виртуальных машин и драйверов: SYSCRITINIT и SYSCRITINTSUCCESS.Фрагмент bootlog.txt

Основным «пожирателем» адресного пространства оказывается, конечно, VCACHE. Как уже говорилось, он требует для себя адресное пространство размером примерно равным объему ОЗУ, но не более 800 Мб. В результате суммарные запросы этого и других модулей могут превысить отводимый для них гигабайт. WinMe в этом отношении более эффективна и более рационально распределяет адресное пространство, поэтому при возможности предпочтительнее использовать именно ее.

Но если все-таки не удается выделить виртуальную память, необходимую собственно системе и всем драйверам, то, как правило, Windows 98 выводит сообщение о недостатке памяти, а Windows Me начинает перезагрузку (хотя бывает и наоборот). Но поскольку адресного пространства не хватит и в следующий раз, перезагрузка получается циклической. При этом записи об инициализации в протоколе отсутствуют, он обрывается на этапе загрузки драйверов. Ошибка

Ошибка

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

Иногда получается так, что адресного пространства хватает для инициализации, но запаса его практически не остается. В этом случае система загрузится нормально, но попытка запустить какую-либо программу для ДОС приведет к появлению сообщения об ошибке. Если неиспользованное адресное пространство остается, но его не слишком много, то некоторые программы для ДОС могут запускаться, а требующие большего объема памяти - нет.

Что же можно сделать, если адресного пространства не хватает и система не грузится, или программы для ДОС не запускаются? Увы, способов решить проблему всего два. Если у вас установлена Windows 98, то можно перейти на Windows Me. Второй, более универсальный, но менее продуктивный способ заключается в ограничении количества используемой памяти (подробные указания приведены в конце статьи).

Вероятно, у вас появился вопрос: если все дело в том, что кэшу диска не хватает виртуального адресного пространства, то почему бы не ограничить его размер, как описано в базе знаний Microsoft? Увы, это не поможет. Дело в том, что распределение памяти выполняет диспетчер виртуальных машин и «заглядывает» при этом только в свой раздел файла system.ini, [386Enh]. А ограничение размера кэша задается в другом разделе и влияет лишь на работу самого кэша, в частности, на использование выделенного ему адресного пространства.

Но ограничение размера дискового кэша все-таки наверняка окажется нужной операцией. Почему? Об этом сейчас и пойдет речь.

Итак, система загружается, программы для ДОС запускаются, но работать все равно нельзя - через некоторое время система либо зависает, либо показывает синий экран сообщения об ошибке. Чего же ей еще не хватает?

Изобразим приблизительную схему адресного пространства в четвертом гигабайте (примерно так, так она формируется в Windows 98 на компьютере автора, некоторые подробности опущены для упрощения), Причем схем у нас будет две: одна - для физического пространства, другая - для виртуального.Карта

Замечание. Во избежание возможных недоразумений следует отметить, что загрузка только ядра Windows без графического интерфейса не имеет ничего общего с загрузкой при установленном параметре BootGUI=0. В последнем случае собственно Windows не загружается вообще, грузится только входящая в ее состав MS-DOS. Хотя в документации встречается также название «ядро реального режима Windows».

Обратите внимание на то, что часть диапазона адресов, занятого видеоадаптером AGP, оказалась использованной дважды (если видеоадаптер использует шину PCI-E, картина меняется несущественно, поэтому ограничимся лишь наиболее распространенным случаем).

Но если эта область адресов используется видеоадаптером, то почему же система отвела его под виртуальную память кэша?

Ответ очень прост: современные драйверы дисплея, как правило, состоят из двух частей - ядра, выполненного в виде драйвера виртуального устройства (vxd), и основной части, выполненной в виде динамически загружаемых библиотек. Когда грузится ядро системы, загружается лишь ядро и видеоадаптера. Оно обычно обеспечивает реализацию только базовых функций видеоадаптера, приблизительно на уровне адаптера VGA, поэтому вполне обходится соответствующей областью адресов в первом мегабайте или, в добавление к нему, небольшим участком памяти, занимаемым адаптером в верхних адресах четвертого гигабайта. При выполнении инициализации памяти диспетчер виртуальных машин выделяет ядру видеоадаптера запрошенную им область, но не может получить информацию о том, что позже, при загрузке графической подсистемы и всех файлов драйвера, этому драйверу понадобятся еще какие-то участки адресного пространства. Так что диспетчер отводит незанятые участки под адресное пространство VCACHE.

Затем запускается графическое ядро Windows, а с ним - и полный драйвер видеоадаптера. Этот драйвер инициализирует всю функциональность видеоадаптера, и в используемой адаптером зоне адресов начинает существовать физическое устройство. И если эта же зона отведена и дисковому кэшу, то при попытке VCACHE обратиться к ней возникнет конфликт между драйвером устройства и кэшем. Нормальная работа системы нарушается.

Важно, что конфликт возникает не от того что кэшу выделена эта область адресов, а от того что он начинает с ней работать. Это дает возможность достаточно просто избежать конфликтов: надо всего лишь ограничить максимальный размер кэша.

Как правило, устройства AGP используют для своих нужд адреса, начиная с е0000000, то есть 3,5 Гб. Дисковому кэшу при этом можно использовать полгигабайта. Именно этим обусловлена рекомендация ограничить размер кэша значением 524288 Кб (512 Мб). Как правило, такое ограничение оказывается действенным. Но не всегда под видеоадаптеры отводится именно эта область адресов, кроме того, подобным же образом могут вести себя и другие устройства, например, ТВ-тюнеры. Поэтому может потребоваться и более жесткое ограничение кэша.

Теперь перейдем к практическим рекомендациям - как поставить Windows 98 на компьютер более чем с 512 Мб ОЗУ.

  1. Первое, что нужно сделать - раз и навсегда забыть об ЕММ386 и других диспетчерах памяти - с ними хоть сколько-нибудь стабильная работа и даже просто загрузка не гарантируются.

    Желательно также не записывать в config.sys явный вызов himem.sys, пусть Windows загружает его автоматически. Хотя каких-либо объяснений этому совету я не нашел и сам не могу понять, почему так обстоят дела, но в некоторых случаях он оказывался действенным.

  2. Если вы устанавливаете WinMe, запаситесь загрузочной дискетой или иным загрузочным носителем. Причем на нем должен быть какой-либо текстовый редактор, поскольку может понадобиться редактирование файла system.ini. Для установки Win98 дискета не нужна, поскольку всегда можно загрузить одну ДОС (Command prompt only) и запустить из нее edit.
  3. Начинаем установку. Возможны три варианта действий.
    1. Вы оставляете в компьютере меньше 512 или 512 Мб, устанавливаете систему, затем выполняете ее подстройку и лишь после этого устанавливаете всю память, после чего снова выполняете подстройку.
    2. Вы заранее делаете подстройку, более суровую, чем необходимо, а после установки ослабляете ограничения до тех пор, пока система еще будет работать.
    3. Вы начинаете установку системы и подстраиваете параметры по мере надобности.
    Лично мне больше по душе пункт 3.3.

    Что нужно сделать для установки по пункту 3.1, предельно ясно: вытащить из компьютера почти всю память. Если объем модуля памяти 1 Гб и более, то этот способ, естественно, неприменим.

    Чтобы следовать пункту 3.2, надо перед началом установки создать файл system.ini с одной короткой записью. На том диске, на который вы хотите установить Windows, создайте каталог, в который будет производиться установка (обычно это Windows). В нем создайте файл с именем system.ini, содержащий две строки:
    [386Enh]
    MaxPhysPage=10000

    После этого можно начинать установку. Эти строки заставят диспетчер виртуальных машин с самого начала использовать только 256 Мб ОЗУ. Если для ваших целей этого количества памяти достаточно, то можно так и работать с этой настройкой, не тратя время на подгонку ее под имеющуюся конфигурацию.

    Для установки по пункту 3.3 предварительно делать ничего не надо, если вы устанавливаете Windows 98, но обязательно нужна загрузочная дискета (или другой носитель) если устанавливается WinMe.

    Начните установку как обычно. Если Windows выведет сообщение о дефиците памяти для инициализации или начнет все время перегружаться, то в Windows 98 держите во время загрузки нажатой клавишу Ctrl, а после появления меню выберите пункт Command prompt only. В Windows Me придется загрузиться с дискеты или другого носителя.

    Затем откройте для редактирования файл system.ini, найдите раздел [386Enh] и добавьте в него строку MaxPhysPage=значение. Для Windows 98 можно начать со значения 40000, для WinMe - 60000. Сохраните файл и перезагрузите компьютер, чтобы попытаться продолжить установку. Если попытка не удалась, снова редактируйте файл и уменьшите первую цифру значения на единицу. Повторяйте эту процедуру, пока установка не сможет нормально завершиться.

  4. После завершения установки имеет смысл подобрать максимальный размер физической памяти. Для этого снова повторяйте процедуру, описанную в пункте 3в, но на этот раз увеличивая значение, пока система не перестанет загружаться.

    После этого вернитесь к предыдущему рабочему значению и увеличьте значение не так сильно. Удобно использовать уменьшение шага в два раза. Например, если система загружается при значении параметра 40000 и не загружается при 50000, то стоит попробовать среднее значение 48000 (это значение - шестнадцатеричное и указывает количество страниц физической памяти, которое может использовать система). Если система запустится, то затем попробовать 4c000, а если нет - то 44000 и так далее. Впрочем, слишком далеко заходить не стоит, единичка в четвертом разряде означает 16 Мб, поэтому три ноля в младших разрядах трогать смысла нет - выигрыш все равно будет мизерным.

    1. Если вам нужно запускать программы для ДОС, то может потребоваться дополнительное ограничение размера памяти. Запустите те программы для ДОС, которыми вы пользуетесь, или игры для ДОС, в которые играете, и проверьте их работу. Если программа не запускается или «вылетает» в процессе работы, уменьшите значение параметра на 1-2 единицы в четвертом разряде. Скорее всего, этого будет достаточно.
  5. Настройка кэша диска.

    Эта настройка не требует подбора, но ее желательно выполнять после установки всех драйверов. Щелкните на значке Мой компьютер, выберите из появившегося меню команду Свойства и откройте вкладку Устройства. Выделите значок Компьютер и нажмите кнопку Свойства. В открывшемся окне выберите переключатель Память. В появившемся списке распределения адресов найдите первую запись из четвертого гигабайта (диапазон c0000000-ffffffff). Возьмите шестнадцатеричное число, с которого она начинается, вычтите из него c0000000, переведите получившуюся разность в десятичный вид и разделите на 1024 (все указанные вычисления легко выполнить с помощью стандартного калькулятора Windows, переведя его в инженерный вид). Получившееся число - максимально допустимая величина кэша диска (она указывается в килобайтах). Откройте файл system.ini, найдите раздел [VCache] и добавьте в него строку MaxFileCache=ххх, где вместо ххх должно быть вычисленное вами значение.

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

Теперь у вас не должно быть проблем, вызванных большим количеством памяти.

Но на тот случай, если Windows 98 - единственная ОС на вашем компьютере, дам один совет. Не старайтесь увеличивать количество памяти сверх того, на котором может работать Windows. В ряде случаев наблюдается обратный эффект: после добавления очередного модуля может потребоваться установить новый, более низкий предел используемого ОЗУ.

Есть примеры, когда на машинах, работавших с 1 Гб ОЗУ, установка второго гигабайта заставляла ограничивать объем используемой памяти примерно до 900 Мб, то есть объем используемой памяти не только не возрастал, но даже уменьшался. На моем компьютере при установленных 2 Гб WinMe требовала лишь незначительного ограничения памяти, а после добавления третьего гигабайта физической памяти объем, используемый Windows, пришлось ограничить полутора гигабайтами. То есть увеличение фактического объема ОЗУ уменьшило объем, который может использовать система.

Так что прежде чем вкладывать деньги в память, постарайтесь предварительно проверить, как именно ваши компьютер и ОС отреагируют на ее расширение. На практике верхними границами чаще всего оказываются гигабайт с небольшим для Windows 98 и чуть менее 2 Гб - для WinMe.

В заключение выражаю благодарности компании «Элмер» за комплектующие, предоставленные для изучения описываемой в статье проблемы, и Михаилу Валериановичу Жилину за критику и советы, которые помогли сделать эту статью лучше.

3 ноября 2005 Г.

Windows 9x : i

Windows 9x : i

. , , . , , . , , , . , , - . , , - . , . .

Windows 98 Windows Me , . - , «» , , Windows 2000 .

- , .

, , , . , , . , . WinXP , - . - !

Windows 98 Windows Me , .

, , . , Windows 98 512 .

, . , Windows 98 ( Win98 , : Win98, Win98SE WinMe), 4 . . - Windows 98 .

, 512 , . , , , , «» .

512 , , , , . , .

«» , . - Win98 WinXP.

? , Microsoft. , , : 184447, 253912, 304943, 311871.

, . , .

311871. , , -MVP, , Windows 98, .

, 1 , . 2 , - , , , .

(, ) Windows 98 . 1998 - Windows 98 (, RC0, , -, ) . Windows. 928 .

, . , : « 2 , - , , , ». , , , . , 16 .

512 , 1 , 768 512 - -.

253912 , . 304943 , .

, , Windows . , ?

, , . , - , , . .

, Windows .

32- 80386 4 . . , () , . , .

« » . « », . , , , . , . , - , , , . , , , , .

, , , .

- . , , .

, , . , , . « , » - . «» , , , .

, , . - - , , , , .

Windows 98 (. . ). , - .

. 4 Windows. , , .

4 2 . , (, , 2 ), , , , , .

, . Windows , . , , , , . .

( c0000000-ffffffff) , . -, , , ( ). .

-, , (VCACHE), .

-, (, ) -, .

-, .

.

, , .

Microsoft ( VCACHE Windows 3.11 , 1993 ), - . , , IBM PC, 1980 , 64 , 1993 . , , 2006 256 . , .

, , . , , .

. , , . , 800 .

- . , , , , (EGA VGA).

32- . - , , . .

, . : , ( ), , - , . . , .

.

Windows XP NT, Windows 98 - . , , , .

, , - .

, Windows. - . Windows - VMM.VXD. , - ( ) . , . , .

(), VMM.VXD, , system.ini, ( smartdrv, Windows smartdrv.vxd, smartdrv.exe).

. , , - . , . : , . . , , .

Windows , ( bootlog.txt) . Loading LoadSuccess , : SYSCRITINIT SYSCRITINTSUCCESS.

 bootlog.txt

, , VCACHE. , , 800 . . WinMe , .

- , , , , Windows 98 , Windows Me ( ). , . , .

, , , . .

, , . , - . , , , - .

, , ? , . Windows 98, Windows Me. , , ( ).

, : , , , Microsoft? , . , «» system.ini, [386Enh]. , , .

- . ? .

, , , - , . ?

( , Windows 98 , ), : - , - .

. , Windows BootGUI=0. Windows , MS-DOS. « Windows».

, , AGP, ( PCI-E, , ).

, ?

: , , - , (vxd), , . , . , VGA, , , , . , , , , - . VCACHE.

Windows, - . , . , VCACHE . .

, , . : .

, AGP , 0000000, 3,5 . . 524288 (512 ). , . , , , , -. .

- Windows 98 512 .

  1. , - 386 - - .

    config.sys himem.sys, Windows . - , , .

  2. WinMe, . - , system.ini. Win98 , (Command prompt only) edit.
  3. . .
    1. 512 512 , , , .
    2. , , , , .
    3. .
    3.3.

    3.1, : . 1 , , , .

    3.2, system.ini . , Windows, , ( Windows). system.ini, :
    [386Enh]
    MaxPhysPage=10000

    . 256 . , , .

    3.3 , Windows 98, ( ) WinMe.

    . Windows , Windows 98 Ctrl, Command prompt only. Windows Me .

    system.ini, [386Enh] MaxPhysPage=. Windows 98 40000, WinMe - 60000. , . , . , .

  4. . , 3, , .

    . . , 40000 50000, 48000 ( - , ). , 4c000, - 44000 . , , 16 , - .

    1. , . , , , , . «» , 1-2 . , .
  5. .

    , . , . . . ( c0000000-ffffffff). , , c0000000, 1024 ( Windows, ). - ( ). system.ini, [VCache] MaxFileCache=, .

    , .

, .

, Windows 98 - , . , Windows. : , .

, , 1 , 900 , , . 2 WinMe , , Windows, . , .

, , . Windows 98 2 - WinMe.

«» , , , .