WoW64
У обчислювальній техніці на платформах 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, що транслює (thunks) виклики між 32-бітними та 64-бітними, включаючи маніпуляції з вказівниками та стеками викликів.Wow64win.dll, що надає відповідні точки входу для 32-бітних програм (win32k thunks).- DLL, що дозволяє виконувати 32-бітні x86 інструкції, яка залежить від архітектури набору команд.
- На x86-64,
Wow64cpu.dllвідповідає за перемикання процесора з 32-бітного на 64-бітний режим. Це обчислювально недорого, оскільки x86-64 машини мають нативний режим для виконання 32-бітного x86 коду.[4] - На IA-64 (Itanium 2), для повільнішої[5] програмної емуляції потрібні три файли:
Wow64cpu.dll, «шар абстракції CPU»;IA32Exec.bin, програмний емулятор x86; таWowia32x.dll, міст між емулятором та системою WOW64.[6] - На ARMv8 64-bit,
xtajit.dllдля емуляції x86 таwowarmhw.dllдля перемикання в режим ARM32.[3]
- На x86-64,
Підсистема 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 змінює результати запитів, таких як FOLDERID_ProgramFiles, щоб направити інсталятори до правильного каталогу.[8]
На ARM64 також є кілька нових каталогів, де WOW64 керує запуском не лише 32-бітних програм x86, але й 32-бітних програм ARM, які використовують SysArm32. ARM64 також підтримує так звані CHPE («скомпільовані-гібридні-PE»), які мають код ARM64 у контейнері DLL x86 (для більш ефективної сумісності без емуляції); ці 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, оскільки CPU не підтримує режим 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] GC-механізмів є 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 ГБ оперативної пам'яті.
- ↑ Зокрема:
- Windows XP Professional x64 Edition
- IA-64 та x86-64 версії Windows Server 2003
- x64 версії Windows Vista, Windows Server 2008, Windows 7, Windows 8, Windows Server 2012, Windows 8.1, Windows 10, Windows Server 2016, Windows Server 2019, Windows 11, Windows Server 2022
- ARM64 версії Windows 10, Windows 11 та Windows Server 2022.
wow64.dll,wow64win.dllтаwow64cpu.dll.
- ↑ QuinnRadich; DCtheGeek; msatranjr (19 серпня 2020). WOW64 Implementation Details. learn.microsoft.com (англ.). Архів оригіналу за 16 квітня 2023. Процитовано 16 квітня 2023.
- ↑ Conway, Adam (25 січня 2023). Wine 8.0 released with better controller compatibility, experimental WoW64 support, and more. XDA Developers (англ.). Архів оригіналу за 16 квітня 2023. Процитовано 16 квітня 2023.
- 1 2 WOW64 Implementation Details. Microsoft (англ.). Процитовано 21 квітня 2018.
- ↑ Eckels, Stephen (9 листопада 2020). WOW64!Hooks: WOW64 Subsystem Internals and Hooking Techniques. Mandiant (англ.).
- 1 2 Performance and Memory Consumption Under WOW64. Microsoft (англ.). Процитовано 6 травня 2013.
- ↑ WOW64 Implementation Details (Windows) (англ.). 26 квітня 2010. Архів оригіналу за 26 квітня 2010. – Рання версія статті, де
Wow64cpu.dllвказано як частину реалізації IA-64. - 1 2 3 File System Redirector (Windows). msdn.microsoft.com (англ.). 2 лютого 2023.
- ↑ winapi - SHGetFolderPath() 32 bit vs 64 bit. Stack Overflow (англ.).
- ↑ Beneš, Petr (4 листопада 2018). WoW64 internals: re-discovering Heaven's Gate on ARM. mindless-area (wbenny.github.io) (англ.).
- ↑ Saw, Zach (13 листопада 2010). WOW64 bug: GetThreadContext() may return stale contents. Zach Saw's Blog (англ.). Процитовано 15 листопада 2010.
- ↑ WOW64 OS bug: Old 32-bit XP apps failing under Win7 WOW64. Microsoft Developer Network (англ.). 11 листопада 2010. Процитовано 15 листопада 2010.
- ↑ Discussions about the Boehm Garbage Collector (Boehm GC) (англ.). Архів оригіналу за 16 липня 2011. Процитовано 25 листопада 2010.
- ↑ GetThreadContext returns stale register values on WOW64. Microsoft (англ.). Архів оригіналу за 19 серпня 2016. Процитовано 23 липня 2016.
