Как реализованы регистры MTRR?

x86/x86-64 предоставляет MTRR (Memory-type-range-register), который может быть полезен для обозначения разных частей физического адресного пространства для разных видов использования (например, Cacheable, Unchangeable, Writecombining и т. д.).

Мой вопрос заключается в том, кто-нибудь знает, как они ограничены в физическом адресном пространстве, как определено MTRR, в аппаратном обеспечении? При каждом доступе к памяти аппаратное обеспечение проверяет, попадает ли физический адрес в заданный диапазон, прежде чем процесс решит, следует ли ему искать кэш или искать в буфере объединения записей или отправлять его непосредственно контроллеру памяти?

Спасибо

1 ответ

Решение

Википедия говорит в статье MTRR, что:

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

Таким образом, для более новых процессоров x86/x86_64 можно сказать, что MTRR может быть реализован как дополнительная технология к PAT (таблицы атрибутов страницы). Место, где PAT хранится в памяти, - это таблица страниц (некоторые биты в записи таблицы страниц, или PTE), а в ЦП они хранятся (кэшируются) в таблице TLB (она является частью MMU). TLB (и MMU) уже является местом, которое посещают каждый доступ к памяти. Я думаю, это может быть хорошим местом для контроля типа памяти, даже с MTRR(?)

Но что, если я перестану гадать и открою книгу RTFM? Есть одна очень хорошая книга о мире x86: Unabridged Pentium 4: IA32 Processor Genealogy (ISBN-13: 978-0321246561). Часть 7, глава 24 "Расширение программного обеспечения Pentium Pro", часть "MTRR добавлено".

Существуют длинные правила для каждого типа памяти mtrr на страницах 582-584, но правила для всех 5 типов (Uncacheable=UC, Write-Combining=WC, Write-Through=WT, Write-Protect=WP, Write-Back=WB) начинается с: "Выполняется поиск в кэше".

А в части 9 "Pentium III" главы 32 "Pentium III Xeon" в книге четко сказано:

Когда ему необходимо выполнить доступ к памяти, процессор обращается к MTRR и выбранным PTE или PDE, чтобы определить тип памяти (и, следовательно, правила поведения, которым он должен следовать).

Но с другой стороны... WRMSR в регистры MTRR лишит законной силы TLB (согласно руководству по эксплуатации intel "instruct32.chm"):

Когда инструкция WRMSR используется для записи в MTRR, TLB становятся недействительными, включая глобальные записи (см. "Трансляционные буферные приемники (TLB)" в Главе 3 Руководства разработчика программного обеспечения для архитектуры Intel (R) IA-32, том 3).

И есть еще один прямой совет в "Руководстве разработчика программного обеспечения для архитектуры Intel 64 и IA-32, том 3a", раздел "10.11.9 Особенности больших страниц":

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

Вы спрашивали:

При каждом доступе к памяти аппаратное обеспечение проверяет, попадает ли физический адрес в заданный диапазон

Нет. Каждый доступ к памяти не сравнивается со всеми MTRR. Все диапазоны MTRR предварительно объединяются с битами памяти PTE, когда PTE загружается в TLB. Тогда единственным местом для проверки типа памяти будет строка TLB. И TLB IS проверяется для каждого доступа к памяти.

должен ли он искать кеш, искать буфер записи или отправлять его непосредственно в контроллер памяти

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

Из главы 24 (речь идет о Pentium 4):

Загрузка из кэшируемой памяти Типы памяти, из которых процессору разрешено кэшировать, это память WP, WT и WB (как определено в MTRR и PTE или PDE).

