Что означает, что программа должна быть 32- или 64-битной?

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

Это верно? Используя программное обеспечение, такое как Word / Excel / и т. Д., Установщики могут выбрать 32-битную или 64-битную установку. В чем разница?

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

Это верно?

Здесь задается очень похожий вопрос: - и в принятом ответе упоминается, что разница - это объем памяти, который может быть выделен приложению. Но это слишком расплывчато - разве 32-битное / 64-битное программное обеспечение как концепция полностью не связано с размером 32-битного / 64-битного текстового процессора?

Всего 7 ответов


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

Вообще говоря, исходный код программы совсем не должен быть другим. Большинство программ могут быть написаны так, чтобы они прекрасно компилировались как 32-битные, так и 64-битные программы, в зависимости от соответствующего выбора параметров компилятора и / или компилятора. Однако на источник часто оказывается некоторое влияние, поскольку компилятор (C), предназначенный для 64-битных систем, может по-разному определять свои типы. В частности, long int вездесущим является 32-битной шириной на 32-битных платформах, но он является 64-битной шириной на многих (но не на всех) 64-битных платформах. Это может быть источником ошибок в коде, которые делают необоснованные предположения о таких деталях.

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


Программа работает поверх заданной архитектуры (arch или ISA), которая реализуется процессорами. Как правило, архитектура определяет размер «основного» слова, который является размером большинства регистров и операций над этими регистрами (хотя вы можете проектировать архитектуры, которые работают по-разному). Обычно это называют «собственным» размером слова, хотя архитектура может разрешать операции с использованием регистров разного размера.

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

На протяжении всей истории было много архитектур разных размеров, даже странных. В настоящее время вы можете легко найти вокруг себя процессоры, которые не только 32-битные и 64-битные, но также, например, 8-битные и 16-битные (обычно во встроенных устройствах). На обычном настольном компьютере вы используете x86 или x64, которые являются 32-разрядными и 64-разрядными соответственно.

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

И последнее замечание: по соображениям совместимости процессоры x64 могут работать в разных режимах, один из которых способен запускать 32-битный код из x86. Это означает, что если ваш компьютер x64 (вероятно) и если ваша операционная система поддерживает его (также вероятно, например, Windows 64-bit), он все равно может запускать программы, скомпилированные для x86.


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

32-разрядный или 64-разрядный относится к архитектуре процессора. Увеличение размера слова делает несколько вещей:

  • Больший размер слова позволяет определить больше инструкций. Например, и 8-битный процессор, который выполняет одну инструкцию загрузки, может иметь всего 256 команд, где больший размер слова позволяет определять больше инструкций в микрокоде процессора. Очевидно, есть ограничение на количество действительно полезных инструкций.
  • Больше данных может быть обработано за один цикл команд, так как доступно больше битов. Это ускоряет выполнение.
  • Как вы заявили, он также позволяет получить доступ к большему объему памяти без необходимости выполнять такие действия, как многократные циклы адресов или мультиплексирование слов данных высокого / низкого уровня.

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


Размер слова - это главное отличие, но оно не единственное. Он имеет тенденцию определять количество битов, для которых «оценивается» ЦП, но размер слова и общие возможности только слабо связаны. И общая способность - вот что имеет значение.

На процессорах Intel или AMD 32-разрядное или 64-разрядное программное обеспечение действительно относится к режиму, в котором процессор работает при его запуске. В 32-битном режиме доступно меньше / меньше регистров и инструкций, но наиболее важным ограничением является объем доступной памяти. 32-разрядное программное обеспечение обычно ограничено использованием 2 ГБ памяти (2 ^ 31 байт). 4 ГБ (2 ^ 32 байта) могут быть адресованы программой, однако половина пространства зарезервирована ОС. Из 2 ГБ доступной памяти это должно соответствовать программному коду, данным и часто также файлам, к которым осуществляется доступ. На современных компьютерах с большим количеством гигабайт оперативной памяти это не позволяет использовать доступную память. Это главная причина, почему 64-битная стала популярной. 64-разрядные процессоры были доступны и широко использовались (как правило, в 32-разрядном режиме) в течение нескольких лет, пока объем памяти, превышающий 2 ГБ, не стал общепринятым, и в этот момент 64-разрядный режим начал давать реальные преимущества и стал популярным. 64-битная память обеспечивает 16 петабайт адресного пространства (~ 18 квинтиллионов байт), что больше, чем может использовать любое современное программное обеспечение, и, конечно, ни у одного ПК нет такого большого объема ОЗУ.

