В чем разница между 32-разрядной и 64-битные программы в Windows

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

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

17
задан ᔕᖺᘎᕊ
18.11.2022 16:42 Количество просмотров материала 3648
Распечатать страницу

3 ответа

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

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

Это оба.

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

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

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

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

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

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

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

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

8
отвечен grawity 2022-11-20 00:30

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

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

почему 64-разрядная программа не может работать на 32-разрядной копии Windows?

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

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

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

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

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

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

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

надеюсь, что это помогает.

2
отвечен tulhan 2022-11-20 02:47

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

64 бит, доступ к дополнительной памяти

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

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

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

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

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

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

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

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх