4

Почему 64-разрядная программа не может работать на 32-разрядной копии Windows? Как мой компьютер узнает, что у меня запущена 64-битная программа? Есть ли в программе фрагмент кода, сообщающий Windows, что это 64-разрядная программа, или Windows просто не может ее выполнить?

Я увидел значительную разницу в размере файлов двух версий одной и той же программы, поэтому я думаю, что это другой код. Можно ли изменить код и запустить программу?

3 ответа3

8

Отказ от ответственности: я никогда не писал ОС в своей жизни. Лучше подождать, пока кто-нибудь более компетентный ответит, и тем временем прочитать некоторые статьи OSDev .

Есть ли в программе фрагмент кода, сообщающий Windows, что это 64-разрядная программа, или Windows просто не может ее выполнить?

Это оба.

  • Все исполняемые файлы Windows (.exe, .dll,… - PE-исполняемые файлы в целом) имеют заголовок, указывающий ОС, для какой архитектуры они были скомпилированы. Это может быть Intel x86 (16-битная или 32-битная) или x86_64, Itanium или Alpha AXP…

    Если ОС увидит в заголовке несовместимую архитектуру, она полностью откажется запускать программу. В других случаях - например, если вы попытаетесь запустить программу x86 на x86_64 - она будет знать, что программу нужно запустить в режиме, отличном от остальных.

  • С другой стороны, действительные инструкции машинного кода внутри программы различны. (Кстати, все дело в том, чтобы иметь разные архитектуры) 64-битная архитектура x86_64 имеет больше инструкций, чем 32-битная x86, а 32-битная x86 имела больше инструкций, чем 16-битная. (И такие вещи, как Alpha, ARM или Itanium настолько различны, что их мало что можно сравнить.)

    (Даже разные процессоры x86 имеют разные наборы инструкций - со временем они накопили несколько десятков расширений поверх базовых, например, наборов команд "SSE" или "MMX" или «AES-NI», так что вполне возможно, что программа не будет работать на старых процессорах, таких как Pentium, если компилятору было разрешено оптимизировать его для самых новых.)

    И даже для базовых инструкций, которые одинаковы для обеих архитектур, размеры данных могут быть больше, а самое главное, адреса памяти больше - 64-битные архитектуры обычно называют «64-битными», потому что они используют 64-битные для выражения местоположений в память и тд.

    Таким образом, даже если вы отредактируете заголовок вручную, чтобы сообщить ОС другую архитектуру, вы получите только программу, которая каждый раз вылетает.

  • С другой стороны, x86_64 по-прежнему имеет те же инструкции, что и x86 (просто добавляет их больше ), поэтому для ОС относительно легко запускать 32-разрядные программы в 64-разрядном режиме; в основном он просто использует возможности x86 при работе с этой программой. Тем не менее, это не относится к другому направлению - даже если 32-битная ОС была написана для переключения ЦП в 64-битный режим для вашей программы, то обратно, все же может легко случиться, что программа что-то сделала что ОС не может справиться.

Если у вас есть исходный код, вы можете легко скомпилировать его для разных архитектур (при условии, что он был написан правильно - некоторые программы по-прежнему имеют допущения, например, указатели памяти всегда имеют ширину 32 бита…) Но если у вас просто есть скомпилированный двоичный файл, вы выходите удачи

2

Количество битов в этом случае относится к размеру адресов памяти, используемых компьютером.

32-разрядная адресная система памяти может указывать до 2 ^ 32 (4294967296) различных областей памяти (что составляет ровно 4 ГБ памяти), в то время как 64-разрядная адресация может указывать на 2 ^ 64 расположения (~ 16 триллионов ГБ).

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

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

Есть ли в программе фрагмент кода, сообщающий Windows, что это 64-разрядная программа, или Windows просто не может ее выполнить?
У каждой программы есть заголовок, который сообщает Windows все, что ей нужно знать о том, как запустить программу, в том числе 32-разрядное или 64-разрядное приложение.

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

Эти области памяти составляют только часть программы; большинство из них - инструкции (которые остаются того же размера) и такие вещи, как текст и значки. Поскольку только области памяти удваиваются в размере, 64-битная версия программы лишь немного больше, чем в два раза больше.

Надеюсь это поможет.

1

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

64 бита, доступ к большему количеству памяти

32 бита означает, что адресное пространство программы находится в диапазоне 2 ^ 32 целых значений. Что означает, что программа может знать только как считать до 2 ^ 32; таким образом, он может ссылаться только на память в этом диапазоне. Это около 2 ГБ.

  • 32-битная программа может видеть / использовать не более ~ 4 ГБ памяти. На практике это меньше, так как часть этого диапазона зарезервирована для ОС / кода.

Поскольку число 2 ^ 64 намного больше, очевидно, что 64-битные программы могут получить доступ к гораздо более широкому диапазону значений; они могут видеть / использовать намного больше памяти. Достаточно большой, чтобы вы, вероятно, не знали префикс SI: 16 exbibytes. Что такое exbibytes? Достаточно большой, чтобы никто не позаботился о обозримом будущем.

  • 64-битная программа может (практически) обращаться ко всей памяти, которую она когда-либо хотела (в этом десятилетии).

32 бита, потребляет немного меньше памяти, работает немного быстрее

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

  1. 64-битная программа занимает больше места. Каждая ссылка на память (указатель) занимает двойной размер. Эта разница обычно незначительна.
  2. Программа на 64 бита работает немного медленнее. Поскольку указатели больше, данные в памяти менее плотно упакованы вместе; различные уровни кэша на вашем компьютере заполняются меньшим количеством данных, что приводит к большему количеству пропусков кэша. Хорошее использование кэша (локальность памяти) является существенным в наше время для высокопроизводительного программного обеспечения, потому что задержка. Кроме того, некоторые арифметические операции занимают время, пропорциональное битовой ширине целого числа; некоторые инструкции процессора медленнее на 64 битах против 32 бит.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .