В вычислениях на платформах Microsoft WoW64 ( Windows 32-bit on Windows 64 - bit ) — это подсистема операционной системы Windows, способная запускать 32-битные приложения на 64-битной Windows. [1] Она включена во все 64-битные версии Windows, за исключением Windows Server Server Core , где она является необязательным компонентом, и Windows Nano Server , где она не включена. [a] WoW64 стремится устранить многие различия между 32-битной и 64-битной Windows, в частности, связанные со структурными изменениями в самой Windows.
Подсистема WoW64 включает в себя облегченный слой совместимости , который имеет схожие интерфейсы на всех 64-битных версиях Windows. Она направлена на создание 32-битной среды, которая предоставляет интерфейсы, необходимые для запуска немодифицированных 32-битных приложений Windows на 64-битной системе. WOW64 реализован с использованием нескольких DLL, некоторые из которых включают: [3]
Wow64.dll
, основной интерфейс ядра Windows NT , который осуществляет преобразование (трансляцию) между 32-битными и 64-битными вызовами, включая манипуляции с указателями и стеком вызововWow64win.dll
, который обеспечивает соответствующие точки входа для 32-битных приложений (win32k thunks)Wow64cpu.dll
заботится о переключении процессора из 32-битного в 64-битный режим. Это вычислительно дешево, так как машины x86-64 имеют собственный режим для запуска 32-битного кода x86. [4]Wow64cpu.dll
«уровень абстракции ЦП»; IA32Exec.bin
программный эмулятор x86; и Wowia32x.dll
мост между эмулятором и системой WOW64. [6]xtajit.dll
для эмуляции x86 и wowarmhw.dll
для переключения в режим ARM32. [3]Подсистема WoW64 также обрабатывает другие ключевые аспекты запуска 32-разрядных приложений. Она участвует в управлении взаимодействием 32-разрядных приложений с компонентами Windows, такими как реестр , который имеет отдельные ключи для 64-разрядных и 32-разрядных приложений. Например, HKEY_LOCAL_MACHINE\Software\Wow6432Node является 32-разрядным эквивалентом HKEY_LOCAL_MACHINE\Software (хотя 32-разрядные приложения не знают об этом перенаправлении). Некоторые ключи реестра сопоставляются из 64-разрядных в их 32-разрядные эквиваленты, в то время как другие имеют зеркальное содержимое, в зависимости от редакции Windows.
Операционная система использует этот %SystemRoot%\system32
каталог для своих 64-битных библиотек и исполняемых файлов. Это сделано для обеспечения обратной совместимости, так как многие устаревшие приложения жестко запрограммированы на использование этого пути. При выполнении 32-битных приложений WoW64 прозрачно перенаправляет доступ к "system32" (например, загрузка DLL) в %SystemRoot%\SysWoW64
, который содержит 32-битные библиотеки и исполняемые файлы. Исключениями из этих перенаправлений являются: [7]
%SystemRoot%\system32\catroot
%SystemRoot%\system32\catroot2
%SystemRoot%\system32\driverstore
(перенаправлено на Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP)%SystemRoot%\system32\drivers\etc
%SystemRoot%\system32\logfiles
%SystemRoot%\system32\spool
Перенаправление помогает поддерживать работу 32-разрядных приложений без необходимости знать о статусе WoW64. [7] Если 32-разрядное приложение хочет получить доступ к реальному %SystemRoot%\System32
, оно может сделать это через псевдокаталог, %SystemRoot%\sysnative
начиная с Windows Vista. [7] Определение статуса Wow64 возможно через IsWow64Process()
.
Существует два каталога Program Files, каждый из которых виден как 32-битным, так и 64-битным приложениям. Каталог, в котором хранятся 32-битные файлы, называется Program Files (x86) , чтобы различать их, в то время как 64-битная версия сохраняет традиционное имя Program Files без дополнительных квалификаторов. Перенаправление файловой системы не используется для поддержания разделения; вместо этого изменения WoW64 и аналогичные результаты запроса указывают программам установки на правильный каталог. [8]FOLDERID_ProgramFiles
Несколько новых каталогов также найдены в ARM64, где WOW64 обрабатывает не только запуск 32-битных программ x86, но и 32-битных программ ARM, которые используют SysArm32
вместо этого. ARM64 также поддерживает так называемый CHPE "compiled-hybrid-PE", который имеет код ARM64 в контейнере x86 dll (для более эффективной совместимости без эмуляции); эти dll находятся в SyCHPE32
. [9]
32-разрядные приложения, включающие только 32-разрядные драйверы устройств режима ядра или подключающиеся к пространству процессов компонентов, реализованных исключительно как 64-разрядные процессы (например, Windows Explorer), не могут выполняться на 64-разрядной платформе.
Поддерживаются 32-разрядные приложения-службы. Папка SysWOW64, расположенная в папке Windows на диске ОС, содержит несколько приложений для поддержки 32-разрядных приложений (например, cmd.exe, odbcad32.exe, для регистрации соединений ODBC для 32-разрядных приложений). 16-разрядные устаревшие приложения для MS-DOS и ранних версий Windows обычно несовместимы с 64-разрядными версиями Windows Vista, 7, 8 и 10, но могут быть запущены в 64-разрядной ОС Windows с помощью программного обеспечения виртуализации. С другой стороны, 32-разрядные версии Windows XP, Vista, 7, 8 и 10 обычно могут запускать 16-разрядные приложения с небольшими проблемами или вообще без них. 16-разрядные приложения не могут быть запущены напрямую в x64-редакциях Windows, поскольку ЦП не поддерживает режим VM86 при работе в x64.
Internet Explorer реализован как 32-разрядное и 64-разрядное приложение из-за большого количества 32-разрядных компонентов ActiveX в Интернете, которые не смогли бы подключиться к 64-разрядной версии.
Ранее 32-разрядная версия использовалась по умолчанию, и было сложно установить 64-разрядную версию в качестве браузера по умолчанию. Это изменилось в Internet Explorer 10, который запускал 32-разрядные надстройки внутри 64-разрядного сеанса, устраняя необходимость переключения между двумя версиями. Если пользователь заходил в 32-разрядную папку (обычно C:\Program Files (x86)\Internet Explorer) и дважды щелкал там файл iexplore.exe, 64-разрядная версия все равно загружалась. В Internet Explorer 9 и более ранних версиях это загружало только 32-разрядную версию.
По состоянию на 2010 год [обновлять]ошибка в слое трансляции версии x64 WoW64 [10] [11] также делает все 32-битные приложения, которые полагаются на функцию Windows API GetThreadContext, несовместимыми. К таким приложениям относятся отладчики приложений, трассировщики стека вызовов (например, IDE, отображающие стек вызовов) и приложения, которые используют механизмы сборки мусора (GC). Одним из наиболее широко используемых, но затронутых [12] механизмов сборки мусора является Boehm GC . Он также используется в качестве сборщика мусора по умолчанию не менее популярного Mono . Хотя Mono представила новый (но необязательный) GC с октября 2010 года под названием SGen-GC, он выполняет сканирование стека таким же образом, как и Boehm GC, что также делает его несовместимым с WoW64. По состоянию на июль 2016 года исправление не было предоставлено, хотя были предложены обходные пути. [13]
По данным Microsoft, 32-разрядное программное обеспечение, работающее под WOW64 (x64), имеет производительность, схожую с производительностью под 32-разрядной Windows, но с меньшим количеством возможных потоков. В системах, отличных от x64, WOW64 влечет за собой накладные расходы производительности из-за задействованной программной эмуляции. [5]
32-разрядному приложению может быть выделено целых 4 гигабайта виртуальной памяти на 64-разрядной системе, тогда как на 32-разрядной системе часть этой адресуемой памяти теряется, поскольку она используется ядром и периферийными устройствами, отображаемыми в памяти, такими как видеоадаптер , в результате чего приложения обычно могут использовать максимум 2 или 3 ГБ оперативной памяти.
wow64.dll
, wow64win.dll
, и wow64cpu.dll
.Wow64cpu.dll
как часть реализации IA-64.