@ MargaretBloom Мой плохой, я скучаю по истолкованному. Это 9 бит, как вы сказали: 4 * 9 бит (каждый индекс) + 12 бит (смещение) = 48 бит.

ге «Программирование низкого уровня: C, сборка и выполнение программы на архитектуре Intel® 64» я прочитал:

Каждый виртуальный 64-битный адрес (например, тот, который мы используем в наших программах) состоит из нескольких полей. На самом деле адрес имеет ширину всего 48 бит; он расширяется до 64-битного канонического адреса. Его характеристика в том, что его 17 левых битов равны. Если условие не выполняется, адрес сразу же отклоняется при использовании. Затем 48 бит виртуального адреса преобразуются в 52 бита физического адреса с помощью специальных таблиц.

Почему разница в 4 бита между виртуальным адресом и физическим адресом?

 Peter Cordes01 окт. 2017 г., 17:21
Интересный факт: если вы хотите использовать высокие 16 для теговых указателей, вы можетеshl rax,16 / sar rax,16 перед использованием, чтобы повторить расширение знака. (Или лучше, чтобы ваша программа выделяла только помеченные указатели в нижней половине канонического диапазона, так что вы можете просто использоватьand или ИМТ2andn чтобы сделать адреса каноническими.) Или, что еще лучше, выделять только в нижних 4G виртуального адресного пространства, чтобы вы могли использовать префиксы размера адреса (0x67), чтобы игнорировать большой мусор, или использовать 32-битный размер операнда при манипулировании указателями на ноль. продлить их бесплатно.
 Peter Cordes01 окт. 2017 г., 17:31
Я предполагаю, что если / когда произойдет аппаратная поддержка более широких виртуальных адресов, возможно,mmap(MAP_48BIT) флаг, эквивалентный текущемуmmap(MAP_32BIT) поэтому программы, которые хотят использовать высокие 16 в своих целях, могут продолжать это делать. Использование только старшего байта может быть безопаснее в течение более длительного времени, поскольку расширение виртуального далеко за пределы физического менее вероятно, даже при том, что энергонезависимое хранилище с распределенной памятью становится делом. (например, быстрее, чем вспышка на DIMM.)
 Martin Rosenau01 окт. 2017 г., 07:47
Встречный вопрос: почему виртуальные и физические адреса должны иметь одинаковый размер? 8-битные компьютеры в 1980-х годах, использующие более 48 Кб памяти, также использовали «банкинг памяти», что более или менее означает, что битов физического адреса было больше, чем виртуальных.
 gsi-frank01 окт. 2017 г., 08:10
@MartinRosenau Извините, вы думаете, мой вопрос подразумевает, чтоЯ думаю, что виртуальные и физические адреса должны иметь одинаковый размер, Я хотел просто спросить, почему разница в этом конкретном случае. Я нахожу что-то подобное тому, что вы написали в своем комментарии, но связано с «современным ПК» и 64-битной адресацией.

Ответы на вопрос(1)

Решение Вопроса

вы говорите о x86-64, мой ответ основан на этой архитектуре.

При работе в 64-битном режиме ЦП использует обновленную функцию для преобразования виртуальных адресов в физические адреса, известные какPAE - расширение физического адреса.
Первоначально изобретенная для преодоления ограничения в 4 ГБ при использовании 32-разрядных указателей, эта функция предполагает использование таблиц 4-го уровня.
Каждая таблица дает указатель на следующую таблицу, вплоть до самой правой, которая дает старшие биты физического адреса. Чтобы получить представление, посмотрите на эту картинку изРуководство по программированию архитектуры AMD64:

Обоснование всех этих таблицразреженность: метаданные для перевода виртуальных адресов в физические адреса огромны - если бы мы использовали только 4 КБ страницы, нам бы понадобилось 264 - 12 = 252 записи для покрытия всего 64-битного адресного пространства.
Таблицы допускают разреженный подход, только необходимые записи заполняются в памяти.

Эта схема отражена в том, как виртуальный адрес разделен (и, следовательно, косвенно, по количеству уровней), только индексы из 9 битов используются для индексации таблиц на каждом уровне.
Начиная с включенного бита 12, это дает: уровень 1 -> 12-20, уровень 2 -> 21-29, уровень 3 -> 30-38, уровень 4 -> 39-47.

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

мойличный Мнение заключается в том, что AMD стала первой, кто выпустил процессор x86 с 64-битной поддержкой и повторно использовал PAE, исправив его с новым уровнем косвенности для преобразования до 48 бит.
Обратите внимание, что как Intel, так и AMD позволяют будущей реализации использовать 64-битный виртуальный адрес (возможно, с большим количеством таблиц).

Однако обе компании установили жесткий предел в 52 бита для физического адреса. Почему?

