Адресация памяти - PullRequest
       22

Адресация памяти

4 голосов
/ 07 июля 2010

Я читал http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map и, в частности, следующий раздел:

В материнской плате шлюз процессора к мир - это лицевая сторона автобуса соединяя его с северным мостом. Всякий раз, когда процессор должен прочитать или Пишите в память, это происходит через эту шину. Он использует несколько контактов для передачи адрес физической памяти, который он хочет пиши или читай, пока другие пины отправляют значение, которое будет написано или получить значение читается. Intel Core 2 QX6600 имеет 33 контакта для передачи адрес физической памяти (так что есть 2 ^ 33 выбора мест памяти) и 64 булавки для отправки или получения данных (так данные передаются в 64-битных данных путь, или 8-байтовые куски). Это позволяет процессор для физического адресации 64 гигабайт памяти (2 ^ 33 места * 8 байт) хотя большинство чипсетов только обрабатывать до 8 гигабайт оперативной памяти.

Теперь приведенная выше математика гласит, что, поскольку для адресации предусмотрено 33 контакта, 2 ^ 33 * 8 байт = 64 ГБ. Все хорошо, но теперь я немного запутался. Допустим, я установил 64-битную ОС, смогу ли я адресовать всего 64 ГБ или 2 ^ 64 ГБ * 8 = 2 ^ 64 ГБ (что намного больше)? Кроме того, предполагая, что я использую тот же процессор выше на 32-битном процессоре, я могу адресовать только 4 ГБ (2 ^ 32 бит = 4 ГБ * 8 = 4 ГБ)?

Я думаю, что физическое против "Допустимая ОС" вводит меня в заблуждение.

Спасибо!

Ответы [ 8 ]

3 голосов
/ 07 июля 2010

Вы путаете кучу вещей:

  • Размер указателя ограничивает объем виртуальной памяти, доступ к которой может получить пользовательский процесс.Не все из них на самом деле могут быть использованы вашим процессом (традиционно резервируется «старший» 1 или 2 ГБ для использования ядром).
  • Не все биты виртуального адреса являются действительными.Исходная реализация AMD64 эффективно использует 48-битные адреса с расширенными знаками (т.е. адреса в диапазоне [0x0000800000000000,0xFFFF7FFFFFFFFFFF] являются недопустимыми).Это существует в основном для ограничения таблиц страниц до 4 уровней, что снижает стоимость ошибки страницы;вам нужны 6-уровневые таблицы страниц для адресации полных 2 ^ 64 бит, при условии 4K страниц.Для сравнения, i386 имеет двухуровневые таблицы страниц.
  • Не все виртуальные адреса должны соответствовать физическим адресам в любой момент времени.В этом весь смысл виртуальной памяти: вы можете обращаться к памяти, которая «физически» не существует, и операционная система выдает ее за вас.
  • Не все физические адреса соответствуют виртуальным адресам.Они могут не отображаться, например, но также возможно иметь больше физической памяти, чем вы можете адресовать.PAE поддерживает до 64 ГБ физических адресов и был распространен на серверах до AMD64.В то время как отдельный процесс не может адресовать 64 ГБ, это означает, что вы можете запускать много многигабайтных процессов без постоянной подкачки.
  • И, наконец: Нет смысла иметь больше физических адресов, чем вашСлоты ОЗУ могут обрабатывать. У меня есть плата D945GCLF2, которая поддерживает AMD64, но только 2 ГБ ОЗУ.Нет смысла иметь дополнительные физические адресные строки, которые все равно нельзя использовать.(Я работаю вручную над отображаемыми в память устройствами и прикольной штукой с двумя DIMM-слотами, название которой забыла.)

Также обратите внимание на несколько других вещей:

  • Для операций ввода-вывода с отображением в памяти (в аппаратном смысле) ЦПУ необходимо адресовать отдельные байты.Он не может просто сделать 64-битный доступ.Похоже, что это замаскировано.
  • Современные процессоры включают контроллер памяти на CPU вместо традиционных северного моста и FSB (см. HyperTransport и QuickPath).
2 голосов
/ 07 июля 2010

Да, количество бит в физических и виртуальных адресах может быть разным.Скажем, вот что говорит 64-битный Linux о ядрах здесь (cat /proc/cpuinfo):

