Кеширование информации о трансляции адресов

Продолжаю перевод 4 главы «PAGING» руководства “Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A & 3B):System Programming Guide”

4.10 CACHING TRANSLATION INFORMATION

Архитектуры Intel-64 и IA-32 ускоряют процесс трансляции адресов с помощью кеширования данных из страничных структур в процессоре. Поскольку процессор не гарантирует, что данные в кеше всегда совпадают с содержимым памяти, важно, чтобы разработчики программного обеспечения понимали как и когда процессор может кешировать упомянутые данные. Разработчики также должны знать, какие действия программное обеспечение может предпринять для удаления закешированных данных, которые могли стать неверными, а также когда необходимо это делать. Эта секция предоставляет разработчикам информацию о соответствующей операции процессора.

Секция 4.10.1 описывает идентификаторы контекста процесса (process-context identifiers (PCIDs)), которые может использовать логический процессор для различия информации закешированной для различных линейных адресных пространств. Секции 4.10.2 и 4.10.3 описывают как процессор может кешировать информацию в translation lookaside buffers (TLBs) и кешах страничных структур соответственно. Секция 4.10.4 объясняет соответственно как программное обеспечение может удалить устаревшую закешированную информацию (invalidating portions of the TLBs and paging-structure caches). Раздел 4.10.5 описывает особые соображения относящиется к многопроцессорным системам.

4.10.1 Process-Context Identifiers (PCIDs)
Идентификаторы контекста процесса.

Идентификаторы контекста процесса PCID — средство с помощью которого логический процессор может различать закешированную информацию относящуюся к различным линейным адресным пространствам. Процессор может оставлять закешированной информацию, когда программное обеспечение переключается на другое линейное адресное пространство с отличающимся PCID (например с помощью загрузки CR3, см. раздел 4.10.4.1 для деталей).

PCID — 12-битный идентификатор. Ненулевые PCID включаются установкой PCIDE флага (бита 17) регистра CR4. Если CR4.PCIDE = 0, тогда текущий PCID всегда равен 000H, в противном случае PCID равен значению битов 11:0 регистра CR3. Не все процессоры позволяют установку CR4.PCIDE в 1. См. раздел 4.1.4 чтобы узнать как определить разрешено ли это.

Процессор обеспечивает что CR4.PCIDE может быть 1 только в режиме IA-32e, поэтому при 32-битном страничном режиме или в режиме PAE, PCID всегда 000H). Кроме того программное обеспечение может менять CR4.PCID из 0 в 1-цу только если текущий PCID равен 0 (биты 11:0 регистра CR3 равны 0). Эти требования обеспечиваются следующими ограничениями на инструкции MOV CR: (записывающие в регистр CR)

  • MOV в CR4 вызывает general-protection exception (#GP), если она собирается изменить CR4.PCIDE из 0 в 1 и при этом IA32_EFER.LMA = 0 (не режим IA-32e) или CR3[11:0] не равен 000H.
  • MOV в CR0 вызывет general-protection exception если собирается сбросить CR0.PG в 0
    • MOV to CR0 causes a general-protection exception if it would clear CR0.PG to 0 если CR4.PCIDE = 1

Когда логический процессор создает записи в TLB (см. раздел 4.10.2) и кеше страничных структур (см. раздел 4.10.3), он использует текущий PCID в качестве ключа. При использовании записей в TLB и кешах страничных структур для трансляции линейного адреса, процессор использует только записи относящиеся к текущему PCID (см. раздел 4.10.2.4 для исключений).

Если CR4.PCIDE = 0, логический процессор не кеширует информацию для любых PCID кроме 000H. Т.о. при CR4.PCIDE = 0, логический процессор будет привязывать любую новую закешированную информацию с текущим нулевым PCID, 000H ; и если MOV в CR4 сбрасывает CR4.PCIDE в 0, вся закешированная информация сбрасывается (invalidated) (см. раздел 4.10.4.1).

Оставьте комментарий