Когда делать или не делать INVLPG, MOV to CR3, чтобы минимизировать сброс TLB

пролог

Я - любитель операционной системы, и мое ядро ​​работает на 80486+ и уже поддерживает виртуальную память.

Начиная с 80386, семейство процессоров x86 от Intel и различные его клоны поддерживают виртуальную память с подкачкой. Хорошо известно, что когдаPG немного вCR0 установлен, процессор использует трансляцию виртуального адреса. ТогдаCR3 регистр указывает на каталог страниц верхнего уровня, который является корнем для 2-4 уровней структур таблиц страниц, которые отображают виртуальные адреса на физические адреса.

Процессор не обращается к этим таблицам для каждого сгенерированного виртуального адреса, вместо этого кэширует их в структуре, называемойПеревод Lookaside Bufferили TLB. Однако при внесении изменений в таблицы страниц TLB необходимо сбросить. На 80386 процессорах эта очистка выполняется перезагрузкой (MOV) CR3 с адресом каталога страницы верхнего уровня или переключателем задач. Это якобы безусловно сбрасывает все записи TLB. Как я понимаю, для системы виртуальной памяти было бы совершенно справедливовсегда перезагружать CR3 послелюбой менять.

Это расточительно, так как TLB теперь выбрасывает абсолютно хорошие записи, таким образом, в 80486 процессорахINVLPG Инструкция была введена.INVLPG сделает недействительной запись TLB, соответствующую адресу исходного операнда.

Тем не менее, начиная с Pentium Pro, у нас также есть глобальные страницы, которые не переполняются движением кCR3 или переключатель задач; и AMD x86-64 ISA говорит, что некоторые структуры таблицы страниц верхнего уровня могут кэшироваться и не аннулироватьсяINVLPG, Чтобы получить четкое представление о том, что нужно и что не нужно для каждого ISA, нужно действительно загрузить таблицу данных на 1000 страниц для множества ISA, выпущенных с 80-х годов, чтобы прочитать там несколько страниц, и даже тогда документы кажутся Будьте особенно расплывчаты в отношении недействительности TLB и того, что произойдет, если TLB не будет должным образом признан недействительным.

Вопрос

Для простоты можно предположить, чторечь идет об однопроцессорной системе, Также можно предположить, чтопосле изменения структуры страницы переключение задач не требуется, (таким образом,INVLPG якобы как минимум такой же хороший выбор, как перезагрузкаCR3 регистр).

Базовое предположение состоит в том, что нужно будет перезагрузитьCR3 после каждого изменения страниц страниц и каталогов страниц, и такая система будет правильной. Однако, если кто-то хочет избежать ненужной очистки TLB, ему нужны ответы на 2 вопроса:

При условии, чтоINVLPG поддерживается на ISA, после каких изменений можно безопасно использовать его вместо перезагрузкиCR3? Например. «Если один не отображает один фрейм страницы (установите соответствующую запись таблицы, чтобы не присутствовать), всегда можно использоватьINVLPG«?

Какие изменения можно внести в таблицы и каталоги, не касаясьCR3 или выполнениеINVLPG? Например. «Если страница вообще не отображается (не присутствует), можно написать PTE сPresent=1 для этого без очистки TLB на всех "?

Даже после прочтения довольно большого количества документов ISA и всего, что связано сINVLPG здесь, на переполнении стека, я лично не уверен ни в одном из примеров, которые я там представил. Действительно, одинзаметный пост заявил сразу: «Я не знаю точно, когда вы должны его использовать, а когда нет». Таким образом, любые определенные, правильные примеры, предпочтительно документированные, и для IA32 или x86-64, которые вы можете дать, приветствуются.

Ответы на вопрос(1)

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