Введение
В компьютерной архитектуре 64-битные целые числа, адреса памяти или другие единицы данных имеют ширину 64 бита. Кроме того, 64-битные центральные процессоры (CPU) и арифметико-логические устройства (ALU) – это те, которые основаны на регистрах процессора, адресных шинах или шинах данных такого размера. Компьютер, использующий такой процессор, является 64-битным компьютером. С точки зрения программного обеспечения, 64-битные вычисления означают использование машинного кода с 64-битными адресами виртуальной памяти. Однако не все 64-битные наборы инструкций поддерживают полные 64-битные адреса виртуальной памяти; например, x86-64 и AArch64 поддерживают только 48 бит виртуального адреса, при этом остальные 16 бит виртуального адреса должны быть либо все нули (000), либо все единицы (111), а некоторые 64-битные наборы инструкций поддерживают менее 64 бит адреса физической памяти. Термин «64 бит» также описывает поколение компьютеров, в котором 64-битные процессоры стали стандартом. 64 бита – это размер слова, определяющий определенные классы компьютерной архитектуры, шины, память и процессоры, а также, соответственно, программное обеспечение, работающее на них. 64-битные процессоры используются в суперкомпьютерах с 1970-х годов (Cray 1, 1975) и в рабочих станциях и серверах на основе RISC (reduced instruction set computers) с начала 1990-х годов. В 2003 году 64-битные процессоры были представлены на рынке персональных компьютеров в виде процессоров x86-64 и PowerPC G5. 64-битный регистр может содержать любое из 2<sup>64</sup> (более 18 квинтиллионов или 1,8 × 10<sup>19</sup>) различных значений. Диапазон целых значений, которые могут быть сохранены в 64 битах, зависит от используемого представления целых чисел. При двух наиболее распространенных представлениях диапазон составляет от 0 до 18 446 744 073 709 551 615 (равно 2<sup>64</sup> − 1) при представлении в виде (беззнакового) двоичного числа и от −9 223 372 036 854 775 808 (−2<sup>63</sup>) до 9 223 372 036 854 775 807 (2<sup>63</sup> − 1) при представлении в виде дополнительного кода. Следовательно, процессор с 64-битными адресами памяти может напрямую обращаться к 2<sup>64</sup> байтам (16 эксибайтам или EiB) адресуемой памяти. Если не указано иное, 64-битная компьютерная архитектура обычно имеет целые и адресные регистры шириной 64 бита, что обеспечивает прямую поддержку 64-битных типов данных и адресов. Однако процессор может иметь внешние шины данных или адресные шины разных размеров, даже больших (например, 32-битный Pentium имел 64-битную шину данных).
In computer architecture, 64 bit integers, memory addresses, or other data units are those that are 64 bits wide. Also, 64 bit central processing units (CPU) and arithmetic logic units (ALU) are those that are based on processor registers, address buses, or data buses of that size. A computer that uses such a processor is a 64 bit computer. From the software perspective, 64 bit computing means the use of machine code with 64 bit virtual memory addresses. However, not all 64 bit instruction sets support full 64 bit virtual memory addresses; x86 64 and AArch64 for example, support only 48 bits of virtual address, with the remaining 16 bits of the virtual address required to be all zeros (000 ) or all ones (111 ), and several 64 bit instruction sets support fewer than 64 bits of physical memory address. The term 64 bit also describes a generation of computers in which 64 bit processors are the norm. 64 bits is a word size that defines certain classes of computer architecture, buses, memory, and CPUs and, by extension, the software that runs on them. 64 bit CPUs have been used in supercomputers since the 1970s (Cray 1, 1975) and in reduced instruction set computers (RISC) based workstations and servers since the early 1990s. In 2003, 64 bit CPUs were introduced to the mainstream PC market in the form of x86 64 processors and the PowerPC G5. A 64 bit register can hold any of 264 (over 18 quintillion or 1.8×1019) different values. The range of integer values that can be stored in 64 bits depends on the integer representation used. With the two most common representations, the range is 0 through 18,446,744,073,709,551,615 (equal to 264 − 1) for representation as an (unsigned) binary number, and −9,223,372,036,854,775,808 (−263) through 9,223,372,036,854,775,807 (263 − 1) for representation as two's complement. Hence, a processor with 64 bit memory addresses can directly access 264 bytes (16 exbibytes or EiB) of byte addressable memory. With no further qualification, a 64 bit computer architecture generally has integer and addressing registers that are 64 bits wide, allowing direct support for 64 bit data types and addresses. However, a CPU might have external data buses or address buses with different sizes from the registers, even larger (the 32 bit Pentium had a 64 bit data bus, for instance).
Архитектурные последствия
Регистры процессоров обычно делятся на несколько групп: целочисленные, с плавающей точкой, SIMD (одна инструкция – множественные данные), регистры управления и часто специальные регистры для адресной арифметики, которые могут иметь различные назначения и названия, такие как адресные, индексные или базовые регистры. Однако в современных конструкциях эти функции часто выполняются более универсальными целочисленными регистрами. В большинстве процессоров для адресации данных в памяти могут использоваться только целочисленные или адресные регистры; другие типы регистров не могут быть использованы для этой цели. Размер этих регистров, как правило, ограничивает объем непосредственно адресуемой памяти, даже если существуют более широкие регистры, например, регистры с плавающей точкой. Большинство высокопроизводительных 32-битных и 64-битных процессоров (за некоторыми заметными исключениями, такими как более старые или встраиваемые процессоры ARM и 32-битные процессоры MIPS) имеют встроенное аппаратное обеспечение для работы с плавающей точкой, которое часто, но не всегда, основано на 64-битных единицах данных. Например, хотя архитектура x86/x87 имеет инструкции для загрузки и сохранения 64-битных (и 32-битных) значений с плавающей точкой в память, внутренний формат данных и регистров с плавающей точкой имеет ширину 80 бит, в то время как регистры общего назначения имеют ширину 32 бита. В отличие от этого, 64-битная линейка Alpha использует 64-битный формат данных и регистров с плавающей точкой, а также 64-битные целочисленные регистры.
История
Многие наборы инструкций компьютера разработаны таким образом, чтобы один регистр целых чисел мог хранить адрес памяти в любом месте физической или виртуальной памяти компьютера. Поэтому общее количество адресов в памяти часто определяется шириной этих регистров. IBM System/360 1960-х годов был одним из первых 32-битных компьютеров; он имел 32-битные регистры целых чисел, хотя использовал только 24 младших бита слова для адресов, что привело к 16 Мбайт (16 × 1024² байт) адресного пространства. 32-битные суперминикомпьютеры, такие как DEC VAX, стали распространены в 1970-х годах, а 32-битные микропроцессоры, такие как семейство Motorola 68000 и 32-битные представители семейства x86, начиная с Intel 80386, появились в середине 1980-х годов, что сделало 32 бита своего рода де-факто стандартом в качестве удобного размера регистра. 32-битный адресный регистр означал, что можно было адресовать 2³² адреса, или 4 Гигабайта оперативной памяти (RAM). Когда эти архитектуры разрабатывались, 4 Гигабайта памяти значительно превышали типичные объемы (4 Мегабайта) в установках, поэтому этого считалось достаточным запасом для адресации. 4,29 миллиарда адресов считались подходящим размером для работы по еще одной важной причине: 4,29 миллиарда целых чисел достаточно для присвоения уникальных идентификаторов большинству объектов в таких приложениях, как базы данных. Некоторые архитектуры суперкомпьютеров 1970-х и 1980-х годов, такие как Cray 1, использовали регистры шириной до 64 бит и поддерживали 64-битную целочисленную арифметику, хотя 64-битной адресации они не поддерживали. В середине 1980-х годов началась разработка Intel i860, которая завершилась выпуском в 1989 году; i860 имел 32-битные регистры целых чисел и 32-битную адресацию, поэтому не был полностью 64-битным процессором, хотя его графический блок поддерживал 64-битную целочисленную арифметику. Однако 32 бита оставались нормой до начала 1990-х годов, когда постоянное снижение стоимости памяти привело к появлению установок с объемом оперативной памяти, приближающимся к 4 Гигабайтам, и стало желательным использование виртуальных пространств памяти, превышающих предел в 4 Гигабайта, для решения определенных типов задач. В ответ MIPS и DEC разработали 64-битные микропроцессорные архитектуры, первоначально для высокопроизводительных рабочих станций и серверов. К середине 1990-х годов HAL Computer Systems, Sun Microsystems, IBM, Silicon Graphics и Hewlett Packard разработали 64-битные архитектуры для своих рабочих станций и серверных систем. Заметным исключением из этой тенденции были мэйнфреймы IBM, которые в то время использовали 32-битные данные и 31-битные размеры адресов; 64-битные процессоры в мэйнфреймы IBM были добавлены только в 2000 году. В 1990-х годах несколько недорогих 64-битных микропроцессоров использовались в потребительской электронике и встроенных приложениях. В частности, Nintendo 64 и PlayStation 2 имели 64-битные микропроцессоры еще до их появления в персональных компьютерах. Высокопроизводительные принтеры, сетевое оборудование и промышленные компьютеры также использовали 64-битные микропроцессоры, такие как Quantum Effect Devices R5000. 64-битные вычисления начали проникать на настольные компьютеры с 2003 года, когда некоторые модели в линейке Macintosh компании Apple перешли на процессоры PowerPC 970 (названные Apple G5), а Advanced Micro Devices (AMD) выпустила свой первый 64-битный процессор x86-64. Физическая память в конечном итоге догнала 32-битные ограничения. В 2023 году ноутбуки обычно оснащались 16 ГБ памяти, а серверы – до 64 ГБ, что значительно превышает 4 ГБ адресной емкости 32 бит.
64-битная временная линия данных
1961 IBM поставляет суперкомпьютер IBM 7030 Stretch, который использует 64-битные слова для данных и 32- или 64-битные слова для инструкций. 1974 Control Data Corporation запускает векторовый суперкомпьютер CDC Star 100, использующий 64-битную архитектуру слов (предыдущие системы CDC были основаны на 60-битной архитектуре). International Computers Limited запускает серию ICL 2900 с 32-битными, 64-битными и 128-битными целыми числами в дополнительном коде; 64-битной и 128-битной арифметикой с плавающей точкой; 32-битной, 64-битной и 128-битной упакованной десятичной арифметикой и 128-битным регистром-аккумулятором. Архитектура сохранилась в ряде машин ICL и Fujitsu. Последней из них является Fujitsu Supernova, которая эмулирует исходную среду на 64-битных процессорах Intel. 1976 Cray Research поставляет первый суперкомпьютер Cray 1, основанный на 64-битной архитектуре слов, который станет основой для последующих векторных суперкомпьютеров Cray. 1983 Elxsi запускает параллельный мини-суперкомпьютер Elxsi 6400. Архитектура Elxsi имеет 64-битные регистры данных, но 32-битное адресное пространство. 1989 Intel представляет процессор Intel i860 с упрощенным набором команд (RISC). Маркетировался как "64-битный микропроцессор", но фактически имел 32-битную архитектуру, дополненную 3D-графическим блоком, способным выполнять 64-битные целочисленные операции. 1993 Atari представляет видеоигровую консоль Atari Jaguar, в архитектуре которой используются некоторые 64-битные шины данных.
Временная линия 64-битных адресов
1991 MIPS Computer Systems производит первый 64-битный микропроцессор R4000, реализующий архитектуру MIPS III – третье пересмотрение архитектуры MIPS. Процессор используется в графических рабочих станциях SGI, начиная с IRIS Crimson. Kendall Square Research представила свой первый суперкомпьютер KSR1, основанный на собственной 64-битной RISC-архитектуре процессора с операционной системой OSF/1. 1992 Digital Equipment Corporation (DEC) представляет 64-битную архитектуру Alpha, разработанную в рамках проекта PRISM. 1994 Intel объявляет о планах по 64-битной архитектуре IA 64 (разработанной совместно с Hewlett Packard) как преемнице 32-битных процессоров IA 32. Ориентировочный срок запуска – 1998–1999 годы. 1995 Sun выпускает 64-битный процессор SPARC, UltraSPARC. Компания Fujitsu HAL Computer Systems выпускает рабочие станции на базе 64-битного процессора SPARC64 первого поколения, разработанного HAL. IBM выпускает микропроцессоры A10 и A30 – первые 64-битные процессоры PowerPC AS. IBM также выпускает 64-битную модернизацию системы AS/400, позволяющую конвертировать операционную систему, базу данных и приложения. 1996 Nintendo представляет игровую консоль Nintendo 64, построенную на базе недорогой версии MIPS R4000. HP выпускает первую реализацию 64-битной архитектуры PA RISC 2.0 – PA 8000. 1998 IBM выпускает линейку 64-битных процессоров PowerPC/POWER. 1999 Intel выпускает набор инструкций для архитектуры IA 64. AMD публично раскрывает набор 64-битных расширений для IA 32, известных как x86 64 (позже брендированных как AMD64). 2000 IBM выпускает свой первый 64-битный мейнфрейм z/Architecture, zSeries z900. z/Architecture – это 64-битная версия 32-битной архитектуры ESA/390, произошедшей от 32-битной архитектуры System/360. 2001 Intel выпускает линейку процессоров IA 64 после многократных задержек с выходом на рынок. Теперь известные как Itanium и ориентированные на высокопроизводительные серверы, продажи не оправдали ожиданий. 2003 AMD представляет линейки процессоров Opteron и Athlon 64, основанные на архитектуре AMD64 – первой 64-битной архитектуре процессоров на базе x86. Apple также выпускает 64-битный процессор "G5" PowerPC 970, произведенный IBM. Intel утверждает, что чипы Itanium останутся ее единственными 64-битными процессорами. 2004 Intel, реагируя на рыночный успех AMD, признает, что разрабатывает клон расширений AMD64 под названием IA 32e (позже переименованный в EM64T, а затем в Intel 64). Intel выпускает обновленные версии семейств процессоров Xeon и Pentium 4 с поддержкой нового 64-битного набора инструкций. VIA Technologies анонсирует 64-битный процессор Isaiah. 2006 Sony, IBM и Toshiba начинают производство 64-битного процессора Cell для использования в PlayStation 3, серверах, рабочих станциях и других устройствах. Intel выпускает Core 2 Duo как первый массовый процессор x86 64 для своих мобильных, настольных и рабочих станций. Предыдущие 64-битные расширения процессоров не были широко доступны на потребительском рынке (большинство 64-битных Pentium 4/D были OEM), 64-битные Pentium 4, Pentium D и Celeron не производились массово до конца 2006 года из-за проблем с низким выходом годных чипов (большинство пластин с хорошим выходом были предназначены для серверов и мейнфреймов, в то время как основная часть оставалась 130-нм 32-битной линией процессоров до 2006 года) и вскоре стали процессорами начального уровня после выхода Core 2. AMD выпускает свой первый 64-битный мобильный процессор, изготовленный по 90-нм технологии. 2011 ARM Holdings объявляет ARMv8 A – первую 64-битную версию семейства архитектур ARM. 30 октября 2012 года ARM Holdings анонсирует ядра Cortex A53 и Cortex A57 – первые ядра, основанные на 64-битной архитектуре. 2013 Apple анонсирует iPhone 5S с первым в мире 64-битным процессором в смартфоне, использующим систему на чипе A7 ARMv8 A, а также iPad Air и iPad Mini 2, которые являются первыми в мире 64-битными процессорами в планшете. 2014 Google анонсирует планшет Nexus 9 – первое Android-устройство, работающее на 64-битном чипе Tegra K1. 2015 Apple анонсирует iPod Touch (6-го поколения) – первый iPod Touch с 64-битным процессором A8 ARMv8 A на чипе, а также Apple TV (4-го поколения) – первый в мире 64-битный процессор в Apple TV. 2018 Apple анонсирует Apple Watch Series 4 – первые Apple Watch с 64-битным процессором S4 ARMv8 A на чипе. 2020 Synopsis объявляет ARCv3 ISA – первую 64-битную версию ARC ISA.
Временная линия 64-битных операционных систем
1985 Cray выпускает UNICOS, первую 64-битную реализацию операционной системы Unix. 1993 DEC выпускает 64-битную операционную систему DEC OSF/1 AXP Unix (позже переименованную в Tru64 UNIX) для своих систем, основанных на архитектуре Alpha. 1994 Поддержка процессора R8000 добавлена компанией Silicon Graphics в операционную систему IRIX в версии 6.0. 1995 DEC выпускает OpenVMS 7.0, первую полную 64-битную версию OpenVMS для Alpha. Выпущен первый 64-битный дистрибутив Linux для архитектуры Alpha. 1996 Поддержка процессоров R4x00 в 64-битном режиме добавлена компанией Silicon Graphics в операционную систему IRIX в выпуске 6.2. 1998 Sun выпускает Solaris 7, с полной поддержкой 64-битного UltraSPARC. 2000 IBM выпускает z/OS, 64-битную операционную систему, произошедшую от MVS, для новых 64-битных мэйнфреймов zSeries; 64-битный Linux на z Systems следует за выпуском CPU почти сразу. 2001 Linux становится первым ядром ОС, полностью поддерживающим x86 64 (на симуляторе, поскольку еще не было выпущено процессоров x86 64). 2001 Microsoft выпускает Windows XP 64 Bit Edition для архитектуры Itanium IA 64; она может запускать 32-битные приложения через уровень исполнения. 2003 Apple выпускает операционную систему Mac OS X 10.3 "Panther", которая добавляет поддержку 64-битной целочисленной арифметики на процессорах PowerPC 970. Несколько дистрибутивов Linux выпускаются с поддержкой AMD64. Выпущены версии FreeBSD с поддержкой AMD64. 4 января 2005 года Microsoft прекращает выпуск Windows XP 64 Bit Edition, поскольку с сентября прошлого года не было доступно компьютеров с процессорами IA 64, и объявляет, что разрабатывает версии Windows x86 64, чтобы заменить ее. 31 января Sun выпускает Solaris 10 с поддержкой процессоров AMD64 и EM64T. 29 апреля Apple выпускает Mac OS X 10.4 "Tiger", который обеспечивает ограниченную поддержку 64-битных приложений командной строки на компьютерах с процессорами PowerPC 970; более поздние версии для компьютеров Mac на базе Intel поддерживают 64-битные приложения командной строки на компьютерах Mac с процессорами EM64T. 30 апреля Microsoft выпускает Windows XP Professional x64 Edition и Windows Server 2003 x64 Edition для процессоров AMD64 и EM64T. 2006 Microsoft выпускает Windows Vista, включая 64-битную версию для процессоров AMD64/EM64T, которая сохраняет 32-битную совместимость. В 64-битной версии все приложения и компоненты Windows 64-битные, хотя многие из них также имеют 32-битные версии для совместимости с плагинами. 2007 Apple выпускает Mac OS X 10.5 "Leopard", который полностью поддерживает 64-битные приложения на машинах с процессорами PowerPC 970 или EM64T. 2009 Microsoft выпускает Windows 7, которая, как и Windows Vista, включает в себя полную 64-битную версию для процессоров AMD64/Intel 64; большинство новых компьютеров загружаются по умолчанию с 64-битной версией. Microsoft также выпускает Windows Server 2008 R2, которая является первой 64-битной операционной системой для серверов. Apple выпускает Mac OS X 10.6, "Snow Leopard", который поставляется с 64-битным ядром для процессоров AMD64/Intel64, хотя только некоторые последние модели компьютеров Apple будут работать с 64-битным ядром по умолчанию. Большинство приложений, поставляемых в комплекте с Mac OS X 10.6, теперь также 64-битные. 2013 Apple выпускает iOS 7, которая на машинах с процессорами AArch64 имеет 64-битное ядро, поддерживающее 64-битные приложения. 2014 Google выпускает Android Lollipop, первую версию операционной системы Android с поддержкой 64-битных процессоров. 2017 Apple выпускает iOS 11, поддерживая только машины с процессорами AArch64. У нее 64-битное ядро, которое поддерживает только 64-битные приложения. 32-битные приложения больше не совместимы. 2018 Apple выпускает watchOS 5, первую версию watchOS, которая обеспечивает 64-битную поддержку. 2019 Apple выпускает macOS 10.15 "Catalina", отказываясь от поддержки 32-битных приложений Intel. 2021 Microsoft выпускает Windows 11 5 октября, которая поддерживает только 64-битные системы, отказываясь от поддержки 32-битных систем. 2022 Google выпускает Pixel 7, который отказывается от поддержки не 64-битных приложений. Apple выпускает watchOS 9, первую версию watchOS, которая работает исключительно на моделях Apple Watch с 64-битными процессорами (включая Apple Watch Series 4 или более поздние, Apple Watch SE (1-го поколения) или более поздние и недавно представленные Apple Watch Ultra), прекращая поддержку Apple Watch Series 3 как последней модели Apple Watch с 32-битным процессором.
Ограничения переработчиков
В принципе, 64-битный микропроцессор может адресовать 16 EiB (16 × 10246 = 264 = 18 446 744 073 709 551 616 байт, или около 18,4 эксабайт) памяти. Однако не все наборы инструкций и не все процессоры, реализующие эти наборы инструкций, поддерживают полное 64-битное виртуальное или физическое адресное пространство. Архитектура x86 64 (по состоянию на 2016 год) позволяет использовать 48 бит для виртуальной памяти и, для любого процессора, до 52 бит для физической памяти. Эти ограничения допускают размеры памяти 256 TiB (256 × 10244 байт) и 4 PiB (4 × 10245 байт) соответственно. В настоящее время ПК не может содержать 4 пебибайта памяти (из-за физического размера чипов памяти), но AMD предполагала создание больших серверов, кластеров с общей памятью и других применений физического адресного пространства, которые могут приблизиться к этому в обозримом будущем. Таким образом, 52-битный физический адрес предоставляет достаточно места для расширения, не требуя затрат на реализацию полных 64-битных физических адресов. Аналогично, 48-битное виртуальное адресное пространство было разработано для обеспечения 65 536 (216) раз превышающего 32-битное ограничение в 4 GiB (4 × 10243 байт), предоставляя пространство для последующего расширения и не внося накладных расходов на преобразование полных 64-битных адресов. Power ISA v3.0 позволяет использовать 64 бита для эффективного адреса, отображаемого в сегментированный адрес с разрешением от 65 до 78 бит для виртуальной памяти и, для любого данного процессора, до 60 бит для физической памяти. Архитектура Oracle SPARC 2015 позволяет использовать 64 бита для виртуальной памяти и, для любого процессора, от 40 до 56 бит для физической памяти. Архитектура системы виртуальной памяти ARM AArch64 позволяет использовать 48 бит для виртуальной памяти и, для любого процессора, от 32 до 48 бит для физической памяти. Спецификация DEC Alpha требует поддержки как минимум 43 битов адресного пространства виртуальной памяти (8 TiB), а аппаратное обеспечение должно проверять и генерировать исключение, если оставшиеся неподдерживаемые биты равны нулю (для обеспечения совместимости на будущих процессорах). Alpha 21064 поддерживала 43 бита виртуального адресного пространства памяти (8 TiB) и 34 бита физического адресного пространства памяти (16 GiB). Alpha 21164 поддерживала 43 бита виртуального адресного пространства памяти (8 TiB) и 40 бит физического адресного пространства памяти (1 TiB). Alpha 21264 поддерживает пользовательскую настройку 43 или 48 бит виртуального адресного пространства памяти (8 TiB или 256 TiB) и 44 бита физического адресного пространства памяти (16 TiB).
Доступность программного обеспечения
В 64-битных системах на основе x86 иногда отсутствуют эквиваленты программного обеспечения, написанного для 32-битных архитектур. Наиболее серьезная проблема в Microsoft Windows — несовместимые драйверы устройств для устаревшего оборудования. Большинство 32-битных программных приложений могут работать на 64-битных операционных системах в режиме совместимости, также называемом режимом эмуляции, например, технология Microsoft WoW64 для IA 64 и AMD64. 64-битная среда драйверов Windows Native Mode работает поверх 64-битной системы и не может вызывать 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. 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-битных процессорах. Это позволило этим компьютерам поддерживать 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-битные версии. Эта модель распространения, основанная на исходном коде, с акцентом на частые выпуски, делает доступность прикладного программного обеспечения для этих операционных систем менее острой проблемой.
64-битные модели данных
В 32-битных программах указатели и типы данных, такие как целые числа, обычно имеют одинаковую длину. Это не обязательно верно для 64-битных машин. Смешивание типов данных в языках программирования, таких как C и его потомков, таких как C++ и Objective C, может работать на 32-битных реализациях, но не на 64-битных реализациях. Во многих средах программирования для C и C-производных языков на 64-битовых машинах переменные `int` по-прежнему имеют ширину 32 бита, но длинные целые числа и указатели имеют ширину 64 бита. Они описываются как имеющие модель данных LP64, которая является аббревиатурой "Long, Pointer, 64". Другие модели – это модель данных ILP64, в которой все три типа данных имеют ширину 64 бита.
+ 64 bit data models Datamodel Pointer, Sample operating systems ILP32 16 32 32 64 32 x32 and ABIs on Linux systems; MIPS N32 ABI. LLP64 16 32 32 64 64 Microsoft Windows (x86 64, IA 64, and ARM64) using Visual C++; and MinGW LP64 16 32 64 64 64 Most Unix and Unix like systems, e. g., Solaris, Linux, BSD, macOS. Windows when using Cygwin; z/OS ILP64 16 64 64 64 64 HAL Computer Systems port of Solaris to the SPARC64 SILP64 64 64 64 64 64 Classic UNICOS (versus UNICOS/mp, etc.) Many 64 bit platforms today use an LP64 model (including Solaris, AIX, HP UX, Linux, macOS, BSD, and IBM z/OS). Microsoft Windows uses an LLP64 model. The disadvantage of the LP64 model is that storing a long into an int truncates. On the other hand, converting a pointer to a long will "work" in LP64. In the LLP64 model, the reverse is true. These are not problems which affect fully standard compliant code, but code is often written with implicit assumptions about the widths of data types. C code should prefer (u)intptr t instead of long when casting pointers into integer objects. A programming model is a choice made to suit a given compiler, and several can coexist on the same OS. However, the programming model chosen as the primary model for the OS application programming interface (API) typically dominates. Another consideration is the data model used for device drivers. Drivers make up the majority of the operating system code in most modern operating systems (although many may not be loaded when the operating system is running). Many drivers use pointers heavily to manipulate data, and in some cases have to load pointers of a certain size into the hardware they support for direct memory access (DMA). As an example, a driver for a 32 bit PCI device asking the device to DMA data into upper areas of a 64 bit machine's memory could not satisfy requests from the operating system to load data from the device to memory above the 4 gibibyte barrier, because the pointers for those addresses would not fit into the DMA registers of the device. This problem is solved by having the OS take the memory restrictions of the device into account when generating requests to drivers for DMA, or by using an input–output memory management unit (IOMMU).
+ 64-битная модель данных
Datamodel | Pointer | Sample operating systems
------- | -------- | --------
ILP32 | 16 | 32 | 32 | 64 | 32 x32 и ABI на системах Linux; MIPS N32 ABI.
LLP64 | 16 | 32 | 32 | 64 | 64 Microsoft Windows (x86 64, IA 64 и ARM64) с использованием Visual C++; и MinGW
LP64 | 16 | 32 | 64 | 64 | 64 Большинство Unix и Unix-подобных систем, например, Solaris, Linux, BSD, macOS. Windows при использовании Cygwin; z/OS
ILP64 | 16 | 64 | 64 | 64 | 64 HAL Computer Systems порт Solaris на SPARC64
SILP64 | 64 | 64 | 64 | 64 | 64 Classic UNICOS (против UNICOS/mp и т. д.)
+ 64 bit data models Datamodel Pointer, Sample operating systems ILP32 16 32 32 64 32 x32 and ABIs on Linux systems; MIPS N32 ABI. LLP64 16 32 32 64 64 Microsoft Windows (x86 64, IA 64, and ARM64) using Visual C++; and MinGW LP64 16 32 64 64 64 Most Unix and Unix like systems, e. g., Solaris, Linux, BSD, macOS. Windows when using Cygwin; z/OS ILP64 16 64 64 64 64 HAL Computer Systems port of Solaris to the SPARC64 SILP64 64 64 64 64 64 Classic UNICOS (versus UNICOS/mp, etc.) Many 64 bit platforms today use an LP64 model (including Solaris, AIX, HP UX, Linux, macOS, BSD, and IBM z/OS). Microsoft Windows uses an LLP64 model. The disadvantage of the LP64 model is that storing a long into an int truncates. On the other hand, converting a pointer to a long will "work" in LP64. In the LLP64 model, the reverse is true. These are not problems which affect fully standard compliant code, but code is often written with implicit assumptions about the widths of data types. C code should prefer (u)intptr t instead of long when casting pointers into integer objects. A programming model is a choice made to suit a given compiler, and several can coexist on the same OS. However, the programming model chosen as the primary model for the OS application programming interface (API) typically dominates. Another consideration is the data model used for device drivers. Drivers make up the majority of the operating system code in most modern operating systems (although many may not be loaded when the operating system is running). Many drivers use pointers heavily to manipulate data, and in some cases have to load pointers of a certain size into the hardware they support for direct memory access (DMA). As an example, a driver for a 32 bit PCI device asking the device to DMA data into upper areas of a 64 bit machine's memory could not satisfy requests from the operating system to load data from the device to memory above the 4 gibibyte barrier, because the pointers for those addresses would not fit into the DMA registers of the device. This problem is solved by having the OS take the memory restrictions of the device into account when generating requests to drivers for DMA, or by using an input–output memory management unit (IOMMU).
Многие 64-битные платформы сегодня используют модель LP64 (включая Solaris, AIX, HP UX, Linux, macOS, BSD и IBM z/OS). Microsoft Windows использует модель LLP64. Недостатком модели LP64 является то, что хранение длинного целого числа в `int` приводит к усечению. С другой стороны, преобразование указателя в длинное целое число будет "работать" в LP64. В модели LLP64 происходит обратное. Это не проблемы, которые влияют на полностью стандартный код, но код часто пишется с неявными предположениями о ширине типов данных. В коде на C следует предпочитать `(u)intptr_t` вместо `long` при приведении указателей к целочисленным типам. Модель программирования – это выбор, сделанный для конкретного компилятора, и несколько моделей могут сосуществовать в одной ОС. Однако модель программирования, выбранная в качестве основной для интерфейса прикладного программирования ОС (API), обычно доминирует.
+ 64 bit data models Datamodel Pointer, Sample operating systems ILP32 16 32 32 64 32 x32 and ABIs on Linux systems; MIPS N32 ABI. LLP64 16 32 32 64 64 Microsoft Windows (x86 64, IA 64, and ARM64) using Visual C++; and MinGW LP64 16 32 64 64 64 Most Unix and Unix like systems, e. g., Solaris, Linux, BSD, macOS. Windows when using Cygwin; z/OS ILP64 16 64 64 64 64 HAL Computer Systems port of Solaris to the SPARC64 SILP64 64 64 64 64 64 Classic UNICOS (versus UNICOS/mp, etc.) Many 64 bit platforms today use an LP64 model (including Solaris, AIX, HP UX, Linux, macOS, BSD, and IBM z/OS). Microsoft Windows uses an LLP64 model. The disadvantage of the LP64 model is that storing a long into an int truncates. On the other hand, converting a pointer to a long will "work" in LP64. In the LLP64 model, the reverse is true. These are not problems which affect fully standard compliant code, but code is often written with implicit assumptions about the widths of data types. C code should prefer (u)intptr t instead of long when casting pointers into integer objects. A programming model is a choice made to suit a given compiler, and several can coexist on the same OS. However, the programming model chosen as the primary model for the OS application programming interface (API) typically dominates. Another consideration is the data model used for device drivers. Drivers make up the majority of the operating system code in most modern operating systems (although many may not be loaded when the operating system is running). Many drivers use pointers heavily to manipulate data, and in some cases have to load pointers of a certain size into the hardware they support for direct memory access (DMA). As an example, a driver for a 32 bit PCI device asking the device to DMA data into upper areas of a 64 bit machine's memory could not satisfy requests from the operating system to load data from the device to memory above the 4 gibibyte barrier, because the pointers for those addresses would not fit into the DMA registers of the device. This problem is solved by having the OS take the memory restrictions of the device into account when generating requests to drivers for DMA, or by using an input–output memory management unit (IOMMU).
Еще одним фактором является модель данных, используемая для драйверов устройств. Драйверы составляют большую часть кода операционной системы в большинстве современных операционных систем (хотя многие из них могут не загружаться при запуске операционной системы). Многие драйверы активно используют указатели для манипулирования данными, и в некоторых случаях им приходится загружать указатели определенного размера в аппаратное обеспечение, которое они поддерживают, для прямого доступа к памяти (DMA). Например, драйвер для 32-битного PCI-устройства, запрашивающий устройство для передачи данных DMA в верхние области памяти 64-битной машины, не сможет удовлетворить запросы операционной системы на загрузку данных из устройства в память выше 4-гибибайтного барьера, поскольку указатели на эти адреса не поместятся в регистры DMA устройства. Эта проблема решается путем учета ОС ограничений памяти устройства при генерации запросов драйверам для DMA или использованием блока управления памятью ввода-вывода (IOMMU).
+ 64 bit data models Datamodel Pointer, Sample operating systems ILP32 16 32 32 64 32 x32 and ABIs on Linux systems; MIPS N32 ABI. LLP64 16 32 32 64 64 Microsoft Windows (x86 64, IA 64, and ARM64) using Visual C++; and MinGW LP64 16 32 64 64 64 Most Unix and Unix like systems, e. g., Solaris, Linux, BSD, macOS. Windows when using Cygwin; z/OS ILP64 16 64 64 64 64 HAL Computer Systems port of Solaris to the SPARC64 SILP64 64 64 64 64 64 Classic UNICOS (versus UNICOS/mp, etc.) Many 64 bit platforms today use an LP64 model (including Solaris, AIX, HP UX, Linux, macOS, BSD, and IBM z/OS). Microsoft Windows uses an LLP64 model. The disadvantage of the LP64 model is that storing a long into an int truncates. On the other hand, converting a pointer to a long will "work" in LP64. In the LLP64 model, the reverse is true. These are not problems which affect fully standard compliant code, but code is often written with implicit assumptions about the widths of data types. C code should prefer (u)intptr t instead of long when casting pointers into integer objects. A programming model is a choice made to suit a given compiler, and several can coexist on the same OS. However, the programming model chosen as the primary model for the OS application programming interface (API) typically dominates. Another consideration is the data model used for device drivers. Drivers make up the majority of the operating system code in most modern operating systems (although many may not be loaded when the operating system is running). Many drivers use pointers heavily to manipulate data, and in some cases have to load pointers of a certain size into the hardware they support for direct memory access (DMA). As an example, a driver for a 32 bit PCI device asking the device to DMA data into upper areas of a 64 bit machine's memory could not satisfy requests from the operating system to load data from the device to memory above the 4 gibibyte barrier, because the pointers for those addresses would not fit into the DMA registers of the device. This problem is solved by having the OS take the memory restrictions of the device into account when generating requests to drivers for DMA, or by using an input–output memory management unit (IOMMU).