“4GB will always be enough”
Oct 18, 2007 · CommentsОтладкаWindowsWow64
Порой разработчики приложений просто поражают своей храбростью и безудержным оптимизмом. Свежий пример - на днях получаю письмо с просьбой разобраться почему 32-битное приложение, нормально работавшее в Windows Server 2003 for Itanium перестало запускаться в Windows Server 2008 for Itanium. Что особенно приятно, так это то, что вместо традиционного «приложение падает, если сделать то, то и вот то», просто прислали сессию отладчика, остановленную непосредственно перед вызовом NtAllocateVirtualMemory, который и приводил к падению.
Сам вызов выглядел довольно невинно если не считать, что запрашивался блок памяти размером чуть более 1GB. После некоторого копания в незнакомом коде выяснилось, что размер запрашиваемого блока и был причиной - в адресном пространстве процесса просто не осталось свободного блока такого размера.
На этом мое расследование закончилось и я спихнул проблему на другого разработчика, так как все равно это не моя епархия, а дел по горло и т.д. Однако на следующий день этот баг всё равно вернулся ко мне. Как оказалось причиной все-таки скрывалась в Wow64. Одна из системных .dll, загружаемых этим процессом в Windows Server 2008 загружалась прямо по середине свободного адресного пространства, разбивая его пополам. В Windows Server 2003 же эта .dll ютилась на краю адресного пространства, никому при этом не мешая. Причиной этому были две вещи:
-
Базовый адрес .dll изменился с 0x7xxxxxxx на 0x4xxxxxxx;
-
Механизм dynamic rebase, который в обычных условиях не позволяет .dll занять «лучшее место в центре» не сработал на этот раз из-за того, что эта .dll была собрана с выравниванием на границу 4KB, а на IA-64 dynamic rebase работает только с библиотеками выровненными на границу 8KB.
В общем, починить эту проблему не составило труда. Однако оптимизм разработчиков приложения меня удивил. Затребовать больше половины адресного пространства одним куском и свято верить в успех этого безнадежного дела - это требует немалой выдержки. А если вспомнить, что набор системных библиотек разниться от версии к версии, да, к тому же, что в любой момент в процесс может внедриться посторонняя .dll, за какой-то своей надобностью, то вообще нужны стальные нервы, чтобы при этом спокойно спать.