В компьютерной архитектуре 64 -битные целые числа , адреса памяти или другие единицы данных [a] — это те, которые имеют ширину 64 бита . Кроме того, 64-битные центральные процессоры (ЦП) и арифметико-логические устройства (АЛУ) — это те, которые основаны на регистрах процессора , адресных шинах или шинах данных такого размера. Компьютер , использующий такой процессор, является 64-битным компьютером .
С точки зрения программного обеспечения, 64-битные вычисления означают использование машинного кода с 64-битными адресами виртуальной памяти . Однако не все 64-битные наборы команд поддерживают полные адреса 64-битной виртуальной памяти; Например, x86-64 и AArch64 поддерживают только 48 бит виртуального адреса, а остальные 16 бит виртуального адреса должны состоять только из нулей (000...) или всех единиц (111...), а также нескольких 64-бит. Наборы битовых команд поддерживают менее 64 бит адреса физической памяти.
Термин «64-бит» также описывает поколение компьютеров, в которых 64-битные процессоры являются нормой. 64 бита — это размер слова , который определяет определенные классы компьютерной архитектуры, шин, памяти и процессоров и, соответственно, программного обеспечения, которое на них работает. 64-битные процессоры используются в суперкомпьютерах с 1970-х годов ( Cray-1 , 1975), а в рабочих станциях и серверах на базе компьютеров с сокращенным набором команд (RISC) — с начала 1990-х годов. В 2003 году 64-битные процессоры были представлены на массовом рынке ПК в виде процессоров x86-64 и PowerPC G5 .
64-битный регистр может хранить любое из 264 ( более 18 квинтиллионов или 1,8×1019 ) различных значений. Диапазон целочисленных значений, которые могут храниться в 64 битах, зависит от используемого целочисленного представления . В двух наиболее распространенных представлениях диапазон составляет от 0 до 18 446 744 073 709 551 615 (2 64 - 1) для представления в виде двоичного числа ( без знака ) и от -9 223 372 036 854 775 808 (-2 63 ) до 9 223 372 036 854 775,8. 07 (2 63 − 1) для представления в виде дополнения до двух . Следовательно, процессор с 64-битными адресами памяти может напрямую обращаться к 264 байтам (16 эксбибайт или EiB) памяти с байтовой адресацией .
Без каких-либо дополнительных уточнений, 64-битная компьютерная архитектура обычно имеет целочисленные и адресные регистры шириной 64 бита, что обеспечивает прямую поддержку 64-битных типов данных и адресов. Однако ЦП может иметь внешние шины данных или адресные шины с размерами, отличными от регистров, даже больше ( например, 32-битный Pentium имел 64-битную шину данных). [1]
Регистры процессора обычно делятся на несколько групп: целочисленные , с плавающей запятой , одиночные инструкции, несколько данных (SIMD), управление и часто специальные регистры для адресной арифметики, которые могут иметь различное использование и названия, такие как адресные , индексные или базовые регистры . Однако в современных конструкциях эти функции часто выполняются целочисленными регистрами более общего назначения. В большинстве процессоров для адресации данных в памяти можно использовать только целочисленные или адресные регистры; другие типы регистров не могут. Поэтому размер этих регистров обычно ограничивает объем памяти с прямой адресацией, даже если существуют регистры, такие как регистры с плавающей запятой, которые шире.
Большинство высокопроизводительных 32-битных и 64-битных процессоров (некоторыми заметными исключениями являются старые или встроенные ЦП с архитектурой ARM (ARM) и 32-битной архитектурой MIPS (MIPS)) имеют встроенное оборудование с плавающей запятой, которое часто, но не всегда, основано на на 64-битных единицах данных. Например, хотя в архитектуре x86 / x87 есть инструкции, способные загружать и сохранять в памяти 64-битные (и 32-битные) значения с плавающей запятой, внутренние данные с плавающей запятой и формат регистров имеют ширину 80 бит, в то время как общий формат Регистры назначения имеют ширину 32 бита. Напротив, 64-битное семейство Alpha использует 64-битные данные и формат регистров с плавающей запятой, а также 64-битные целочисленные регистры.
Многие наборы команд компьютера устроены таким образом, что один целочисленный регистр может хранить адрес памяти в любом месте физической или виртуальной памяти компьютера . Поэтому общее количество адресов памяти часто определяется шириной этих регистров. IBM System / 360 1960-х годов был первым 32-битным компьютером; у него были 32-битные целочисленные регистры, хотя для адресов использовались только младшие 24 бита слова, в результате чего получалось адресное пространство размером 16 МБ ( 16 × 1024 2 байта ). 32-битные суперминикомпьютеры , такие как DEC VAX , стали обычным явлением в 1970-х годах, а 32-битные микропроцессоры, такие как семейство Motorola 68000 и 32-битные представители семейства x86, начиная с Intel 80386 , появились в середине 1970-х годов. 1980-е годы, когда 32 бита стали чем-то вроде фактического консенсуса как удобный размер регистра.
32-битный адресный регистр означал, что можно было обращаться к 2 32 адресам или 4 ГБ оперативной памяти (ОЗУ). Когда были разработаны эти архитектуры, 4 ГиБ памяти настолько превышали типичные объемы (4 МБ) в установках, что это считалось достаточным запасом для адресации. 4,29 миллиарда адресов считались подходящим размером для работы по другой важной причине: 4,29 миллиарда целых чисел достаточно для назначения уникальных ссылок большинству объектов в таких приложениях, как базы данных .
Некоторые суперкомпьютерные архитектуры 1970-х и 1980-х годов, такие как Cray-1 , [2] использовали регистры шириной до 64 бит и поддерживали 64-битную целочисленную арифметику, хотя они не поддерживали 64-битную адресацию. В середине 1980-х годов разработка Intel i860 [3] завершилась выпуском (слишком поздно [4] для Windows NT) 1989 года; i860 имел 32-битные целочисленные регистры и 32-битную адресацию, поэтому он не был полностью 64-битным процессором, хотя его графический модуль поддерживал 64-битную целочисленную арифметику. [5] Однако 32 бита оставались нормой до начала 1990-х годов, когда постоянное снижение стоимости памяти привело к установкам с объемом оперативной памяти, приближающимся к 4 ГиБ, и использование пространств виртуальной памяти, превышающих потолок в 4 ГиБ, стало желательным для решение определенных типов проблем. В ответ MIPS и DEC разработали 64-битные микропроцессорные архитектуры, первоначально для высокопроизводительных рабочих станций и серверов . К середине 1990-х годов HAL Computer Systems , Sun Microsystems , IBM , Silicon Graphics и Hewlett-Packard разработали 64-битные архитектуры для своих рабочих станций и серверных систем. Заметным исключением из этой тенденции были мэйнфреймы IBM, которые тогда использовали 32-битные данные и 31-битные размеры адресов; мэйнфреймы IBM не включали 64-битные процессоры до 2000 года. В 1990-е годы несколько недорогих 64-битных микропроцессоров использовались в бытовой электронике и встроенных приложениях. Примечательно, что Nintendo 64 [6] и PlayStation 2 имели 64-битные микропроцессоры до их появления на персональных компьютерах. Высокопроизводительные принтеры, сетевое оборудование и промышленные компьютеры также использовали 64-битные микропроцессоры, такие как Quantum Effect Devices R5000 . [ нужна цитация ] 64-битные вычисления начали проникать на настольные персональные компьютеры с 2003 года, когда некоторые модели линейки Apple Macintosh перешли на процессоры PowerPC 970 (названные Apple G5 ), и была выпущена компания Advanced Micro Devices (AMD). свой первый 64-битный процессор x86-64 . Физическая память в конечном итоге достигла 32-битного ограничения. В 2023 году портативные компьютеры обычно оснащались 16 ГБ памяти, а серверы — до 64 ГБ памяти, что значительно превышало емкость адреса в 4 ГБ, составляющую 32 бита.
В принципе, 64-битный микропроцессор может адресовать 16 EiB ( 16 × 1024 6 = 2 64 = 18 446 744 073 709 551 616 байт , или около 18,4 эксабайт) памяти. Однако не все наборы команд и не все процессоры, реализующие эти наборы команд, поддерживают полное 64-битное виртуальное или физическое адресное пространство.
Архитектура x86-64 (по состоянию на 2016 год [update]) допускает 48 бит для виртуальной памяти и для любого процессора до 52 бит для физической памяти. [27] [28] Эти ограничения допускают размеры памяти 256 ТиБ ( 256 × 1024 4 байта ) и 4 ПиБ ( 4 × 1024 5 байт ) соответственно. В настоящее время ПК не может содержать 4 пебибайта памяти (из-за физического размера микросхем памяти), но AMD предусмотрела большие серверы, кластеры с общей памятью и другие варианты использования физического адресного пространства, которые могут приблизиться к этому в обозримом будущем. Таким образом, 52-битный физический адрес предоставляет достаточно возможностей для расширения, не требуя при этом затрат на реализацию полных 64-битных физических адресов. Точно так же 48-битное виртуальное адресное пространство было спроектировано так, чтобы обеспечить в 65 536 (2 16 ) раз больше 32-битного предела в 4 ГиБ ( 4 × 1024 3 байта ), что дает место для последующего расширения и не требует дополнительных затрат на преобразование полного 64-битного пространства. адреса.
Power ISA v3.0 допускает 64 бита для эффективного адреса, сопоставленного с сегментированным адресом с допустимыми значениями от 65 до 78 бит для виртуальной памяти и для любого конкретного процессора до 60 бит для физической памяти. [29]
Архитектура Oracle SPARC 2015 допускает 64 бита для виртуальной памяти и для любого процессора от 40 до 56 бит для физической памяти. [30]
Архитектура системы виртуальной памяти ARM AArch64 допускает 48 бит для виртуальной памяти и для любого процессора от 32 до 48 бит для физической памяти. [31]
Спецификация DEC Alpha требует поддержки минимум 43 бит адресного пространства виртуальной памяти (8 ТиБ), а аппаратное обеспечение должно проверять и перехватывать, если оставшиеся неподдерживаемые биты равны нулю (для поддержки совместимости с будущими процессорами). Alpha 21064 поддерживал 43 бита адресного пространства виртуальной памяти (8 ТиБ) и 34 бита адресного пространства физической памяти (16 ГиБ). Alpha 21164 поддерживал 43 бита адресного пространства виртуальной памяти (8 ТиБ) и 40 бит адресного пространства физической памяти (1 ТиБ). Alpha 21264 поддерживал настраиваемые пользователем 43 или 48 бит адресного пространства виртуальной памяти (8 ТиБ или 256 ТиБ) и 44 бита адресного пространства физической памяти (16 ТиБ).
Переход с 32-битной на 64-битную архитектуру является фундаментальным изменением, поскольку большинство операционных систем должны быть значительно модифицированы, чтобы воспользоваться преимуществами новой архитектуры, поскольку это программное обеспечение должно управлять реальным аппаратным обеспечением адресации памяти. [32] Другое программное обеспечение также необходимо портировать , чтобы использовать новые возможности; более старое 32-битное программное обеспечение может поддерживаться либо потому, что 64-битный набор команд является надмножеством 32-битного набора команд, так что процессоры, поддерживающие 64-битный набор команд, также могут выполнять код для 32-битных инструкций. устанавливается, либо посредством программной эмуляции , либо путем фактической реализации 32-битного ядра процессора в 64-битном процессоре, как в случае с некоторыми процессорами Itanium от Intel, которые включают процессорное ядро IA-32 для запуска 32-битных приложений x86 . Операционные системы для этих 64-битных архитектур обычно поддерживают как 32-битные, так и 64-битные приложения. [33]
Одним из существенных исключений из этого правила является IBM AS/400 , программное обеспечение для которого скомпилировано в архитектуру виртуального набора команд (ISA), называемую Technology Independent Machine Interface (TIMI); Код TIMI затем преобразуется в собственный машинный код с помощью низкоуровневого программного обеспечения перед выполнением. Программное обеспечение для перевода — это все, что необходимо переписать, чтобы перенести всю ОС и все программное обеспечение на новую платформу, как это произошло, когда IBM перевела собственный набор команд для AS/400 со старого 32/48-битного IMPI на новый 64-битный PowerPC . -AS под кодовым названием Amazon . Набор инструкций IMPI сильно отличался даже от 32-битного PowerPC, поэтому этот переход был даже более масштабным, чем переход данного набора команд с 32 на 64 бита.
На 64-битном оборудовании с архитектурой x86-64 (AMD64) большинство 32-битных операционных систем и приложений могут работать без проблем совместимости. Хотя большее адресное пространство 64-битных архитектур упрощает работу с большими наборами данных в таких приложениях, как цифровое видео , научные вычисления и большие базы данных , ведутся серьезные споры о том, будут ли они или их 32-битные режимы совместимости быстрее, чем 32-битные системы по сопоставимой цене для других задач.
Скомпилированная программа Java может работать на 32- или 64-битной виртуальной машине Java без каких-либо изменений. Длины и точность всех встроенных типов, таких как char
, short
, int
, long
, float
и double
, а также типов, которые можно использовать в качестве индексов массива, определяются стандартом и не зависят от базовой архитектуры. Программы Java, работающие на 64-битной виртуальной машине Java, имеют доступ к большему адресному пространству. [34]
Скорость — не единственный фактор, который следует учитывать при сравнении 32-битных и 64-битных процессоров. Такие приложения, как многозадачность, стресс-тестирование и кластеризация — для высокопроизводительных вычислений (HPC) — могут больше подходить для 64-битной архитектуры при правильном развертывании. По этой причине 64-битные кластеры получили широкое распространение в крупных организациях, таких как IBM, HP и Microsoft.
Краткое содержание:
Распространенным заблуждением является то, что 64-битные архитектуры не лучше 32-битных, если только компьютер не имеет более 4 ГиБ оперативной памяти . [35] Это не совсем так:
int a , b , c , d , e ; для ( а знак равно 0 ; а < 100 ; а ++ ) { б знак равно а ; с = б ; д = с ; е знак равно d ; }
Основным недостатком 64-битных архитектур является то, что по сравнению с 32-битными архитектурами те же данные занимают больше места в памяти (из-за более длинных указателей и, возможно, других типов, а также заполнения выравнивания). Это увеличивает требования к памяти для данного процесса и может повлиять на эффективное использование кэша процессора. Поддержание частичной 32-битной модели — один из способов справиться с этой проблемой, и в целом он достаточно эффективен. Например, операционная система z/OS использует этот подход, требуя, чтобы программный код находился в 31-битном адресном пространстве (старший бит не используется при вычислении адреса на базовой аппаратной платформе), тогда как объекты данных могут опционально находиться в 64-битном адресном пространстве. битовые области. Не все такие приложения требуют большого адресного пространства или манипулируют 64-битными элементами данных, поэтому эти приложения не получают преимуществ от этих функций.
В 64-битных системах на базе x86 иногда отсутствуют эквиваленты программного обеспечения , написанного для 32-битных архитектур. Самая серьезная проблема в Microsoft Windows — несовместимость драйверов устройств для устаревшего оборудования. Большинство 32-битных прикладных программ могут работать в 64-битной операционной системе в режиме совместимости , также называемом режимом эмуляции , например, технология Microsoft WoW64 для IA-64 и AMD64. Среда драйверов 64-битного Windows Native Mode [38] работает поверх 64-битной NTDLL.DLL , которая не может вызывать 32-битный код подсистемы Win32 (часто устройства, фактическая функция оборудования которых эмулируется в программном обеспечении пользовательского режима, например Winprinters). Поскольку 64-битные драйверы для большинства устройств были недоступны до начала 2007 года (Vista x64), использование 64-битной версии Windows считалось сложной задачей. Однако с тех пор тенденция переместилась в сторону 64-битных вычислений, тем более, что цены на память упали, а использование оперативной памяти объемом более 4 ГиБ увеличилось. Большинство производителей начали предоставлять для новых устройств как 32-битные, так и 64-битные драйверы, поэтому отсутствие 64-битных драйверов перестало быть проблемой. 64-битные драйверы не предоставлялись для многих старых устройств, которые, следовательно, нельзя было использовать в 64-битных системах.
Совместимость драйверов была меньшей проблемой для драйверов с открытым исходным кодом, поскольку 32-битные драйверы можно было модифицировать для использования в 64-битных версиях. Поддержка оборудования, выпущенного до начала 2007 года, была проблематичной для платформ с открытым исходным кодом из - за относительно небольшого числа пользователей.
64-битные версии Windows не могут запускать 16-битное программное обеспечение . Однако большинство 32-битных приложений будут работать хорошо. 64-битные пользователи вынуждены устанавливать виртуальную машину 16- или 32-битной операционной системы для запуска 16-битных приложений или использовать одну из альтернатив NTVDM . [39]
Mac OS X 10.4 «Tiger» и Mac OS X 10.5 «Leopard» имели только 32-битное ядро, но они могли запускать 64-битный код пользовательского режима на 64-битных процессорах. Mac OS X 10.6 «Snow Leopard» имела как 32-, так и 64-битное ядра, и на большинстве компьютеров Mac 32-битное ядро использовалось даже на 64-битных процессорах. Это позволило этим компьютерам Mac поддерживать 64-битные процессы, сохраняя при этом поддержку 32-битных драйверов устройств; но не 64-битные драйверы и преимущества в производительности, которые они могут дать. Mac OS X 10.7 «Lion» работала с 64-битным ядром на большем количестве компьютеров Mac, а OS X 10.8 «Mountain Lion» и более поздние версии macOS имеют только 64-битное ядро. В системах с 64-битными процессорами как 32-, так и 64-битные ядра macOS могут выполнять 32-битный код пользовательского режима, а все версии macOS до macOS Mojave (10.14) включают 32-битные версии библиотек, которые 32-битные. битные приложения будут использовать, поэтому 32-битное программное обеспечение пользовательского режима для macOS будет работать в этих системах. 32-битные версии библиотек были удалены Apple из macOS Catalina (10.15).
Linux и большинство других Unix-подобных операционных систем, а также наборы инструментов C и C++ для них уже много лет поддерживают 64-битные процессоры. Многие приложения и библиотеки для этих платформ представляют собой программное обеспечение с открытым исходным кодом , написанное на C и C++, поэтому, если они безопасны для 64-разрядных систем, их можно скомпилировать в 64-разрядные версии. Эта модель распространения на основе исходного кода с упором на частые выпуски делает доступность прикладного программного обеспечения для этих операционных систем менее серьезной проблемой.
В 32-битных программах указатели и типы данных, такие как целые числа, обычно имеют одинаковую длину. Это не обязательно верно на 64-битных машинах. [40] [41] [42] Таким образом , смешение типов данных в языках программирования, таких как C и его потомках, таких как C++ и Objective-C, может работать в 32-битных реализациях, но не в 64-битных реализациях.
Во многих средах программирования для C и языков, производных от C, на 64-битных машинах int
переменные по-прежнему имеют ширину 32 бита, но длинные целые числа и указатели имеют ширину 64 бита. Они описаны как имеющие модель данных LP64 , что является аббревиатурой «Long, Pointer, 64». [43] [44] Другими моделями являются модель данных ILP64 , в которой все три типа данных имеют ширину 64 бита, [45] [44] и даже модель SILP64 , в которой короткие целые числа также имеют ширину 64 бита. [46] [47] Однако в большинстве случаев необходимые изменения относительно незначительны и просты, и многие хорошо написанные программы можно просто перекомпилировать для новой среды без каких-либо изменений. Другой альтернативой является модель LLP64 , которая сохраняет совместимость с 32-битным кодом, оставляя оба и 32-битными. [48] [44] LL относится к длинному целочисленному типу, который имеет длину не менее 64 бит на всех платформах, включая 32-битные среды.int
long
Существуют также системы с 64-битными процессорами, использующими модель данных ILP32 с добавлением 64-битных длинных целых чисел; это также используется на многих платформах с 32-битными процессорами. Эта модель уменьшает размер кода и размер структур данных, содержащих указатели, за счет гораздо меньшего адресного пространства, что является хорошим выбором для некоторых встроенных систем. Для наборов команд, таких как x86 и ARM, в которых 64-битная версия набора команд имеет больше регистров, чем 32-битная версия, он обеспечивает доступ к дополнительным регистрам без потери места. Он распространен в 64-битных RISC-машинах, [ нужна ссылка ] исследован в x86 как x32 ABI и недавно использовался в Apple Watch Series 4 и 5. [49] [50]
Многие 64-битные платформы сегодня используют модель LP64 (включая Solaris, AIX , HP-UX , Linux, macOS, BSD и IBM z/OS). Microsoft Windows использует модель LLP64 . Недостаток модели LP64 заключается в том, что сохранение a long
в int
формате усекается. С другой стороны, преобразование указателя в long
«работает» в LP64. В модели LLP64 все наоборот. Это не проблемы, которые затрагивают код, полностью соответствующий стандартам, но код часто пишется с неявными предположениями о ширине типов данных. Код C должен отдавать предпочтение ( u
) intptr_t
вместо long
приведения указателей к целочисленным объектам.
Модель программирования — это выбор, соответствующий конкретному компилятору, и несколько моделей могут сосуществовать в одной и той же ОС. Однако обычно доминирует модель программирования, выбранная в качестве основной модели для интерфейса программирования приложений (API) ОС.
Еще одним соображением является модель данных, используемая для драйверов устройств . Драйверы составляют большую часть кода операционной системы в большинстве современных операционных систем [ нужна ссылка ] (хотя многие из них могут не загружаться во время работы операционной системы). Многие драйверы активно используют указатели для манипулирования данными, и в некоторых случаях им приходится загружать указатели определенного размера в аппаратное обеспечение, которое они поддерживают, для прямого доступа к памяти (DMA). Например, драйвер для 32-битного PCI-устройства, запрашивающий у устройства передачу данных DMA в верхние области памяти 64-битной машины, не мог удовлетворить запросы операционной системы на загрузку данных с устройства в память, превышающую барьер в 4 гибибайта . , поскольку указатели на эти адреса не помещаются в регистры DMA устройства. Эта проблема решается за счет того, что ОС учитывает ограничения памяти устройства при формировании запросов к драйверам для DMA или за счет использования блока управления памятью ввода-вывода (IOMMU).
По состоянию на август 2023 года [update]к 64-битным архитектурам, для которых производятся процессоры, относятся:
Большинство 64-битных архитектур, созданных на основе той же 32-битной архитектуры, могут выполнять код, написанный для 32-битных версий, без потери производительности. [ нужна цитация ] Этот вид поддержки обычно называют поддержкой двух-архивов или, в более общем смысле, поддержкой нескольких арок .
Версии процессора VR4300 широко используются в потребительских и офисных приложениях автоматизации, включая популярные видеоигры Nintendo 64TM и современные лазерные принтеры, такие как недавно анонсированное, отмеченное наградами семейство принтеров Hewlett-Packard LaserJet 4000.
Статус: Ядро, компилятор, набор инструментов работают. Ядро загружается и работает на симуляторе и используется для переноса пользовательского пространства и запуска программ.