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 →