Открыть сервис

Page Table Entry

Page Table Entry (PTE, запись таблицы страниц) — это структура данных, используемая в системах виртуальной памяти компьютеров, которая хранится в таблице страниц и описывает отображение одной виртуальной страницы на физический кадр (страничный блок) в оперативной памяти. Каждая PTE содержит информацию о физическом адресе соответствующего кадра, а также набор флагов и атрибутов, управляющих доступом к памяти, кэшированием и статусом страницы (например, присутствует ли она в памяти или выгружена на диск).

История и развитие

Концепция таблиц страниц и PTE возникла в 1960-х годах с развитием систем виртуальной памяти, впервые реализованных в компьютере Atlas (Манчестерский университет, 1962). В ранних системах PTE были простыми и содержали только физический адрес и один бит присутствия. С усложнением архитектур (например, Intel 80386, 1985) PTE стали включать дополнительные биты для поддержки многозадачности, защиты памяти и механизмов кэширования. В современных процессорах (x86-64, ARM64, RISC-V) PTE имеют фиксированную длину (обычно 64 бита) и поддерживают многоуровневые таблицы страниц для работы с большими объёмами адресного пространства.

Структура и поля PTE

Типичная PTE в 64-битной архитектуре (например, x86-64) состоит из следующих полей:

  • Бит присутствия (Present, P) — указывает, находится ли страница в физической памяти (1) или выгружена на диск (0). Если бит сброшен, обращение к странице вызывает страничное прерывание (page fault).
  • Бит чтения/записи (Read/Write, R/W) — разрешает (1) или запрещает (0) запись в страницу. При попытке записи в страницу с R/W=0 генерируется исключение защиты.
  • Бит пользователь/супервизор (User/Supervisor, U/S) — определяет, доступна ли страница для программ в пользовательском режиме (1) или только для ядра (0).
  • Бит сквозной записи (Page-Level Write-Through, PWT) — управляет политикой кэширования: при PWT=1 используется сквозная запись (write-through), при PWT=0 — обратная запись (write-back).
  • Бит отключения кэширования (Page-Level Cache Disable, PCD) — при PCD=1 кэширование страницы запрещено.
  • Бит обращения (Accessed, A) — автоматически устанавливается процессором при чтении или записи страницы. Используется операционной системой для алгоритмов замены страниц (например, LRU).
  • Бит грязности (Dirty, D) — устанавливается процессором при первой записи в страницу. Показывает, что содержимое страницы было изменено и должно быть записано на диск при выгрузке.
  • Бит глобальной страницы (Global, G) — в архитектурах с TLB (Translation Lookaside Buffer) указывает, что PTE не должна сбрасываться из TLB при переключении контекста (например, для страниц ядра).
  • Физический адрес (Physical Address, PFN) — номер физического кадра (Page Frame Number), на который указывает PTE. В 64-битных системах обычно занимает 40-52 бита, остальные биты используются для флагов.
  • Бит подавления исполнения (No-Execute, NX или XD) — запрещает выполнение кода на странице, если бит установлен. Используется для защиты от атак типа buffer overflow (например, в Windows — DEP, Data Execution Prevention).

Многоуровневые таблицы страниц

В современных архитектурах PTE организованы в иерархические структуры (например, 4 уровня в x86-64: PML4, PDPT, PD, PT). Каждый уровень содержит PTE, указывающие на таблицу следующего уровня или на физический кадр. Это позволяет:

  • Экономить память, так как таблицы создаются только для используемых виртуальных адресов.
  • Поддерживать огромные адресные пространства (до 2^48 байт в x86-64).
  • Упрощать управление памятью для операционной системы.

Процессор при обращении к виртуальному адресу последовательно извлекает PTE из каждого уровня, проверяя биты присутствия и прав доступа. Если все PTE корректны, формируется физический адрес. Если какой-либо бит присутствия равен 0, возникает страничное прерывание.

Применение PTE

Управление виртуальной памятью

PTE — основа механизма виртуальной памяти. Операционная система (например, Linux, Windows, macOS) использует PTE для:

  • Изоляции процессов: каждому процессу выделяется своё адресное пространство, PTE которого не пересекаются.
  • Подкачки (swapping): страницы, не помещающиеся в RAM, выгружаются на диск, а их PTE помечаются как отсутствующие (Present=0) с указанием места на диске в поле адреса.
  • Совместного использования памяти: несколько PTE могут указывать на один физический кадр (например, для разделяемых библиотек или shared memory).

Защита памяти

Флаги R/W, U/S и NX в PTE позволяют реализовать:

  • Защиту кода от записи.
  • Разделение режимов ядра и пользователя.
  • Предотвращение выполнения данных (NX-бит).

Кэширование и оптимизация

Биты PWT, PCD и G управляют поведением кэша процессора и TLB. Например, для страниц с отображением устройств ввода-вывода (MMIO) часто отключается кэширование (PCD=1).

Примеры в архитектурах

x86-64 (Intel/AMD)

В этой архитектуре PTE имеет 64 бита. Физический адрес занимает 52 бита (с учётом выравнивания), но реально используется 40-48 бит в зависимости от процессора. Флаги расположены в младших 12 битах. Пример:

  • Бит 0: Present
  • Бит 1: R/W
  • Бит 2: U/S
  • Бит 3: PWT
  • Бит 4: PCD
  • Бит 5: Accessed
  • Бит 6: Dirty
  • Бит 7: PAT (Page Attribute Table)
  • Бит 8: Global
  • Бит 63: NX (в режиме IA-32e)

ARM64

PTE в ARM64 также 64-битна, но имеет другую организацию флагов. Например, биты [1:0] кодируют тип дескриптора (таблица или страница), бит [10] — доступность для пользователя, бит [55] — NX. Поддерживаются несколько размеров страниц (4 КБ, 16 КБ, 64 КБ).

RISC-V

В RISC-V PTE содержит 10 бит для флагов (включая V — валидность, R, W, X, U, G, A, D) и 44 бита для физического адреса (при 4-уровневой таблице). Реализация может отличаться в зависимости от спецификации (например, Sv39, Sv48).

Интересные факты

  • В ранних версиях Linux (до 2.6) PTE использовали 32 бита, что ограничивало адресное пространство до 4 ГБ. Переход на 64-битные PTE позволил поддерживать до 2^48 байт.
  • В архитектуре x86 с включённым PAE (Physical Address Extension) PTE имеет 64 бита, но используется только 36 бит для физического адреса.
  • Некоторые процессоры (например, Intel Itanium) поддерживают «большие страницы» (huge pages), для которых PTE может указывать на кадр размером 2 МБ или 1 ГБ, уменьшая количество уровней таблиц.
  • В системах с виртуализацией (например, KVM, Hyper-V) используются расширенные таблицы страниц (EPT — Extended Page Tables в Intel, NPT — Nested Page Tables в AMD), где PTE содержат дополнительные поля для управления гостевыми операционными системами.

Источники

  • Intel Corporation. «Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A: System Programming Guide». Chapter 4: Paging.
  • ARM Limited. «ARM Architecture Reference Manual ARMv8-A». Chapter D5: The AArch64 Virtual Memory System Architecture.
  • Andrew S. Tanenbaum, Herbert Bos. «Современные операционные системы» (4-е издание). Глава 3: Управление памятью.
  • RISC-V International. «The RISC-V Instruction Set Manual, Volume II: Privileged Architecture». Chapter 4: Sv39, Sv48, Sv57.
  • Daniel P. Bovet, Marco Cesati. «Understanding the Linux Kernel» (3rd edition). Chapter 2: Memory Addressing.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →