Компьютеры все совершенствуются и совершенствуются, а память все дешевеет и дешевеет. Kоличество вопросов «Почему Windows не видит все мои четыре гигабайта» в последнее время увеличивается даже не в арифметической, а в геометрической прогрессии. Предупреждение. В данной статье рассматриваются 32-разрядные версии Windows. Во всех случаях, когда разрядность системы не упоминается, речь идет именно о них. Компьютеры все совершенствуются и совершенствуются, а память все дешевеет и дешевеет. Одиннадцать лет назад модуль памяти объемом четыре мегабайта стоил сто с небольшим долларов. С тех пор цены упали на три порядка - почти за те же деньги сейчас можно купить четыре гигабайтовых модуля. Системные платы для домашних компьютеров, поддерживающие установку четырех и даже восьми гигабайт оперативной памяти, перестали быть экзотикой, а удешевление памяти сделало покупку и установку ОЗУ такого размера реальными. Еще раз уточню, что речь идет именно о домашних компьютерах и о массовых рабочих компьютерах, поскольку серверы достигли этого рубежа достаточно давно, да и для серьезных рабочих станций такой объем ОЗУ уже не в новинку. А вот рядовые пользователи лишь недавно получили возможность приобрести по приемлемой цене компьютер с четырьмя гигабайтами ОЗУ или расширить до этого предела память в уже имеющемся компьютере. Поэтому количество вопросов «Почему Windows не видит все мои четыре гигабайта» в последнее время увеличивается даже не в арифметической, а в геометрической прогрессии. Ответ на этот вопрос начнем с небольшого экскурса в теорию организации ЭВМ и в историю развития семейства этих машин, совместимого с IBM PC. Оперативная память ЭВМ практически всегда работала на несколько порядков быстрее, чем устройства внешней памяти или ввода-вывода. Поэтому для разработчиков было вполне логичным разделить операции обращения к ОП и к другим устройствам. К памяти шло непосредственное обращение, а операции ввода-вывода и работа с внешними устройствами выполнялись через специальные регистры - порты. С другой стороны, такое разделение усложняло систему команд, и в ряде моделей для обращения к устройствам была выделена область адресов памяти, в которой и размещались регистры устройств. По второй модели, в частности, была спроектирована знаменитая PDP-11: ее шестьдесят четыре килобайта адресного пространства были разделены на две части - 56 для оперативной памяти и восемь для устройств. Установка модуля ОЗУ полного объема (64 КБ) приводила к тому, что одна восьмая его часть просто не могла быть использована. Компания Intel с самого начала, с модели 4004 использовала первый подход: одно адресное пространство для ОЗУ и ПЗУ, а другое, отдельное пространство портов ввода-вывода - для остальных устройств. Такое решение, конечно, давало возможность полностью использовать все адресное пространство под память. Но оно имело и отрицательные стороны. Обращение к портам обычно занимает больше времени, к тому же оно не совместимо с технологией прямого доступа в память, заметно увеличивающей скорость обмена данными и разгружающей центральный процессор. Поэтому разработчики компьютеров и периферийных устройств уже достаточно давно стали совмещать ввод-вывод через порты с прямым обращением в оперативную память устройства. Но чтобы обратиться к памяти устройства напрямую, эта память должна быть расположена в общем адресном пространстве. Если взять классический ПК, выпущенный в 1981 году, то его адресное пространство было поделено на две части в соотношении пять к трем. Первая часть отводилась для ОЗУ, а вторая - для ПЗУ самого компьютера (программа самотестирования - POST и базовая система ввода-вывода - BIOS) и для ПЗУ и ОЗУ устройств. Уже самый первый видеоадаптер MDA имел свою оперативную память, находящуюся в общем адресном пространстве памяти. Следует обратить внимание, что та часть адресного пространства, которая занята устройствами, не может быть одновременно использована для основной памяти компьютера. Ведь если на обращение к ячейке памяти будут откликаться два устройства, то возможны конфликты между ними и, как следствие, нарушение работы компьютера. Когда в 1985 году компания Intel выпустила процессор 80386, то при разработке компьютеров на его основе были приняты два решения. Во-первых, распределение адресов в первом мегабайте было оставлено неизменным ради совместимости с предшествующими моделями компьютеров и разработанными для них программами. Во-вторых, для реализации преимуществ 32-разрядной архитектуры было предусмотрено, что устройствам, нуждающимся в использовании адресного пространства памяти, выделяется четвертый гигабайт. Возможно, сейчас кому-то это решение и кажется опрометчивым, но тогда гигабайты памяти казались чем-то фантастическим. Да и вряд ли кто-то мог в то время предположить, что эта архитектура проживет еще как минимум двадцать лет. Впрочем, как оказалось, на самом деле решение вовсе не было опрометчивым: для работы видеоускорителей жизненно важна возможность прямого доступа драйвера к видеопамяти. Ведь альтернативой является пословная запись данных в порт, и тогда можно забыть, к примеру, о современной графике в играх. Чтобы получить примерное представление, как бы это выглядело, можете сравнить поведение дисковой системы в режиме прямого доступа в память (UDMA) и в режиме программного ввода-вывода (включите режим PIO 1 в настройках контроллера дисков, только не забудьте потом вернуть исходные настройки). Итак, в IBM PC/386 и во всех последующих совместимых компьютерах (а именно эта архитектура господствует сейчас на рынке персональных компьютеров) ОЗУ в адресном пространстве занимало нижние области, а остальное оборудование - от верхней границы 4 Гб вниз. Причем долгое время никто всерьез не беспокоился об этом четвертом гигабайте - единицы или десятки килобайт буферов сетевого адаптера и контроллера дисков и считанные мегабайты памяти видеоадаптера погоды не делали. К тому же для домашних и рабочих компьютеров такой объем памяти был просто нереален, а для установки большого количества памяти в мощные рабочие станции и серверы было предложено другое решение, о котором будет рассказано ниже. Первый серьезный скачок в «отжирании» у ОЗУ адресного пространства сделала технология AGP. С появлением видеоадаптеров с аппаратными ускорителями вывода трехмерных изображений резко увеличилась потребность в объеме оперативной памяти такого адаптера. Технология AGP дала возможность в случае необходимости (нехватки собственной памяти) использовать для нужд видеоадаптера часть основной памяти компьютера. Необходимость быстрой работы с памятью видеоускорителя диктовала размещение всего объема этой памяти в физическом адресном пространстве. Поэтому оборудование AGP резервирует для своих нужд адресное пространство, которое до недавних пор было гораздо больше, чем размер видеоОЗУ. Обычно резервируется 256 Мб, причем не имеет значения, сколько памяти установлено в видеоадаптере. Появление PCI-E принципиальных изменений не принесло - изменился физический интерфейс, а организация использования видеопамяти осталась той же. Чтобы наглядно показать, как количество доступного объема ОЗУ связано с использованием физического адресного пространства устройствами, приведем две картинки - окно свойств компьютера и окно диспетчера устройств с распределением ресурсов памяти. Использовался видеоадаптер со 128 Мб ОЗУ. Свойства системы Диспетчер устройств Операционная система использует 3,25 Гб ОЗУ из четырех установленных, и эта величина в точности соответствует нижней границе адресного пространства, используемого видеоадаптером (портом PCI-E): шестнадцатеричное значение d0000000. Обратите внимание, что отведены для видеоадаптера адреса с d000000 по dfffffff, то есть 256 Мб. Драйверы устройств не устанавливались (в значках устройств стоят вопросительные знаки) сознательно, чтобы продемонстрировать, что дело не в них. Для ограничения доступного для ОЗУ адресного пространства достаточно физического присутствия устройства на шине, и не имеет значения, используется оно или нет. Впрочем, установка всех драйверов картину не меняет. В 32-разрядной Windows Vista дело обстоит точно так же - системе доступно 3,25 Гб ОЗУ. Свойства системы в Windows Vista И было бы странно, если бы доступно оказалось другое количество памяти - ведь оборудование-то одно и то же, и адреса оно отнимает у оперативной памяти одни и те же независимо от того, какая установлена ОС. Проверим, как влияет на доступный объем ОЗУ размер памяти видеоадаптера. Заменим плату со 128 Мб на такую же модель, но с 512 Мб. Диспетчер устройств Как видим, ничего не изменилось. Размер используемого адресного пространства задается не самим адаптером, а оборудованием шины AGP или PCI-E. В рассмотренных примерах самый младший из адресов устройств был использован видеоадаптером. Правда, надо отметить, что количество устройств на системной плате было невелико и относительно стандартно для новых плат. Добавление каких-либо плат в гнезда системной платы (или интегрирование дополнительных устройств в плату ее изготовителем) может привести к тому, что добавленное устройство займет адреса младше, чем у других устройств. Тогда доступный ОС объем ОЗУ еще больше уменьшится. С другой стороны, адреса устройств могут распределиться так, что новое устройство займет свободные области между уже имеющимися устройствами, и тогда уменьшения доступного системе ОЗУ не произойдет. Например, когда в компьютер автора были добавлены два ТВ-тюнера, они заняли адресное пространство выше, чем видеоадаптер, и уменьшения доступного системе ОЗУ не произошло. С другой стороны, когда те же два тюнера стояли в старом компьютере автора с системной платой на базе i865, они занимали адресное пространство ниже видеоадаптера (и уменьшали бы доступный объем ОЗУ, если бы памяти на том компьютере было больше 3 Гб). Например, установка четырех видеоадаптеров может заметно ограничить размер используемого ОЗУ (показанная таблица распределения ресурсов была приведена на форуме 3Dnews участником HarfulL). Как видно, видеоадаптеры заняли четыре области адресного пространства по 256 Мб каждая, начинающиеся на границах 2,5, 2,75, 3,0 и 3,25 Гб. (В данном примере был установлен только один гигабайт ОЗУ). У любопытного читателя уже наготове вопросы: а каким образом адреса распределяются между устройствами? Можно ли каким-нибудь способом «сдвинуть» все адреса в одну сплошную кучу и освободить для ОЗУ дополнительно десятки или даже сотни мегабайт адресного пространства? Адреса (а также порты ввода-вывода, а на шине ISA - еще и прерывания) определяются дешифратором устройства. Настройки этого дешифратора обычно можно менять в некоторых пределах, заданных изготовителем. До середины девяностых годов такая настройка выполнялась установкой или удалением специальных перемычек на устройстве. И задача конфигурирования компьютера с несколькими дополнительными устройствами была не слишком простым делом. Поэтому была предложена технология plug-and-play. В то время она была у всех на слуху, а сейчас стала совершенно обыденным явлением. Суть этой технологии в том, что используемые устройством адреса памяти, порты ввода-вывода и линии прерываний могут конфигурироваться программно. Это делает либо BIOS на этапе подготовки компьютера к загрузке, либо операционная система в ходе своей загрузки. Программа конфигурирования опрашивает устройства, определяет, какие ресурсы могут использоваться каждым из них, а затем распределяет эти ресурсы между устройствами. Границы конфигурирования каждого устройства задает его изготовитель. Причем для упрощения дешифраторов адресов ступени конфигурирования обычно кратны размеру ресурсов, используемых устройством. Например, если некая «железка» имеет ОЗУ размером 32 Кб, то и начальный адрес, как правило, можно установить только кратным этому размеру или даже большей величине. В результате сдвигать адреса разных устройств «вплотную» не оказывается возможным, хотя теоретически эта задача и реализуема. Вывод 1. Хотя 32-разрядные версии Windows XP и Windows Vista могут использовать четыре гигабайта ОЗУ, из-за ограничений, накладываемых архитектурой используемого оборудования, эта величина обычно оказывается в пределах 3-3,5 Гб. Вывод 2. Добавление устройств, использующих шины PCI или PCI-E, может уменьшить количество доступного системе ОЗУ. В таких случаях можно рекомендовать рассмотреть замену внутренних модулей на устройства с аналогичной функциональностью, подключаемые к интерфейсу USB. Возможно, читатель уже обратил внимание, что про серверные варианты ОС пока не было сказано ни слова. И этому есть свои причины - в серверных версиях дело обстоит несколько по-другому. Например, на том же самом компьютере с тем же самым оборудованием 32-разрядный Windows Server 2003 Standard Edition «видит» практически все четыре гигабайта, хотя устройства занимают в четвертом гигабайте те же самые адреса. Свойства системы Диспетчер устройств Как такое может быть? Вернемся в середину девяностых годов. В то время для серверов верхнего уровня (разговор пойдет только о серверах с архитектурой IBM PC) стала актуальной задача увеличения объема памяти сверх четырех гигабайт. Никакой Америки для этого открывать не понадобилось - «всё уже украдено до нас». Технология расширения объема памяти была неоднократно использована в самых разных ЭВМ. К оборудованию добавляли аппаратный диспетчер памяти, который во взаимодействии с операционной системой обеспечивал расширение физического адресного пространства памяти. Память при этом делилась на отдельные страницы, размер которых определялся характеристиками аппаратного диспетчера. Новую (для платформы PC/386) технологию назвали расширением физических адресов (PAE - Physical Address Extention) и воплотили ее в процессорах Pentium Pro. Компьютеры на этих и всех последующих процессорах могут (при наличии соответствующей системной платы, конечно) использовать не 32-х, а 36-разрядную шину адреса, что дает возможность установить до 64 Гб ОЗУ. Следует подчеркнуть, что речь идет о расширении именно физических адресов. Процессор при этом остается 32-разрядным, все программы также используют 32-разрядную адресацию и напрямую могут обращаться только к четырем гигабайтам. Чтобы дать возможность программам использовать большее количество памяти, в Windows была добавлена еще одна технология - AWE (Address Windowing Extension – оконное расширение адресов). В адресном пространстве программы выделялось окно, в которое отображался участок выделенной программе памяти. Например, программа запрашивает и получает для своих нужд 16 Гб, но может обращаться к ним только через окно размером один гигабайт. Чтобы получить доступ к нужному участку памяти, следует переместить окно в требуемое положение, при этом остальные 15 гигабайт оказываются недоступными. Если нужно обратиться к другому участку памяти - еще раз перемещаем окно и так далее. Программу при этом приходится усложнять, причем на обычных компьютерах, не серверах, такое усложнение оказывается практически бесполезным. Поэтому неудивительно, что поддержку AWE можно увидеть только в серьезных серверных приложениях, количество которых, говоря фигурально, позволяет пересчитать их по пальцам. При использовании расширения физических адресов, во-первых, процессору становится доступной память в физических адресах выше четырех гигабайт. Во-вторых, системная плата может «перекинуть» в область выше четырех гигабайт ту оперативную память, расположенную в четвертом гигабайте, которая заблокирована из-за возможности конфликтов с устройствами. Следует подчеркнуть, что для этого необходимо наличие двух обязательных условий: системная плата должна поддерживать расширение физических адресов; в операционной системе должен быть включен режим PAE. Несоблюдение хотя бы одного из них приводит к невозможности использования адресов выше четырех гигабайт. Например, никакие ухищрения и шаманские пляски с бубном не помогут системе увидеть все четыре гигабайта на системных платах на базе i945. Выполнение первого условия можно проверить по документации к системной плате. Правда, далеко не всегда в описании платы можно найти «волшебное» слово PAE. Чаще используется (в описании платы или настройках BIOS) выражение memory remap или близкие к нему. Выполнение второго условия в последнее время часто обеспечивается автоматически. Если процессор поддерживает аппаратную защиту от исполнения данных (Data Execution Prevention - DEP), то Windows XP со вторым пакетом исправлений, Windows Server 2003 с первым и более поздними пакетами исправлений и, конечно, Windows Vista по умолчанию включают эту защиту, а вместе с ней и PAE. К таким процессорам относятся все семейство 64-разрядных процессоров АМД, все процессоры Intel с поддержкой технологии EM64T и некоторые чисто 32-разрядные процессоры семейства Pentium 4. Если процессор более старый либо если используются более старые версии Windows, можно включить режим расширения физических адресов принудительно. Для этого надо добавить в строку запуска данной ОС в файле boot.ini параметр /PAE. Если режим расширения физических адресов включен, то в окне свойств компьютера появляется строчка «Расширение физических адресов» (последнее слово временами не помещается в отведенное для надписи место и обрезается). Посмотрите еще раз на окно свойств компьютера с установленным WS2003. Расширение физических адресов включено, и система видит практически все четыре гигабайта. Внимательный читатель, конечно же, уже дергает меня за рукав: но ведь в окне свойств XP SP2 тоже есть такая надпись. Значит, эта система тоже работает в режиме расширения физических адресов? Но почему же тогда ей доступно лишь три с небольшим гигабайта? Да, Windows XP SP2 в данном случае по умолчанию включила режим PAE для обеспечения поддержки DEP. Но, в отличие от Windows Server 2003, в Windows XP расширение физических адресов реализовано лишь частично. Эта система не поддерживает 36-разрядную адресацию памяти, Даже с включенным PAE она имеет то же самое 32-разрядное адресное пространство, что и без этого режима. Так что даже принудительное включение РАЕ не добавит в распоряжение системы ни одного байта. Впрочем, если установить Windows XP с первым пакетом исправлений или исходную версию вообще без пакетов (что автор по некоторым причинам категорически не рекомендует делать на современных компьютерах), то расширение физических адресов даст системе возможность увидеть все четыре гигабайта. Но стоит только добавить SP2, как количество памяти сразу уменьшится. Причина в том, что в 32-разрядных Windows XP SP2 (а также будущем SP3) и Windows Vista расширение физических адресов есть, но в то же время его как бы и нету. Причина проста и банальна – обеспечение совместимости с драйверами, написанными без учета возможного включения РАЕ. Остановимся на этом чуть подробнее. Все программы и сама ОС работают в виртуальных адресных пространствах. Пересчет (трансляция) виртуального адреса в физический происходит не в один этап, а в два без режима расширения физических адресов и в три этапа при включении этого режима. После того, как в ходе разработки второго пакета исправлений режим РАЕ был включен по умолчанию, оказалось, что не все драйверы умеют работать в этом режиме. Расширение физических адресов испокон веков (фигурально выражаясь, конечно) было особенностью серверных систем. Поскольку драйверы работают с физическими адресами, они должны понимать усложненный процесс трансляции адресов при включенном РАЕ. И разработчики драйверов для серверных версий это учитывали. Разработчики же драйверов, предназначенных для обычных рабочих и, тем более, домашних компьютеров могли и упростить себе работу - зачем предусматривать алгоритм работы с включенным РАЕ, если он не используется? Ведь без него и программировать меньше надо, и работы по тестированию меньше делать. Но если такой драйвер оказывался в системе с включенным расширением физических адресов, то с достаточно высокой вероятностью он мог «порушить» управление памятью системы, что привело бы в лучшем случае к неработоспособности устройства, а в худшем – повреждению данных или сбою в работе системы (синему экрану). А ведь для повышения безопасности системы надо было включать в процессоре защиту от исполнения данных и, как следствие, режим расширения адресов. Поэтому для совместимости со всеми ранее написанными для Windows XP драйверами было принято компромиссное решение - чтобы режим РАЕ включался, добавлял третий этап в процесс транслирования адреса, но ничего на этом третьем этапе не изменял. Фактически это означает, что расширения адресного пространства не происходит и система имеет те же четыре гигабайта физических адресов. А часть этих адресов, как мы помним, заняты устройствами. Вывод 3. Windows XP SP2 и Windows Vista увидеть все четыре гигабайта ОЗУ (если они установлены) просто не в состоянии, и изменить это нельзя. Тем, кто уже потратил свои кровные денежки на четыре гигабайтных модуля остается либо смириться, что часть их окажется неиспользованной, либо переходить на 64-разрядные версии ОС. Замечание. Время от времени можно увидеть совет по увеличению памяти, доступной системе: добавить в файл boot.ini параметр /3GB. На самом деле этот совет, как говорится, не из той оперы. Этот параметр обеспечивает перераспределение виртуального адресного пространства приложений между ними и системой, но никак не влияет на работу с физической памятью. Так стоит ли покупать для компьютера с 32-разрядной Windows четыре гигабайта памяти, если это не сервер? В общем случае ответ зависит от того, планируете ли вы вскоре переходить на 64-разрядную версию (под «вскоре» в данном случае понимается время до замены компьютера на новый или до достаточно серьезной его модернизации). Если переход не планируется, то часть из этих четырех гигабайт окажется неиспользуемой. Сколько именно не будет использоваться, зависит от конфигурации оборудования, но обычно эта величина составляет 0,75–1 Гб. Поскольку в современные компьютеры модули памяти обычно вставляются парами, то альтернативой четырем гигабайтам являются конфигурации 2х1 Гб или 2х1 Гб + 2х512 Мб, причем первый вариант оставляет (как правило) возможность расширения, а второй дает больше памяти. Но ведь, как известно, адресное пространство (виртуальное), выделяемое процессу на его нужды, составляет 2 Гб. То есть подавляющее большинство программ не смогут использовать больше двух Гб ОЗУ. Так есть ли смысл ставить третий гигабайт? Вполне может быть, что есть. Все зависит от того, сколько памяти требуется запускаемым одновременно задачам. Даже если «тяжелая» задача больше двух гигабайт получить и не сможет, она, тем не менее, сможет использовать все свои два гигабайта, если система и другие запущенные задачи возьмут свою долю памяти из третьего гигабайта. Да и дисковый кэш не будет конкурировать за память с этой «тяжелой» задачей. Вот только не стоит оценивать загрузку памяти по интенсивности работы жесткого диска, как это нередко делается. Немало игр рассчитаны на подгрузку новых данных, а не забивание ими памяти, и будут активно обращаться к диску, даже если памяти более чем достаточно. Впрочем, использование памяти – это тема для отдельной статьи. При написании статьи использовалось оборудование, предоставленное компанией «Элмер», за что автор выражает ей свою признательность. Игорь Петрович Лейко (MS MVP — Windows Shell/User) Опубликовано — 12 декабря 2007 г
Источник: http://www.ixbt.com/soft/windows-4gb.shtml |