Почему системы x86-64 имеют только 48-битное виртуальное адресное пространство?

В книге я прочитал следующее:

32-разрядные процессоры имеют 2^32 возможных адресов, в то время как современные 64-разрядные процессоры имеют 48-разрядное адресное пространство

Я ожидал, что если это 64-битный процессор, адресное пространство также должно быть 2^64.

Поэтому мне было интересно, что является причиной этого ограничения?

11 ответов

Решение

Потому что это все, что нужно. 48 бит дают адресное пространство 256 терабайт. Это много. В ближайшее время вы не увидите систему, которая нуждается в большем.

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

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

Любой ответ, касающийся размера шины и физической памяти, немного ошибочен, поскольку вопрос OP касался виртуального адресного пространства, а не физического адресного пространства. Например, предположительно аналогичный предел для некоторых 386-х был пределом физической памяти, которую они могли использовать, а не виртуальным адресным пространством, которое всегда было полными 32 битами. В принципе, вы можете использовать целые 64 бита виртуального адресного пространства даже с несколькими МБ физической памяти; Конечно, вы могли бы сделать это путем замены или для специализированных задач, где вы хотите отобразить одну и ту же страницу по большинству адресов (например, определенные операции с разреженными данными).

Я думаю, что реальный ответ заключается в том, что AMD просто была дешевой и надеялась, что сейчас это никому не нужно, но у меня нет ссылок на ссылки.

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

Внутренний собственный регистр / ширина операции не должны отражаться на ширине шины внешнего адреса.

Допустим, у вас есть 64-битный процессор, которому нужен только 1 мегабайт оперативной памяти. 20-битная адресная шина - это все, что требуется. Зачем беспокоиться о стоимости и сложности оборудования всех дополнительных выводов, которые вы не будете использовать?

Motorola 68000 была такой; 32-битный внутренний, но с 23-битной адресной шиной (и 16-битной шиной данных). Процессор мог получить доступ к 16 мегабайтам оперативной памяти, а для загрузки собственного типа данных (32 бита) потребовалось два доступа к памяти (каждый из которых содержал 16 бит данных).

Прочитайте раздел об ограничениях статьи в Википедии:

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

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

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

Сказать, что процессор 32-разрядный или 64-разрядный не означает, что он должен иметь 32-разрядную адресную шину или 64-разрядную адресную шину соответственно!... Я повторяю, что НЕ!!

32-битный процессор означает, что он имеет 32-битный ALU (Арифметический и логический блок)... это означает, что он может работать с 32-битным двоичным операндом (или просто сказать двоичное число, имеющее 32 цифры), и аналогично 64-битный процессор может работать с 64-битным двоичным операндом операнд. Поэтому, если 32-разрядный или 64-разрядный процессор не означает, что максимальный объем памяти может быть установлен. Они просто показывают, насколько большим может быть операнд...(для аналогии вы можете подумать, что 10-значный калькулятор может вычислять результаты до 10 цифр... он не может дать нам 11 цифр или любые другие большие результаты... хотя это в десятичном виде, но я говорю эту аналогию для простоты)... но то, что вы говорите, это адресное пространство, которое является максимальным объемом памяти (RAM), который может быть напрямую подключен. Максимально возможный размер ОЗУ определяется размером адресной шины, а не размером шины данных или даже ALU, для которого определяется размер процессора (32/64 бит). Да, если процессор имеет 32-разрядную "адресную шину", то он может адресовать 2^32 байта =4 ГБ ОЗУ (или для 64-разрядных это будет 2^64)... но, говоря, процессор 32-разрядный или 64-разрядный имеет ничего не относится к этому адресному пространству (адресному пространству = как далеко он может получить доступ к памяти или максимальному объему оперативной памяти), и это зависит только от размера его ALU. Конечно, шина данных и адресная шина могут быть одинакового размера, и тогда может показаться, что 32-битный процессор означает, что он получит доступ к 2^32 байтам или 4 ГБ памяти... но это только совпадение, и оно не будет таким же для всех.... например intel 8086 - это 16-битный процессор (так как он имеет 16-битный ALU), так что, как вы сказали, он должен был получить доступ к 2^16 байт =64 КБ памяти, но это не так. Он может получить доступ к 1 МБ памяти для 20-битной адресной шины.... Вы можете зайти в Google, если у вас есть какие-либо сомнения:)

