В технической речи, почему вы не можете запустить 64-битное приложение на 32-битной ОС? - PullRequest
2 голосов
/ 18 мая 2009

Мне нужна помощь, чтобы описать, в технических словах, почему 64-разрядное приложение выдает «Недопустимое приложение Win32» в 32-разрядной Windows на 32-разрядной машине? Любая ссылка MSDN очень ценит это (я не мог бы Google надежный источник). Я знаю, что это не должно работать, но у меня нет хорошего объяснения этому.

Ответы [ 7 ]

13 голосов
/ 18 мая 2009

32-битная ОС работает в 32-битном защищенном режиме . 64-битная ОС работает в режиме long (т.е. в 64-битном защищенном режиме). 64-битные инструкции (используемые 64-битными программами) доступны только тогда, когда процессор находится в длинном режиме; поэтому вы не можете выполнять их в 32-битном защищенном режиме, в котором работает 32-битная ОС.

(приведенное выше утверждение относится к архитектуре x86)

Кстати, причина сообщения об ошибке «Не является допустимым приложением Win32» заключается в том, что 64-разрядные исполняемые файлы хранятся в формате PE32 +, а 32-разрядные исполняемые файлы - в формате PE32. Файлы PE32 + не являются допустимыми исполняемыми файлами для 32-битной Windows. Он не может понять этот формат.

7 голосов
/ 18 мая 2009

Чтобы подробнее рассказать о том, что говорили другие, более низким и подробным способом:

Когда программа компилируется, инструкции пишутся для определенного набора команд процессора. То, что мы видим как «x = y + z», обычно равнозначно копированию одного значения в регистр, передаче команды добавления с расположением в памяти другого значения и т. Д.

Для этого вопроса 64-разрядное приложение ожидает работы с 64-разрядным адресным пространством. Когда вы передаете команду процессору в 32-битной системе, он одновременно работает с этими 32-битными данными.

Смысл всего этого? Вы не можете использовать более 4 гигабайт (2 32 ) памяти в 32-битной системе без творчества. Некоторые задачи, требующие нескольких операций (например, работа с простой математикой на числах> 4 миллиардов без знака), могут быть выполнены за одну операцию. Больше, быстрее, но требует нарушения совместимости со старыми системами.

0 голосов
/ 18 мая 2009

Основная причина, по которой 64-битные приложения не запускаются в 32-битных ОС, связана с регистрами, используемыми в базовом языке сборки (предположительно, IA-32 здесь). В 32-разрядных операционных системах и программах регистры ЦП способны обрабатывать максимум 32 бита данных (DWORDS) в регистрах. В 64-битных ОС регистры должны обрабатывать двойные биты (64) и, следовательно, размер данных QWORD в сборке. Компиляция для x86 (32 бита) означает, что компилятор ограничивает регистры обработкой максимум 32 бита данных. Компиляция для x64 означает, что компилятор позволяет регистрам обрабатывать до 64 бит данных. Переход от QWORD (64) к DWORD (32) означает, что вы теряете половину информации, хранящейся в регистрах. Скорее всего, вы получаете ошибку, потому что базовый скомпилированный машинный код пытается переместить более 32 бит данных в регистр, который 32-битная операционная система не может обработать, поскольку максимальный размер ее регистров составляет 32 бита.

0 голосов
/ 18 мая 2009

Поскольку теоретически можно было бы работать в каком-то режиме эмуляции для набора команд, у вас возникают проблемы, как только вашему приложению требуется больше памяти, чем может обработать 32 бита.

0 голосов
/ 18 мая 2009

64-битная архитектура создана для вызова инструкций аппаратного процессора, которые не поддерживаются 32-разрядным процессором, который эмулирует ваш процессор для запуска 32-разрядной ОС.

0 голосов
/ 18 мая 2009

Для 64-битного приложения требуется 64-битный процессор, поскольку он использует 64-битные инструкции. А 32-разрядная ОС переведет ваш ЦП в 32-разрядный режим, что отключит указанные инструкции.

Почему вы ожидаете, что это сработает? Вы компилируете свою программу, чтобы воспользоваться возможностями, которых нет в 32-битной системе.

0 голосов
/ 18 мая 2009

Потому что они принципиально разные. Вы не ожидаете, что француз будет понимать китайский язык, поэтому зачем ожидать, что 32-битный процессор будет понимать 64-битный код?

...