Проблемы Windows XP, Ramdisk Plus и памяти 4ГБ
реклама
Поэтому, чтобы попробовать отсечь ряд вопросов, которые возникают, в основом, у пользователей 32-битной Windows XP, я решил написать небольшое дополнение и именно по этой ОС. Хотя лично я уже практически ей не пользуюсь, за редким исключением, две OEM лицензии – на ноутбуках и еще одна – на десктопной машине, бывшем полигоне CUDA до выхода ее 64-битной версии 2.0, и хранилищем ряда устройств, 64-битные драйвера которых так и не появятся. Плюс иногда там запускается дремучий софт. Ну и еще на этих трех машинах разные антивирусы, тоже иногда интересно. Да и не к чему сносить легальный и пока еще актульный софт. Но интереса к 32-битным ОС у меня не осталось никакого. Меня полностью устраивает Vista64, как в плане надежности, так в плане возможностей, а недостатки есть и будут у любых ОС, достоинства их с лихвой перекрывают.
Тем не менее, далее речь пойдет о 32-битной Windows XP, где это не будет оговорено особо.
Заметка не претендует на полноту и системность изложения, использует упрощенный подход к проблеме, и не гарантируется 100% безошибочности суждений, поэтому автор с благодарностью примет все обоснованные замечания, предложения и дополнения и исправит допущенные промахи. Так как я уже год как перестал читать ветки по Windows на этом форуме, то возможно, что об этом уже писалось, но в весь материал заметки авторский и не основан на других материалах. Впрочем, нельзя не упомянуть книгу Русиновича & Cоломона, хоть это и библия Windows, но, также как и священное писание, она генерирует больше вопросов, чем дает ответов.
Начнем с того, что такое “32-битная” ОС? Разрядность ОС определяется, в первом приближении, разрядностью указателей (ну, или эквивалентных по логике понятий в разных языках системного программирования).
То есть, это дает возможность направить (или получить) данные на 2^32 адреса. Если по всем этим адресам будет находиться по одному байту RAM, то в итоге мы получим возможность читать и писать в 4GB RAM.
Допустим, мы установим 4GB памяти в систему, и сможем адресовать каждый драгоценный байт этой памяти. Диапазон доступных физических адресов будет, в шестнадцатеричной системе счисления, от 0 до FFFFFFFF. Обычно, для указания шестнадцатеричного числа, чтобы отличить его от десятичного, в конце добавляется постфикс h, или, в программировании, префикс 0х и нижний регистр, например 0хffffffff или 0х0ffffffff (десятичное число 16 соответствует шестнадцатеричному 10, и без указания основания системы счисления непонятно, что имеется в виду).
Но как тогда заставить что-нибудь попасть в эту память?
Технически, конечно, это можно организовать, но путь получится крайне неэффективным и сложным. Поэтому намного лучшее решение - обеспечить адресацию требуемых для работы системных устройств так, чтобы доступ к ним и требуемой для их работы буферной памяти лежал внутри легкодоступного 32-битного адресного пространства. То есть, придется забрать часть физических адресов у RAM. Теперь по этим адресам можно будет, например, расположить буфер IO устройств PCI, но на это адресное пространство будет уменьшаться доступный для ОС размер RAM.
Поэтому, физическое адресное пространство распределяет, в основном, материнская плата, с тем, чтобы все устройства (как установленные, так и те, которые возможно установить в слоты и разъемы расширения), были бы доступны в 32-х разрядном адресном пространстве.
При загрузке одна из задач ОС – подсчитать количество доступной RAM, которую она может использовать. Не надо считать, что она “не видит” всей установленной памяти, так как и BIOS рапортует об этом. 32-битная Vista SP1 уже показывает, сколько на самом деле установлено памяти на борту (но там также искусственно ограничен к ней доступ, если ее больше 3 ГБ). Впрочем, помимо BIOS это число и так известно, так как большинство читающих этот материал самостоятельно (надеюсь) подсоединяют свои модули памяти.
Считается память просто – через определенный интервал сканируется все физическое адресное пространство, идет попытка чтения (так как могут, например, располагаться ROM периферии), или записи-чтения, что, в случае удачи, позволяет определить RAM. Адрес каждого протестированного 4КБ блока (страницы) памяти последовательно нумеруется и заносится в базу данных PFN (Page Frame Number) номеров страниц. Структура этой базы данных есть страшная тайна Microsoft, хотя, при желании, можно найти и описание структур, и исходники для того, чтобы попробовать их самому на зуб. Запись о каждой странице имеет информацию не только о физическом адресе, но и о ее состоянии – выделена, свободна, в режиме записи и т.д., и то, кому она выделена. Даже имеется поле с указанием, уж не через AWE ли она получена. Впрочем, я никогда API AWE не использовал - с сисадминства уходил с Novell, успев поставить только пару появившихся серверов с NT, а в то время еще объем 4ГБ казался почти фантастикой. Но RAMdisk и обошлась без AWE, управляя памятью самостоятельно.
Так как база данных с PFN жизненно важна для системы, и очень быстро меняется, то она постоянно обновляется в спинлоке (непрерывном цикле). Записи сформированы в связанные списки по типам состояния для быстрого просмотра.
Таким образом, ОС после загрузки всегда обладает информацией о количестве страниц памяти RAM и их состоянии. Так как, при сканировании физического пространства, вместо RAM зачастую встречались системные устройства материнской платы и установленного оборудования, а то и просто пустота, то общее число доступных байт RAM меньше максимально возможного 100000000h (максимальный физический адрес FFFFFFFFh +1, так как отсчет начинается с 0). Так как выделение памяти идет страницами по 4К (хотя, можно вплоть до 2М), то максимальный номер страницы RAM в PFN – FFFFFh. Делить на 4096 в 16-ричной системе счисления очень легко. Узнать, делится ли число на 4096 без остатка, просто – если три последние цифры нули – то делится. При этом достаточно эти нули просто отбросить. То есть, всего возможно (внутри 4Г диапазона) 100000000h байт RAM, максимально возможное число страниц будет 100000h, номер максимальной страницы на единицу меньше, так как отсчет с 0, то есть FFFFFh. Типовое значение в реальной системе будет ниже.
В качестве стенда для иллюстрации будет использоваться система, основанная на Asus M2N-VM DH c процессором X2 3800+, чипсет Nvidia 430 MCP со встроенной GF6150 SE (выбран видеобуфер 32 МБ), диск – СF 4ГБ Maxflash 266х, 4ГБ A-Data DDR2-800, DVD Asus 1814BLT, Wi-Fi от Realtek. ОС – мусорная 32-битная корпоративка Windows XP PRO RUS SP2. Все ненужное оборудование в BIOS выключено, впрочем на запрос ресурсов это может и не влиять.
(кликните по картинке для увеличения)
Размер видимой RAM и доступое число страниц
На правом скрине видим, что ОС может использовать 3,46ГБ. Кстати, несмотря на то, что установлен видеобуфер всего 32МБ, "видимой" ОС памяти стало меньше, чем со стоявшей 1600XT c 256МБ, тогда было 3,50ГБ. Слева – два окна из RAMdisk Plus, после активации прямой адресации. Первый свободный номер страницы DDEE0h. Ниже можно видеть и максимально доступный номер страницы, 11E11Fh. И все бы хорошо, да что-то нехорошо. Еще ниже строчка – 262270 доступных страниц RAM. Вот теперь явно видно, что это неправда, так как такое количество страниц дает больше гигабайта RAM. Учитывая, что 3,46ГБ использует ОС, в итоге получается, что всего в системе около 4,5ГБ RAM, чего быть не может, более 100000h страниц в системе просто не могут появиться, не установлено столько! Я не сразу сообразил, что меня дурят, но при 4ГБ RAM система с RAM-диском практически неработоспособна (в отличие, кстати, от Vista64). Стоит, правда, добавить памяти и уже появляются признаки нормальной работы, но из-за небоьшого времени тестирования определенно ничего сказать нельзя.
Как убедиться, что нас дурят? И виновата ли программа RAMdisk Plus? Может, на правом скрине ошибка, ведь доступной памяти, по данным на среднем скрине, всего 2960МБ?
Вооружаемся калькулятором Windows, переведя его в расширенный режим, чтобы можно было оперировать с шестнадцатеричными числами, запускаем редактор реестра и диспетчер устройств.
На самом деле, приведенный выше левый скрин надо читать таким образом: к числу страниц, обнаруженных внутри 4Г физического пространства DDEE0h, надо добавить “невидимые” 11E11Fh – 100000h = 1E11Fh страниц, отсчитанные от базы 100000h, в то время как программа почему-то считает их от DDEE0h. При создании небольшого (32МБ) диска в диапазоне от 100000h, видим, что программа по-прежнему считает, что существует около 500 МБ в регионе 0.
(кликните по картинке для увеличения)
Фейковый набор страниц объявлен доступным
Складываем, DDEE0h + 1E11Fh = FBFFFh.C учетом того, что я при включении “unmanaged memory” оставил резерв 64 МБ (32 МБ – видеобуфер, еще в 1МБ потребность матери видна через BIOS, остальное – подстраховка), что составляет ровно 4000h страниц, получаем число страниц
FBFFFh + 4000h = FFFFFh,
и, так как отсчет – с нуля (в DDEE0h уже это было учтено, а для "unmanaged"-нет), в итоге получаем 100000h страниц, то есть ровно 4ГБ памяти. Что и требовалось доказать.
Честно говоря, я не нашел информации, как физически представляется номер страницы. Возможны несколько вариантов, например сквозная последовательная нумерация найденных страниц. Тогда понятно, что после DDEE0h будет DDEE1h, DDEE2h и так далее до FFFFFh при 4ГБ. Кажется, с эти согласна и RAMdisk Plus, объявляя доступными страницы DDEE0h - FFFFFh.
Номер может быть физическим адресом, выровненным по размеру блока. RAMdisk Plus легко соглашается и с этим, заявляя доступность страниц 100000h - 11E11Fh.
Но эти два варианта взаимоисключающие.
Так как есть еще вариант, более реальный, с использованием внутреннего индексирования, то оба предыдущих могут быть использованы лишь как декораторы, но опять же, не одновременно.
Вероятно, следующие версии программы RAMdisk Plus исправят ситуацию, ибо что-то не так в нашем королевстве.
Посмотреть “живьем” на физические адреса можно в диспетчере задач, выбираем ресурс память и получаем расфасовочную простыню. Как узнать, где именно память? В регистре, как показано слева, выбираем Physical Memory и справа в окне щелкаем по Translated, в появившемся маленьком окне (скрин слева) выбираем Внутренний->Отобразить, вылезет большое окно, в котором и показывается физичиское размещение адреса в виде адрес – длина. Там всего три записи при 4ГБ (при большем RAM и x64 ОС появится еще строчка, но в диспетчере задач этого диапазона уже видно не будет), но окно на две строчки (и не расширяется), можно посмотреть, чему эти адреса соответствуют в диспетчере задач. Естественно, адресам системной платы. Если сложить длину всех блоков, то получим также 3,46ГБ. Так что, слава Microsoft, позор SuperSpeed, золотому партнеру славного Microsoft.
(кликните по картинке для увеличения)
Распределение физических адресов
Кстати, по поводу точности измерений памяти в Windows есть замечательная MS KB 935268, описывающая, почему ее семь разных программ, из комплекта одной ОС, показывают семь разных значений :
“Each component reports a slightly different amount of total RAM that is available on the computer. This behavior occurs because some components were designed to display a consumer-friendly amount of RAM. Additionally, each component was developed by different teams at different times for a particular purpose. “
Вспоминаются сразу первые записи блога Русиновича, полные нескрываемого сарказма в адрес Мicrosoft и ее продукции, по разным ляпам, датировка – 2005 год, в то время уже вышло четвертое издание Windows Internals (а его редактировал и Катлер, и вся МS, курировал вицепрезидент Джим Олчин). После 2006 (года покупки Русиновича вместе с его компаниями) иронии к MS стало намного меньше – он теперь и сам есть Microsoft.
На той же конфигурации, но в ее “родной” Vista64, распределение практически идентичное:
(кликните по картинке для увеличения)
Распределение физических адресов в Vista 64
Завершая про физическое пространство и память, несколько замечаний.
Виртуальное адресное пространство и физическое – совсем не одно и то же. Многие часто путают, говоря, к примеру, что ОС выделяет приложению до 2ГБ RAM, имея в виду общий принцип, что в корне неверно. Также нельзя по номеру страницы или ее физическому адресу определить априори, за кем она закреплена (за исключением очень небольшого числа системных страниц), так как они находятся в постоянном “движении”. Кстати, полезно прочитать и материалы Русиновича про “пользу” различных “оптимизаторов памяти”.
Пара риторических вопросов.
Является ли разрядность ОС ограничителем используемого физического адреса?
Нет. Серверные ОС легко преодолевают этот барьер. Ядро же 32-битной Windows XP не адресует более 4ГБ.
Является ли разрядность ОС ограничителем используемого объема физической памяти?
Нет. Ограничения по доступному объему памяти, после сервиспака, искусственно введены в Windows XP с тем, чтобы обезопасить ядро системы от появившихся многочисленных интерфейсных устройств и драйверов, некорректно использующих расширенную адресацию, чем, кстати, славилась Nvidia и еще ряд компаний с их дисковыми контроллерами.
Ограничения разрядности ОС, физически адресуемого адресного пространства, физической памяти - есть вещи относительно некоррелируемые и совпадения – всего лишь случайность.
http://msdn.microsoft.com/en-us/library/aa366778.aspx
Сюда же можно добавить и виртуальную память, так как часто многие путают виртуальные и физические адреса, в том числе и в ветке обсуждения моей статьи, и в перпендикулярной от serj. Если будут пожелания продолжить тему, то попозже можно и про виртуальную память добавить материал.
В заключение - сделаем вывод.
Рекомендовать использовать программу RAMdisk Plus при 4ГБ RAM на Windows XP нельзя, ибо многоглючна.
И не только в части информативности по несуществующим страницам, но и в реальных попытках лезть туда, куда не надо. Что приводит к явлениям вплоть до сноса загрузчика (разок получил), крахам системы, невозможности удаления созданного диска без удаления “unmanaged “ памяти и необходимости пары перезагрузок, засорению реестра в разделе “Mounted drives”, что приводит либо к невозможности создания дисков с заданными параметрами и буквой, либо создают с другой буквой. Также диск может быть создан без буквы и форматирования, при этом может форматироваться и присваиваться буква только в Disk Manager, а может и там не получиться. Может форматироваться только в FAT32, но не в NTFS. После создания диска нужно обязательно проверить его на запись всего объема, ибо создание диска чревато наличием непонятно откуда взятых страниц. Это еще не все. Некоторая неконсистентность есть и в возможности создания дисков с разным размером резерва и верхней границы, даже в пределах одной сессии, что можно было понять для Vistы, но не в XP.
Не забывайте про резерв. Крайне не рекомендую ставить мало. Смотрите, что пишется в BIOS, не жадничайте. На резервную память может быть больше желающих, чем кажется.
Так что готовых рецептов на все случаи можно и не дождаться.
Значительная часть вопросов снимается при установке более 4ГБ памяти в XP и на Vista64. Товарищи со звэрэдишн, гэймэдишн, etc, вопросов могут не задавать – не дается там доступ к “unmanaged”. Чего там недовложено – никакого интереса разбираться.
Все вышесказанное основано исключительно на собственном опыте, полезным будет почитать и опыт работы с продуктом, описанный при обсуждении матеиала другими участниками.
Попытался быстро найти буржуйские форумы с серьезным обсуждением продукта, но не попалось таких, хотя владельцы не пробных версий вроде не жалуются. Может, действительно полная версия немного другая, так как пробники разделяются только по разрядности, а коммерческие – еще и по типам ОС и имеют разные ценники.
Обсудить можно здесь .
07 октября 2008 года,
zauropod
реклама
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Сейчас обсуждают