Я думаю, что я ясно изложил свою точку зрения. Теперь перейдем к вашему вопросу... поскольку 64-разрядный процессор не означает, что он должен иметь 64-разрядную адресную шину, поэтому нет ничего плохого в том, чтобы иметь 48-разрядную адресную шину в 64-разрядном процессоре.... они сохранили адресное пространство меньше, чтобы удешевить проектирование и изготовление.... так как никто не будет использовать такую ​​большую память (2^64 байта)... где 2^48 байт более чем достаточно в наше время.

С моей точки зрения, это результат размера страницы. Каждая страница содержит не более 4096/8 =512 записей таблицы страниц. И 2^9 =512. Итак, 9 * 4 + 12=48.

Чтобы ответить на оригинальный вопрос: не было необходимости добавлять более 48 бит ПА.

Серверам нужен максимальный объем памяти, поэтому давайте попробуем копнуть глубже.

1) Самая большая (обычно используемая) конфигурация сервера - это система с 8 сокетами. Система 8 S - это не что иное, как 8 серверных процессоров, соединенных высокоскоростным когерентным соединением (или просто высокоскоростной "шиной"), чтобы сформировать единый узел. Существуют более крупные кластеры, но их мало и они далеко друг от друга, здесь мы говорим об часто используемых конфигурациях. Обратите внимание, что в реальных условиях использование системы 2 Socket является одним из наиболее часто используемых серверов, а 8 S обычно считается очень высокопроизводительным.

2) Основными типами памяти, используемой серверами, являются адресуемая байтом обычная память DRAM (например, память DDR3/DDR4), Memory Ipped IO - MMIO (например, память, используемая дополнительной картой), а также пространство конфигурации, используемое для настройки. устройства, которые присутствуют в системе. Первый тип памяти - это тип памяти, который обычно самый большой (и, следовательно, нуждается в наибольшем количестве битов адреса). Некоторые высокопроизводительные серверы также используют большое количество MMIO в зависимости от фактической конфигурации системы.

3) Предположим, что каждый серверный процессор может вмещать 16 модулей памяти DDR4 в каждом слоте. С максимальным размером DDR4 DIMM 256 ГБ. (В зависимости от версии сервера это количество возможных модулей DIMM на сокет на самом деле меньше 16 модулей DIMM, но продолжить чтение для примера).

Таким образом, каждый сокет теоретически может иметь 16*256 ГБ =4096 ГБ = 4 ТБ. Для нашей примерной системы 8 S размер DRAM может составлять максимум 4*8= 32 ТБ. Это означает, что максимальное количество битов, необходимых для адресации этого пространства DRAM, равно 45 (=log2 32TB/log2 2).

Мы не будем вдаваться в детали других типов памяти (MMIO, MMCFG и т. Д.), Но суть здесь в том, что наиболее "требовательный" тип памяти для системы с 8 сокетами и самыми большими типами модулей памяти DDR4, доступных сегодня (256 ГБ) DIMM) используют только 45 бит.

Для ОС, которая поддерживает 48 бит (например, WS16), есть (48-45=) 3 оставшихся бита. Это означает, что, если мы использовали младшие 45 бит исключительно для 32 ТБ памяти DRAM, у нас все еще будет 2^3 раза адресуемой памяти, которую можно использовать для MMIO/MMCFG для общего объема 256 ТБ адресуемого пространства.

Итак, подведем итог: 1) 48 бит физического адреса - это достаточно много бит для поддержки крупнейших систем сегодняшнего дня, которые "полностью загружены" большим количеством памяти DDR4, а также множеством других устройств ввода-вывода, которым требуется пространство MMIO. 256 ТБ, если быть точным.

Обратите внимание, что это адресное пространство размером 256 ТБ (=48 бит физического адреса) НЕ включает в себя какие-либо диски, такие как диски SATA, поскольку они НЕ являются частью карты адресов, они включают только память с байтовой адресацией и доступную для ОС.

2) Аппаратное обеспечение ЦП может выбрать реализацию 46, 48 или> 48 бит в зависимости от генерации сервера. Но еще один важный фактор - сколько бит распознает ОС. Сегодня WS16 поддерживает 48-битные физические адреса (=256 ТБ).

