При доступе к памяти будет ли установлен бит доступа к таблице страниц / грязный бит в случае попадания в кеш?

Насколько мне известно, доступ к памяти ЦП включает кеш ЦП и MMU. ЦП попытается найти свою цель в кеше, и если произойдет промах в кеше, ЦП переключится на MMU. Во время доступа через MMU бит доступа / загрязнения соответствующей записи таблицы страниц будет установлен аппаратно.

Однако, насколько мне известно, большая часть архитектуры ЦП не будет запускать MMU, если не произойдет промах в кеше, и здесь моя проблема в том, будет ли бит доступа / грязный бит записи таблицы страниц по-прежнему устанавливаться при попадании в кеш? Или это связано с архитектурой?


person 黄海鑫    schedule 07.04.2017    source источник


Ответы (3)


Я думаю, вы можете предположить, что эти биты кэшируются в TLB, и если есть какое-либо несоответствие со значениями в TLB и доступами, выполняемыми ядром, будет выполнена помощь микрокода, и биты будут обновлены. Например, если биты A 1 или D равны нулю и происходит доступ или сохранение, это условие будет обнаружено и будут установлены соответствующие биты.

Вы также можете предположить, что быстрый путь для попаданий TLB не может перейти в память, и посмотреть, согласуются ли кешированные биты TLB с PTE в ОЗУ. Более того, на x86 изменения PTE не передаются аппаратно в TLB в стиле аннулирования кэша; то есть TLB не является согласованным.

Это означает, что, если биты не синхронизированы определенным образом, они, вероятно, не будут обновлены правильно. Например, если бит A (соответственно D) установлен в TLB, и происходит доступ (соответственно сохранение), ничего не произойдет, даже если бит A (или D) фактически не установлен в PTE. Сущность, вносящая изменения в биты, отвечает за очистку TLB, чтобы биты правильно обновлялись в будущем.


1 Странно иметь запись TLB с A == 0: вы ожидаете, что запись будет там в результате доступа, поэтому бит A установлен с самого начала. Возможно, это может произойти в некоторых сценариях, например, страница, открытая в результате спекулятивного доступа или предварительной выборки.

person BeeOnRope    schedule 25.01.2020
comment
Системное программное обеспечение может очистить A, а затем через некоторое время проверить, был ли он установлен, чтобы определить, какие страницы неактивны, то есть перед q для удаления. - person mevets; 27.01.2020
comment
@mevets - да, это как раз основной сценарий, о котором я говорю в последних двух абзацах: где биты страницы меняются под обложками, а TLB не знает об этом. В этом случае системное программное обеспечение должно выполнить проверку, если они хотят, чтобы бит A был установлен надежно. - person BeeOnRope; 28.01.2020

Большинство кешей виртуально индексированы и физически помечены для более быстрого доступа. Таким образом, ЦП выдает виртуальный адрес, а индексные биты адреса используются для поиска записи. В это время адрес отправляется в TLB для получения физического адреса. К тому времени, когда кэш обнаружит запись, TLB вернет физический адрес, который затем будет использоваться для сравнения тегов. Теперь могут произойти две вещи.

  1. TLB не может иметь запись (отсутствует TLB)
  2. Несоответствие тега кэша (ошибка кэша)

В случае 1 вам необходимо получить доступ к записи таблицы страниц (PTE), чтобы получить правильный физический адрес.

В случае 2, если TLB вернул действительное сопоставление, вам просто нужно его получить. Если TLB также имеет промах (например, 1 и 2), вам необходимо получить физический адрес из PTE и извлечь данные.

Итак, чтобы ответить на ваш вопрос, в случае HIT, PTE не нужно знать обо всем этом.