Большая часть данных, используемых в типичных приложениях, даже в 64-разрядном режиме, не обязательно должна быть 64-разрядной, и поэтому большая часть ее по-прежнему хранится в 32-разрядных (или даже меньших) форматах. Общие представления текста в ASCII и UTF-8 используют 8-битные форматы данных. Если программе необходимо переместить большой блок текста из одного места в другое в памяти, она может попытаться сделать это 64 битами за раз, но если ей нужно интерпретировать текст, она, вероятно, сделает это 8 битами за раз , Аналогично, 32 бита - это обычный размер для целых чисел (максимальный диапазон +/- 2 ^ 31 или примерно +/- 2,1 млрд.). 2,1 миллиарда достаточно для многих целей. Графические данные обычно представляются попиксельно, и каждый пиксель обычно содержит не более 32 бит данных.

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

До 32-битной памяти и размер слова обычно были разными (например, 16-битный 8086/88 с 20-битными адресами памяти, но 16-битными регистрами, или 8-битный 6502 с 16-битными адресами памяти, или даже ранние 32 ARM с 26-битными адресами). Хотя ни один программист никогда не обращал внимания на лучшие регистры, пространство памяти обычно было реальной движущей силой для каждого нового поколения технологий. Это связано с тем, что большинство программистов редко работают напрямую с регистрами, но работают непосредственно с памятью, а ограничения памяти напрямую вызывают неприятности для программиста, а также в случае 32- и 64-разрядных систем, а также для пользователя.

Подводя итог, хотя существуют реальные и важные технологические различия между различными размерами битов, то, что на самом деле означает 32-разрядный или 64-разрядный (или 16-разрядный или 8-разрядный), представляет собой просто набор возможностей, которые, как правило, связаны с ЦП определенного технологического поколения и / или программное обеспечение, которое использует эти возможности. Длина слова является частью этого, но не единственной или обязательно самой важной частью.

Источник: был программистом во все эти технологические эпохи.


упоминает, что размер слова относится к размеру бита регистра процессора

Обычно да (хотя есть некоторые исключения / осложнения)

  • Под этим я подразумеваю количество битов, на которых работает компьютерный процессор / т.е. наименьшее «неделимое» количество битов, на которых работает процессор.

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

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

Так как архитектура компьютера исправлена

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

Как правило, ОС, работающая в 64-битном режиме, может поддерживать приложения, работающие в 32-битном режиме, но не наоборот.

Таким образом, 32-разрядное приложение работает в 32-разрядном режиме на 32-разрядном процессоре с 32-разрядной ОС, на 64-разрядном процессоре с 32-разрядной ОС или на 64-разрядном процессоре с 64-разрядной ОС.

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


Используя программное обеспечение, такое как Word / Excel / и т. Д., Установщики могут выбрать 32-битную или 64-битную установку. В чем разница?

Это зависит от используемого процессора:

На процессорах SPARC разница между 32-битными и 64-битными программами - именно то, что вы думаете:

64-разрядные программы используют дополнительные операции, которые не поддерживаются 32-разрядными процессорами SPARC. С другой стороны, операционная система Solaris или Linux размещает данные, к которым получают доступ 64-разрядные программы, в области памяти, доступ к которым возможен только с помощью 64-разрядных инструкций. Это означает, что 64-битная программа ДОЛЖНА использовать инструкции, не поддерживаемые 32-битными ЦП.

Для процессоров x86 это отличается:

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

В 16-, 32- и 64-битном коде процессор по-разному интерпретирует байты:

Байты (шестнадцатеричные) b8 4e 61 bc 00 c3 будут интерпретироваться как:

mov    eax,0xbc614e
ret

... в 32-битном коде и как:

mov    ax,0x614e
mov    sp,0xc300

... в 16-битном коде.

Байты в файле EXE «64-разрядной установки» и «32-разрядной установки» должны интерпретироваться ЦП по-разному.

И 64-битная программа приложит усилия для выравнивания наборов команд с 64-битными размерами слов.

16-битный код (см. Выше) может обращаться к 32-битным регистрам, когда ЦП не является 16-битным ЦП.

Таким образом, «16-разрядная программа» может получить доступ к 32-разрядным регистрам на 32- или 64-разрядном процессоре x86.


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

Когда мы говорим о MCU или CPU (также о других цифровых компонентах, таких как АЦП и ЦАП), мы говорим, что компонент может иметь: х-битные регистры, х-битный адрес шины, х-битную шину данных, х-битный вход, х-битный выход.

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

ЦП с 64-битным адресом шины может напрямую адресовать большую часть памяти, чем ЦП с 16-битным адресом шины за один шаг.

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


Есть идеи?

10000