Для пользователя это означает, что, несмотря на то, что у него есть большой, ультрасовременный серверный ЦП, который может поддерживать> 48 бит адресации, если вы используете ОС, которая поддерживает только 48 бит PA, то вы можете использовать только 256 ТБ,

3) В целом, есть два основных фактора, которые позволяют использовать большее количество адресных битов (= больший объем памяти).

а) Сколько бит поддерживает ваш процессор HW? (Это может быть определено инструкцией CPUID в процессорах Intel).

б) Какую версию ОС вы используете и сколько бит PA распознает / поддерживает.

Минус (a,b) в конечном итоге определит объем адресуемого пространства, которым может воспользоваться ваша система.

Я написал этот ответ, не вдаваясь в подробности других ответов. Кроме того, я не вдавался в подробности нюансов MMIO, MMCFG и всей полноты построения адресной карты. Но я надеюсь, что это поможет.

Спасибо, Ананд К Энамандрам, Архитектор серверной платформы Intel Corporation

Неверно, что используются только младшие 48 бит 64-битного виртуального процессора, по крайней мере, с Intel 64. Старшие 16 бит используются, вроде как.

Раздел 3.3.7.1 Каноническая адресация в Руководстве разработчика программного обеспечения для архитектур Intel® 64 и IA-32 гласит:

канонический адрес должен иметь биты с 63 по 48, установленные на нули или единицы (в зависимости от того, является ли бит 47 нулем или единицей)

Таким образом, биты с 47 по 63 образуют суперразряд, либо все 1, либо все 0. Если адрес не в канонической форме, реализация должна давать сбой.

На AArch64 это не так. Согласно обзору набора инструкций ARMv8, это 49-разрядный ВА.

Система преобразования памяти AArch64 поддерживает 49-битный виртуальный адрес (48 бит на таблицу трансляции). Виртуальные адреса расширены до 49 бит и хранятся в 64-битном указателе. Опционально, под управлением системного регистра, наиболее значимые 8 битов 64-битного указателя могут содержать "тег", который будет игнорироваться при использовании в качестве адреса загрузки / сохранения или цели косвенной ветви

Я согласен с ответом @linzuojian.

В 32-битном режиме без PAE, где размер записи == 4 байта, у вас есть 10 бит для индексации как PDE, так и PTE, поэтому 4k/4 == 1024 == 2^10 = 10 бит.

В PAE размер записи составляет 8 байт, я думаю, что Intel пытается ограничить таблицу любого уровня до 4 КБ, у вас остается 4 КБ/8 == 512 == 2^9 == 9 бит.

48 бит взяты из 9-битного PML4 + 9-битного PDPT + 9-битного PD + 9-битного PT + 12-битного page_offset.

Интересно, что Intel увеличила VA с 48 до 57 с помощью PML5, что составляет еще 9 бит. Я думаю, они могут расширить его до 64, но тогда вы сможете индексировать только 2^7 == 128 записей в предполагаемом PML6.

Зачем ограничивать столы разрешением 4К? возможно, это связано с эффективностью использования памяти, поскольку каждый контекст может использовать всего 8 КБ для структуры данных управления памятью (PML4 + PDPT) или 12 КБ (PML5 + PML4 + PDPT).

Процессор считается "N-битами" в основном по размеру его шины данных и по большей части его сущностей (внутренней архитектуры): регистров, аккумуляторов, арифметико-логического устройства (ALU), набора команд и т. Д. Например: Старый добрый процессор Motorola 6800 (или Intel 8050) представляет собой 8-разрядный процессор. Он имеет 8-битную шину данных, 8-битную внутреннюю архитектуру и 16-битную адресную шину.


  • Хотя N-битный ЦП может иметь иные объекты, чем N-размер. Например, улучшения в 6809 по сравнению с 6800 (оба - 8-битный процессор с 8-битной шиной данных). Среди значительных улучшений, представленных в 6809, было использование двух 8-разрядных аккумуляторов (A и B, которые можно объединить в один 16-разрядный регистр D), двух 16-разрядных индексных регистров (X, Y) и двух 16-битные указатели стека.
Другие вопросы по тегам