пятница, 12 июня 2009 г.

Миф: вам нужно включать /3GB, если у вас есть больше 2 Гб памяти

Это перевод Myth: You need /3GB if you have more than 2GB of physical memory. Автор: Реймонд Чен. Альтернативный перевод (C стиль).

Физическая память - это не виртуальная память.

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

Хотя это напомнило мне одну историю.

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

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

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

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

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

Я прямо уже слышу, как люди говорят: "Microsoft не следовало делать что либо для поддержки этих бажных драйверов. Лучше бы машина вылетала - это был бы пинок разработчикам драйвера, чтобы они выпустили нормальную версию". Да, конечно же, но это предполагает, что по вылету вы смогли бы определить драйвер, который его вызвал. Самое частое проявление блуждающего указателя в режиме ядра - это повреждение памяти, что означает, что вылетающий компонент - это не тот, в котором была проблема.

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

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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

Примечание. Отправлять комментарии могут только участники этого блога.