Страничная организация и таблицы страниц

⏱ 30 мин · 🧩 заданий: 6

Адрес = номер страницы + смещение

Если размер страницы P = 2ᵏ байт, то младшие k бит виртуального адреса — смещение внутри страницы, а старшие — номер виртуальной страницы (VPN).

виртуальный адрес (32 бита), страница 4 КиБ = 2^12 ┌──────────────────────────────┬──────────────┐ │ номер страницы (20 бит) │ смещение (12) │ └──────────────┬───────────────┴──────┬───────┘ │ таблица страниц │ копируется как есть ▼ │ номер кадра (PFN) │ ┌──────────────────────────────┬──────▼───────┐ │ номер кадра │ смещение │ физический адрес └──────────────────────────────┴──────────────┘

Смещение при трансляции не меняется — меняется только номер страницы на номер кадра.

Запись таблицы страниц

Таблица страниц — массив записей (PTE, page table entry), индексируемый номером страницы. Запись i386 (32 бита):

31 12 11 9 8 7 6 5 4 3 2 1 0 ┌──────────────────────────────────┬─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ номер физического кадра (20 бит)│ AVL │ G │PAT│ D │ A │PCD│PWT│U/S│R/W│ P │ └──────────────────────────────────┴─────┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
Бит Имя Смысл
P Present страница в физической памяти; если 0 — обращение вызывает страничный отказ
R/W Read/Write разрешена запись (0 — только чтение; так помечаются COW-страницы)
U/S User/Supervisor доступна из режима пользователя
A Accessed процессор устанавливает при любом обращении к странице
D Dirty процессор устанавливает при записи в страницу
G Global не сбрасывать из TLB при смене cr3 (страницы ядра)
AVL Available биты для нужд ОС

На x86-64 запись 64-битная, добавлен бит NX (запрет выполнения).

Биты A и D — задача 5

Аппаратура ставит A и D автоматически, ничего не спрашивая у ядра. Ядро (подсистема управления памятью, страничный демон) их читает и сбрасывает: по биту A понимает, какие страницы давно не использовались (кандидаты на вытеснение), по биту D — нужно ли перед вытеснением записать страницу на диск. Подробно — в уроке о замещении страниц.

Трансляция адреса

При каждом обращении к памяти MMU:

  1. берёт номер страницы из адреса;
  2. ищет его в TLB (кеше трансляций) — если нашёл, сразу получает кадр;
  3. если нет — обходит таблицы страниц в памяти, начиная с адреса из cr3;
  4. проверяет P, R/W, U/S: если страницы нет или доступ запрещён — страничный отказ (исключение #PF, адрес — в регистре cr2);
  5. ставит A (и D при записи) в записи таблицы, кладёт трансляцию в TLB;
  6. складывает номер кадра и смещение — физический адрес.

Страничный отказ

Обработчик ядра получает адрес из cr2 и код ошибки (чтение/запись, пользователь/ядро, отсутствует/нарушение прав) и решает:

Ситуация Действие ядра
адрес в допустимой VMA, страница ещё не выделялась выделить кадр (обнулённый), заполнить PTE
страница выгружена на диск (swap) прочитать с диска, заполнить PTE
страница файла, не прочитана прочитать из файла (или из кеша страниц)
запись в COW-страницу скопировать в новый кадр, разрешить запись
адрес вне VMA или нарушение прав SIGSEGV (за концом файла — SIGBUS)

Регистр cr3

cr3 хранит физический адрес таблицы верхнего уровня текущего процесса. Ядро загружает его при переключении процессов. Это привилегированная операция, и она (без PCID) сбрасывает TLB — ведь трансляции старого процесса больше не верны.

Расчёт числа бит

Удобная схема для любой задачи:

Величина Формула
бит смещения log₂(размер страницы)
записей в одной таблице (если таблица занимает страницу) размер страницы / размер записи
бит индекса на уровень log₂(число записей)
адресуемых бит смещение + уровни × бит индекса

Пример i386: страница 4096 → 12 бит; запись 4 байта → 1024 записи → 10 бит; 2 уровня: 12 + 2·10 = 32 бита.

Поменяйте в симуляторе размер страницы на 512, запись — 8 байт, уровни — 4: это параметры задачи 7.

Итог

  • Адрес = номер страницы + смещение; смещение не меняется при трансляции.
  • Запись таблицы: номер кадра + биты P, R/W, U/S, A, D, G.
  • A и D устанавливает аппаратура, сбрасывает ядро.
  • cr3 указывает на таблицы текущего процесса; при промахе TLB MMU обходит таблицы, при проблеме — страничный отказ.

Практика решено 0 из 6

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Ввод ответа

Размер страницы 512 байт. Сколько младших бит адреса занимает смещение внутри страницы?

Задание 2 Ввод ответа

Страница 4096 байт. Виртуальный адрес 0x00403A10. Каков номер виртуальной страницы (в hex)?

Задание 3 Ввод ответа

Страница 4096 байт, страница виртуальная №0x403 отображена в физический кадр №0x1F2. Каков физический адрес для виртуального 0x00403A10? Ответ в hex.

Задание 4 Заполнить таблицу

Кто устанавливает и кто сбрасывает биты записи таблицы страниц на x86?

Устанавливает аппаратура (MMU)Устанавливает ядроСбрасывает ядро
P (present) — страница в памяти
R/W — разрешена запись
A (accessed) — к странице обращались
D (dirty) — в страницу писали
Отметьте ячейку — «+», пустая — «−».
Задание 5 Один вариант ответа

Что хранится в регистре cr3 на x86?

Задание 6 Ввод ответа

32-битный адрес, страница 4 КиБ, запись таблицы — 4 байта. Сколько памяти заняла бы одноуровневая таблица страниц одного процесса? Ответ в МиБ (число).

Войдите, чтобы отмечать пройденные уроки.