...
processor       : 3
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 33
model name      : Dual Core AMD Opteron(tm) Processor 280
stepping        : 2
cpu MHz         : 2392.623
cache size      : 1024 KB
...
bogomips        : 4784.41
TLB size        : 1088 4K pages
clflush size    : 64
cache_alignment : 64
<b>address sizes   : 40 bits physical, 48 bits virtual</b>
power management: ts fid vid ttp
1 голос
/ 07 июля 2010

Есть несколько вещей, которые следует учитывать в отношении физических адресных проводов:

  1. Каждый провод физического адреса («штырь») ссылается на слово на передней стороне шины, а не на адрес байта. Если процессор выбирает 64-битные слова, то провода физического адреса будут выровнены по этой 8-байтовой границе. Поэтому адресные линии A0-A2 не являются проводными, потому что они всегда будут нулевыми. Таким образом, диапазон байтовых адресов физических проводов увеличивается на ширину лицевой шины.

  2. Система виртуальной памяти может поддерживать карту 64-битных виртуальных адресов в n-битные физические адреса. На практике ОС поддерживает значение «физического максимального адреса», которое сопоставления виртуальных машин не превышают.

  3. Некоторые архитектуры памяти допускают разбиение на страницы в банках памяти, когда аппаратное оборудование вне ЦП увеличивает эффективный диапазон адресов физической памяти, повторно используя некоторые физические адреса для разных «банков» памяти.

0 голосов
/ 07 июля 2010

Я думаю, что вас смущает тот факт, что память хранит 8 байтов одновременно, но адрес (на уровне ЦП) относится к 1 байту (а не к группе из 8). Таким образом, с 32 битами вы можете «сослаться» на 2 ^ 32 байта = 4 ГБ. Если вы предпочитаете +8 по указателю, то соответствует +1 по номеру «физической» строки. После этого вы можете получить доступ к большему количеству памяти, используя нумерацию страниц (не уверен, что она все еще используется в современном компьютере).

Чтобы провести аналогию с библиотекой, вы (или процессор) можете перечислить 32 ^ 2 книги, но библиотекарь (чипсет) имеет дело с полками книг. Так что для вас книга № 10, это книга № 2 или полки № 2, но вы никогда не увидите номер полки. Это работа библиотекаря, чтобы пойти на хорошую полку и принести вам хорошую книгу. Для меня (другая программа на том же компьютере) книга № 10 может быть другой: книга № 2 полки 100002 (потому что моя страница начинается с полки 10000) Мы можем сослаться на 32 ^ 2 разных книги, но они не одинаковы (и библиотека может иметь гораздо больше).

(Изменения сильно изменились с тех пор, как я изучал компьютер, поэтому то, что я говорю, может быть не на 100% точным, но я думаю, что идея есть)

0 голосов
/ 07 июля 2010

Ограничение набора микросхем является важным фактором - аппаратное обеспечение на материнской плате должно иметь возможность передавать адреса из ЦП в ОЗУ. Таким образом, ограничение 8 ГБ будет применяться, если у вас нет материнской платы, предназначенной для обработки большего количества.

Для справки, современные 64-разрядные ЦП имеют старшие x-разрядные биты (где-то между 8 и 24 битами) адресного пространства, соединенные вместе, так как 64-разрядные сейчас просто слишком много адресного пространства (вы бы нужно 8 миллиардов 2 ГБ модулей, чтобы занять столько адресного пространства). Например, AMD имеют 48-разрядное ограничение (IIRC) на адресное пространство в одном сегменте. Что более чем достаточно, но далеко не теоретический максимум.

0 голосов
/ 07 июля 2010

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

0 голосов
/ 07 июля 2010

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

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

Кроме того, современные операционные системы обычно используют подсистему виртуальной памяти, которая преобразует логические адреса в их соответствующие физические адреса. С кешированием, фактическое физическое расположение памяти может быть в одном (или нескольких!) Компонентах по иерархии памяти (например, кеш процессора, основная память, жесткий диск и т. Д.). Не знаю, как я полностью забыл упомянуть VM, но это определенно поможет вашему пониманию исследовать это.

0 голосов
/ 07 июля 2010

Я считаю, что если у вас есть 64-битная операционная система, вы можете (теоретически) обратиться к 2 ^ 64 * 8 байтов = 16 ЭБ (эксабайт), но аппаратные средства будут ограничены 2 ^ 33 * 8 байтами = 64GB.Если у вас 32-битная ОС, вы не сможете использовать полную аппаратную емкость, поскольку ОС является ограничивающим фактором, поскольку она может выражать только 2 ^ 32 разных адресов.Возможно, я ухожу, но это мое текущее понимание.

...