Я думаю, вы можете предположить, что эти биты кэшируются в 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