Если мы можем запустить 32-битные исполняемые файлы в 64-битной Windows, почему мы не можем конвертировать их?
WoW64 позволяет запускать 32-битные приложения в 64-битной Windows. Если преобразование из 32-битных инструкций в 64-битные инструкции может быть выполнено во время выполнения, почему мы не можем преобразовать сам исполняемый файл в 64-битную?
2 ответа
Это потому, что WoW64 не конвертирует 32-битные инструкции в 64-битные.
Ваш 32-битный исполняемый файл запускается в 32-битном режиме путем переключения вашего процессора в режим совместимости. Есть некоторые преобразования, встроенные для вызовов API/ драйвера, но большая часть кода не конвертируется.
* Это верно только для архитектуры x86-64. Архитектура IA-64 не поддерживает это, поэтому WoW фактически конвертирует ваш код в 64-битный, но со значительным снижением производительности.
*.NET-код, скомпилированный в MSIL, соответствует правильной архитектуре. Вероятно, то же самое происходит с другими архитектурами с промежуточным языком, таким как Java, но я там не эксперт.
Да, Wow64 позволяет запускать 32-разрядные программы, но они все еще работают в 32-разрядном режиме - никаких изменений кода не производится. Такой автоматический перевод был бы невозможен для нативного приложения.
Проблема номер один в том, что у нативных приложений нет аннотаций, объясняющих, что делает код. Только один пример: компилятор компилирует код манипулирования указателем и использует 32-битный регистр для хранения этого значения указателя на 32-битной платформе и выдает для этого пустой машинный код - среда выполнения не будет знать, что это был указатель, и ему нужно размещаться в 64-битном регистре на 64-битной платформе.
Управляемые среды, такие как Java и.NET, могут справиться с этим - компилятор генерирует код "промежуточного языка" с необходимыми аннотациями, которые затем компилируются для целевой платформы перед первым запуском кода.