Страничная организация и таблицы страниц
Адрес = номер страницы + смещение
Если размер страницы P = 2ᵏ байт, то младшие k бит виртуального адреса — смещение внутри страницы, а старшие — номер виртуальной страницы (VPN).
Смещение при трансляции не меняется — меняется только номер страницы на номер кадра.
Запись таблицы страниц
Таблица страниц — массив записей (PTE, page table entry), индексируемый номером страницы. Запись i386 (32 бита):
| Бит | Имя | Смысл |
|---|---|---|
| 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:
- берёт номер страницы из адреса;
- ищет его в TLB (кеше трансляций) — если нашёл, сразу получает кадр;
- если нет — обходит таблицы страниц в памяти, начиная с адреса из cr3;
- проверяет P, R/W, U/S: если страницы нет или доступ запрещён — страничный отказ (исключение #PF, адрес — в регистре cr2);
- ставит A (и D при записи) в записи таблицы, кладёт трансляцию в TLB;
- складывает номер кадра и смещение — физический адрес.
Страничный отказ
Обработчик ядра получает адрес из 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
Размер страницы 512 байт. Сколько младших бит адреса занимает смещение внутри страницы?
Страница 4096 байт. Виртуальный адрес 0x00403A10. Каков номер виртуальной страницы (в hex)?
Страница 4096 байт, страница виртуальная №0x403 отображена в физический кадр №0x1F2.
Каков физический адрес для виртуального 0x00403A10? Ответ в hex.
Кто устанавливает и кто сбрасывает биты записи таблицы страниц на x86?
| Устанавливает аппаратура (MMU) | Устанавливает ядро | Сбрасывает ядро | |
|---|---|---|---|
| P (present) — страница в памяти | |||
| R/W — разрешена запись | |||
| A (accessed) — к странице обращались | |||
| D (dirty) — в страницу писали |
Что хранится в регистре cr3 на x86?
32-битный адрес, страница 4 КиБ, запись таблицы — 4 байта. Сколько памяти заняла бы одноуровневая таблица страниц одного процесса? Ответ в МиБ (число).
Войдите, чтобы отмечать пройденные уроки.