Миф: Необходимо использовать опцию /3GB, если в компьютере более 2Гб физической памяти.


Перевод с блога The Old New Thing. Оригинал здесь.

По-моему, это очередной ложный вывод. Я не уверен точно, что привело к возникновению этого мифа. Это не может быть недоразумением насчет отображения физической и виртуальной памяти один-к-одному, потому это такое отображение, очевидно, таковым не является. У вас, как правило, гораздо больше виртуальной памяти, чем физической. Свободная физическая память никак не проявляется ни в одном виртуальном адресном пространстве.

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

Здесь уместно вспомнить историю.

В Windows/386 так получилось, что ядро отображало всю физическую память в виртуальное адресное пространство режима ядра. Была такая функция _MapPhysToLinear. Вы передавали ей диапазон физической памяти, а она возвращала начальный адрес диапазона линейных адресов, которые можно было использовать для доступа к этой физической памяти. Некоторые разработчики драйверов обнаружили, что ядро отображает всю физическую память и просто присваивали своим указателям адреса из этого единого отображения. В результате, они вызывали _MapPhysToLinear(0, 0x1000) и всякий раз когда они хотели обратиться к физической памяти, они просто прибавляли адрес к значению, которое вернула функция _MapPhysToLinear. Другими словами, они предполагали, что

 _MapPhysToLinear(p, x) = _MapPhysToLinear(0, x) + p

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

Конечно, драйвера, которые основывались на старом поведении теперь не работали, поскольку больше не было такой недокументированной особенности.

В результате, когда загружается Windows 95, она смотрит, загружены ли драйвера, знакомые с этой недокументированной особенностью. (Windows 3.1 не поддерживала динамически загружаемые драйвера, так что проверки во время старта операционной системы было достаточно). Если таковые имелись, тогда Windows отображала всю физическую память  в виртуальное адресное пространство ядра, чтобы драйвера могли работать. Это растрачивало адресное пространство но сохраняло работоспособность системы.

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

Например, в Windows 95, практически все "синие экраны" в VMM(01) происходили в результате порчи памяти. VMM(01) это часть ядра Windows 95, которая никогда не попадает в своп; там живет менеджер памяти. Если драйвер повреждает динамическую память ядра, синий экран в менеджере памяти является характерным проявлением такой ошибки.

Реклама
Запись опубликована в рубрике память. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s