person Isuru H    schedule 07.04.2017
comment
Спасибо, поэтому ответ таков: биты PTE не будут установлены, если произойдет и попадание в кеш, и попадание TLB? - person 黄海鑫; 10.04.2017
comment
Насколько мне известно, да. - person Isuru H; 10.04.2017
comment
Вы не можете получить 1 и 2 одновременно. У вас может быть 1 , а затем 2 для одного доступа, когда он повторяет попытку после того, как запись TLB готова. Тогда это просто случай 2. Без перевода вам не с чем проверять теги, поэтому вы не знаете, удались ли они или нет, или откуда брать данные. Это может быть даже неотмеченный адрес без перевода (- ›ошибка страницы). - person Peter Cordes; 25.01.2020

Обычно вы не можете получить попадание в кеш, если к странице никогда не обращались изначально, поэтому этот вопрос не имеет значения. (Изменить: если подумать, это может быть возможно в некоторых причудливых случаях псевдонима страницы, но там применяется тот же ответ для грязного бита)

Возможно иметь кешированную строку с чистой страницы (никогда ранее не записываемой). Это немного необычно, поскольку вам обычно нужно инициализировать данные перед доступом к ним, но страницу можно было заменить ранее, а затем переустановить на карту страниц (точное поведение будет зависеть от ОС, но это возможно).

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

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

person Leeor    schedule 09.04.2017
comment
Спасибо, но я думаю, что ОС будет время от времени очищать биты доступа в таблице страниц (например, во время восстановления страницы), поэтому могут быть шансы, что у кешированных страниц биты доступа не установлены. Я не уверен, что полностью понимаю ваш ответ, но имели ли вы в виду, что доступ к странице без установленного грязного / доступного бит приведет к ошибке страницы? - person 黄海鑫; 10.04.2017
comment
да. Если код обращается к такой странице, вы получите ошибку. С другой стороны, если ОС каким-то образом изменяет карту страниц (возможно, во внешнем процессе или в ядре), вам нужно будет принудительно обновить копии, кэшированные в TLB, так что обычно вы получаете сбой TLB. - person Leeor; 11.04.2017
comment
Практически помечен? Нет, современные кэши L1d x86 - это VIPT (обычно с достаточной ассоциативностью, чтобы сделать их также PIPT: без псевдонимов, но они все равно могут выполнять поиск TLB параллельно с выборкой тегов из индексированного набора). Большинство других ISA используют тот же трюк, иногда требование, чтобы ОС выполняла раскраску страниц, чтобы избежать сглаживания. Теги определенно являются физическими, поэтому кеш не нужно очищать при изменении таблицы страниц верхнего уровня при переключении контекста. И поэтому разные логические ядра на одном физическом ядре и просто конкурентно совместно используют кеш, даже если они используют разные таблицы страниц. - person Peter Cordes; 25.01.2020
comment
@PeterCordes: исправлено, спасибо. Конечно, это было ошибкой. Весь смысл параллельного доступа к TLB / кешу состоит в том, чтобы использовать то, что у вас уже есть, до перевода. - person Leeor; 27.01.2020
comment
Если вы пытаетесь писать на страницу без установленного грязного бита (или обращаетесь к странице без бита доступа) - вы получите ошибку страницы - Может быть, на некоторых ISA? На x86 эти биты записываются аппаратно. См. Ответ BeeOnRope на этот вопрос. - person Peter Cordes; 28.01.2020
comment
Кроме того, для хранилища доступ к TLB должен происходить во время выполнения uop адреса хранилища (проверка адреса и запись результата в буфер хранилища). Но фактический доступ к L1d не происходит до тех пор, пока он не удалится и не пора зафиксировать кеш L1d. TLB параллельно с доступом к тегу кеша, я думаю, происходит только для нагрузок, предполагая конвейерный процессор с буфером хранилища. На процессорах, где VIPT = PIPT, поскольку они достаточно ассоциативны, вы можете индексировать кеш, используя только физический адрес для магазинов. Я не уверен на 100%, может ли буфер хранилища все еще нуждаться в виртуальном адресе. - person Peter Cordes; 28.01.2020