Как реализованы регистры 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 "Пентиум III " глава 32 "Pentium III Xeon " книга ясно говорит:

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

Но с другой стороны ... WRMSR в MTRR regs сделает недействительным TLB (согласно инструкции по эксплуатации Intel "instruct32.chm»):

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

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

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

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

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

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

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

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

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

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

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

Если в кеше есть копия строки, которая содержит запрошенные данные для чтения, данные для чтения помещаются в буфер загрузки.Если поиск в кеше приводит к промаху, запрос перенаправляется в восходящий поток в кэш L2.Если в кэш-памяти L2 имеется копия сектора, содержащая запрошенные данные для чтения, считанные данные немедленно помещаются в буфер загрузки, а сектор копируется в кэш-память L1.Если поиск в кеше приводит к пропаданию, запрос направляется в восходящий поток либо в кэш L3 (если есть), либо в интерфейсный блок FSB.Если в кэш-памяти L3 имеется копия сектора, содержащая запрошенные данные для чтения, считанные данные немедленно помещаются в буфер загрузки, а сектор копируется в кэш-память L2 и кэш-память данных L1.Если поиск в кеше верхнего уровня приводит к пропуску, запрос перенаправляется в интерфейсный блок FSB.Когда сектор возвращается из памяти, считанные данные немедленно помещаются в буфер загрузки, и сектор копируется в кэш 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 хранятся в процессореПишут комбинирующие буферы (WCB).Каждый WCB может содержать одну строку (64 байта данных).Поскольку сохранения выполняются для строки пространства памяти WC, байты накапливаются в WCB, назначенной для записи записей в эту строку пространства памяти.Последующее сохранение в местоположении в WCB может перезаписать байт, который был размещен в этом местоположении более ранним хранилищем в это местоположение. Другими словами, множественные записи в одно и то же местоположение свернуты, так что это местоположение отражает последний байт данных, записанный в это место.Когда в конечном итоге WCB выгружаются во внешнюю память через FSB, данные не обязательно записываются в память в том же порядке, в котором были выполнены более ранние программные хранилища. Устройство, на которое выполняется запись, должно терпеть этот тип поведения (т. Е. Оно должно функционировать правильно). Увидеть "WCB ФСБ Транзакции " на странице 1080 для получения дополнительной информации.

Магазины в WT Memory

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

 Lewis Kelsey07 мар. 2019 г., 10:14
Я неЯ не верю, что TLB и очистка кэша выполняются автоматически. Это должно быть сделано в программном обеспечении.xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/... xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/...

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