Когда ядро ​​отправляет загрузочную швабру, швабра помещается в загрузочный буфер, который был зарезервирован для него на этапе Allocator. Запрос на чтение данных из памяти затем передается в кэш данных L1 для выполнения:

  1. Если в кеше есть копия строки, которая содержит запрошенные данные для чтения, данные для чтения помещаются в буфер загрузки.
  2. Если поиск в кеше приводит к пропаданию, запрос перенаправляется в восходящий поток в кэш L2.
  3. Если в кэш-памяти L2 имеется копия сектора, содержащая запрошенные данные чтения, считанные данные немедленно помещаются в буфер загрузки, а сектор копируется в кэш данных L1.
  4. Если поиск в кеше приводит к пропаданию, запрос направляется в восходящий поток либо в кэш L3 (если есть), либо в интерфейсный блок FSB.
  5. Если в кэш-памяти L3 имеется копия сектора, содержащая запрошенные данные для чтения, считанные данные немедленно помещаются в буфер загрузки, а сектор копируется в кэш-память L2 и кэш-память данных L1.
  6. Если поиск в кеше верхнего уровня приводит к пропуску, запрос перенаправляется в интерфейсный блок FSB.
  7. Когда сектор возвращается из памяти, считанные данные немедленно помещаются в буфер загрузки, и сектор копируется в кэш L3 (если он есть), кэш L2 и кэш данных L1.

Ядру процессора разрешено спекулятивно выполнять нагрузки, которые читают данные из пространства памяти WC, WP, WT или WB

Загрузка из некэшируемой памяти Типы некэшируемой памяти - UC и WC (как определено в MTRR и PTE или PDE).

Когда ядро ​​отправляет швабру загрузки, запрос на чтение помещается в буфер загрузки, который был зарезервирован для него на этапе Allocator. Запрос на чтение данных из памяти также отправляется в кэш процессора. В случае попадания в кеш, строка кеша удаляется из кеша. Запрос выдается в интерфейсный блок ФСБ. Транзакция чтения данных из памяти выполняется на FSB для извлечения только запрошенных байтов из памяти. Когда данные возвращаются из памяти, считанные данные немедленно помещаются в буфер загрузки.

Ядро процессора не имеет права спекулятивно выполнять нагрузки, считывающие данные из памяти UC.

Хранение в UC Memory UC - это один из двух типов кэшируемой памяти (другой тип памяти WC). Когда выполняется сохранение в памяти UC, оно публикуется в буфере хранилища, зарезервированном для него на этапе Allocator. Хранения в памяти UC также отправляются в кэш данных L1, кэш L2 или кэш L3 (если он есть). В случае попадания в кеш, строка удаляется из кеша.

Когда буфер хранилища, содержащий хранилище в памяти UC, перенаправляется в интерфейсный блок FSB, транзакция записи данных в память... выполняется в FSB

Хранение в памяти WC. Тип памяти WC хорошо подходит для области памяти (например, буфера видеокадров), которая имеет следующие характеристики:

  • Процессор не кэшируется из памяти WC.
  • Спекулятивное выполнение загрузок из памяти WC разрешено.
  • Хранилища в памяти WC хранятся в буферах записи (CPU) записи процессора.
  • Каждый WCB может содержать одну строку (64 байта данных).
  • Поскольку сохранения выполняются в строке пространства памяти WC, байты накапливаются в WCB, назначенной для записи записей в эту строку пространства памяти.
  • Последующее сохранение в местоположении в WCB может перезаписать байт, который был размещен в этом местоположении более ранним хранилищем в это местоположение. Другими словами, множественные записи в одно и то же местоположение свернуты, так что это местоположение отражает последний байт данных, записанный в это место.
  • Когда в конечном итоге WCB выгружаются во внешнюю память через FSB, данные не обязательно записываются в память в том же порядке, в котором были выполнены более ранние программные хранилища. Записываемое устройство должно терпеть этот тип поведения (т. Е. Оно должно функционировать правильно). См. "Транзакции WCB FSB" на стр. 1080 для получения дополнительной информации.

Магазины в WT Memory

Когда хранилище кешируется, выполняется сквозная память. Магазин размещен в буфере магазина, который был зарезервирован для его использования на этапе Allocator. Кроме того, хранилище передается в кэш данных L1 для поиска. Существует несколько возможностей: * Если хранилище попадает в кэш данных, строка в кэше обновляется, но остается в состоянии S (что означает, что строка действительна). * Если хранилище пропускает кэш данных, оно перенаправляется в кэш L2 и выполняется поиск: * - если оно попадает в строку в кеше L2, строка обновляется, но остается в состоянии S (что означает строка действительна). * - Если он отсутствует в кэше L2 и кэш L3 отсутствует, дальнейшие действия не предпринимаются.

Другие вопросы по тегам