Ответ все еще можно найти в том, как работает пейджинг.
В 32-битном режиме каждая запись в каждой таблице имеет ширину 32 бита; младшие биты используются в качестве флагов (так как требования выравнивания делают их бесполезными для процесса перевода), но старшие биты были использованы для перевода, обеспечивая виртуальный / физический перевод 32/32.
Важно подчеркнуть, что использовались все 32 бита, в то время как некоторые младшие биты не использовались в качестве флагов, Intel пометила их как «Игнорируемые» или «Доступные», что означает, что ОС может свободно использовать их.

Когда Intel представила PAE, им потребовалось еще 4 бита (тогда PAE составлял 36 бит), и логично было сделать следующее:двойной размер каждой записи, поскольку это создает более эффективную компоновку, чем, скажем, 40-битная запись таблицы.
Это дало Intel много свободного места, и они пометили его как зарезервированное (это лучше наблюдать в более старых версиях руководств Intel SDM,как этот).

Со временем в записи понадобились новые атрибуты, самый известный из которыхБит XD / NX.
Защитные ключи также являются относительно новой функцией, которая занимает место в записи. Это показывает, что полный 64/64 бит виртуальный / физический перевод больше не возможен с текущим ISA.

Для наглядности приведен формат записей 64-битной таблицы PAE:

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

Ну, сложно сказать.
Конечно, размер физического адресного пространства имеетаппаратные средства связанные с этим затраты: больше выводов (хотя со встроенным контроллером памяти это уменьшается, поскольку спецификации DDR мультиплексируют много сигналов) и больше места в кэш-памяти / TLB.
В этомвопрос (аналогично, но недостаточно, чтобы сделать это дубликатом), ответ города Википедии, который, в свою очередь, якобы ссылается на AMD, утверждая, что инженеры AMD установили ограничение в 52 бита после должного рассмотрения преимуществ и затрат.

Делюсь чемГанс Пассант написал более 6 лет назад: существующие механизмы разбиения на страницы не подходят для полной 64-битной физической адресации, и это, вероятно, причина, по которой Intel и AMD никогда не беспокоились о сохранении старших бит в каждой записи зарезервированными.

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

 Peter Cordes01 окт. 2017 г., 17:52
Даже 2 МБ страницы не страшны; Ганс даже предположил, что 4М может быть в порядке. (Это размер огромной страницы x86-32.) И кстати, только серьезное высокопроизводительное программное обеспечение, такое как базы данных, захочет отобразить модули DIMM с энергонезависимой памятью в свое собственное виртуальное адресное пространство для эквивалента прямого ввода-вывода. Все остальное пройдет через файловую систему. Или, если он достаточно быстрый (или DRAM ограничен / не существует), ОС может удовлетворитьmmap(PROT_READ|PROT_EXEC) запросы путем сопоставления энергонезависимого хранилища напрямую с страницами 1G / 2M / 4k. Это было бы идеальной победой, чтобы ограничить ваше отображение 2M-выровненным кратным 2M.
 Margaret Bloom01 окт. 2017 г., 18:03
@PeterCordes, да, действительно 4KiB является проблематичным. Огромные страницы, безусловно, единственный путь. Трудно сказать, каким будет будущее, когда мы достигнем предела 2 ^ 52, такие размеры, как GiB, могут даже считаться небольшими. Лично я считаю, что программное обеспечение для обхода таблиц с напрямую доступным TLB было бы лучшим подходом (как это происходит в некоторых реализациях MRCS IIRC)
 gsi-frank01 окт. 2017 г., 23:27
@ MargaretBloom Мой плохой, я скучаю по истолкованному. Это 9 бит, как вы сказали: 4 * 9 бит (каждый индекс) + 12 бит (смещение) = 48 бит.
 gsi-frank01 окт. 2017 г., 17:28
Большое спасибо за ваш ответ! Удивительно!! Вы сказали: «для индексации таблиц на каждом уровне используются только серии из 9 битов», а затем описываются компоненты виртуальных адресов. Но автор сказал, что для каждой таблицы индекса используются 12 бит (в сумме 48 бит) вместо 9 бит. Я просто говорю на случай, если из этого наблюдения получится что-то хорошее. Остальные биты - это один знаковый бит, а остальные 17 бит (чтобы сложить 64 бита), которые должны быть равны адресу, который не следует отбрасывать, как сказано в моей книжной цитате. Автор описывает архитектуру как «архитектура Intel 64: также известная как x86_64 и AMD64»
 Peter Cordes01 окт. 2017 г., 17:41
@ Маргарет: Ганс только говорил, что 4k страниц слишком малы. Если огромные пространства памяти для энергонезависимого хранилища начнут становиться чем-то, я подозреваю, что TLB начнут получать больше записей для 1G огромных страниц (текущие = 4x 1G записей, полностью связанных в Skylake), а операционные системы позволят отображать пространство пользователя в энергонезависимой памяти с огромными страницами 1G. Я предполагаю, что большинству процессов базы данных понадобится одно или два огромных смежных отображения, и двухуровневая таблица страниц (эффективная глубина с огромной страницей 1G вместо PDPTE) подходит для этого, верно? Насколько я понимаю, наличие большего количества уровней в основном помогает, когда сопоставления редки.

Ваш ответ на вопрос