Виртуальная память и адресные пространства
Проблема
Если программы обращаются к физической памяти напрямую:
- одна программа может испортить данные другой или ядра;
- программа должна знать, по какому адресу её загрузят;
- память фрагментируется, а программа больше физической памяти не запустится.
Идея виртуальной памяти
Каждый процесс работает с виртуальными адресами в собственном адресном пространстве. Аппаратный блок MMU (Memory Management Unit) при каждом обращении переводит виртуальный адрес в физический по таблицам, которые подготовило ядро.
Одинаковый виртуальный адрес в разных процессах ведёт в разные физические ячейки — или в одну, если ядро так решило (общая библиотека, разделяемая память).
Что даёт виртуальная память
| Возможность | Как достигается |
|---|---|
| Изоляция | в таблицах процесса нет отображений на чужую память; ядро помечено как недоступное из режима пользователя |
| Одинаковая раскладка | каждая программа компонуется для своих виртуальных адресов |
| Больше, чем RAM | неиспользуемые страницы выгружаются на диск (подкачка), отображение помечается «отсутствует» |
| Ленивое выделение | физический кадр выделяется при первом обращении |
| Разделение | несколько таблиц указывают на один кадр (код библиотек, MAP_SHARED) |
| Copy-on-write | после fork страницы общие до первой записи |
| Отображение файлов | mmap файла: страницы подгружаются с диска по требованию |
Сегментация и страничная организация
Исторически были два подхода:
- Сегментация — память делится на сегменты переменной длины (код, данные, стек); адрес = сегмент + смещение. Проблема — внешняя фрагментация.
- Страничная организация — виртуальное и физическое пространства делятся на блоки одинакового размера: страницы (виртуальные) и кадры (физические). Любая страница может лежать в любом кадре. Фрагментация только внутренняя (недоиспользованный хвост последней страницы).
Современные системы (x86-64, ARM64) используют страничную организацию; сегменты на x86-64 почти отключены.
Области памяти процесса
Ядро описывает адресное пространство процесса списком областей (в Linux — vm_area_struct, VMA): непрерывных диапазонов адресов с одинаковыми правами и источником данных.
$ cat /proc/self/maps
55d0c4a00000-55d0c4a02000 r--p 00000000 08:01 1234 /usr/bin/cat
55d0c4a02000-55d0c4a07000 r-xp 00002000 08:01 1234 /usr/bin/cat ← код
55d0c6000000-55d0c6021000 rw-p 00000000 00:00 0 [heap]
7f2a1c000000-7f2a1c1d0000 r-xp 00028000 08:01 5678 /usr/lib/libc.so.6
7ffd9a000000-7ffd9a021000 rw-p 00000000 00:00 0 [stack]
Права: r чтение, w запись, x выполнение, p частная (copy-on-write) или s разделяемая.
При страничном отказе ядро ищет VMA, содержащую адрес: нашлась и доступ разрешён — подгрузить страницу; не нашлась — SIGSEGV.
Ленивое выделение
malloc большого блока или mmap лишь создают VMA. Таблицы страниц пусты. При первом обращении:
- MMU не находит отображения → страничный отказ;
- ядро находит VMA, выделяет кадр, обнуляет его (или читает с диска), записывает в таблицу страниц;
- инструкция выполняется повторно — уже успешно.
Аналогия
Виртуальная память — как номера в отеле по брони: вам выдали ключ от номера 305 (виртуальный адрес), а какую реальную комнату он открывает — решает администратор (ядро) и замок (MMU). Комнату даже не готовят, пока вы не придёте.
Итог
- Процессы работают с виртуальными адресами; MMU переводит их в физические по таблицам ядра.
- Страничная организация: страницы и кадры одного размера.
- Адресное пространство — набор областей (VMA) с правами; карта — в
/proc/<pid>/maps. - Физическая память выделяется лениво — при первом обращении через страничный отказ.
Практика решено 0 из 4
Какие задачи решает виртуальная память?
Два процесса напечатали &x для глобальной переменной x и получили одинаковый адрес 0x404028. Что это значит?
Кто выполняет каждое действие?
| Аппаратура (MMU) | Ядро ОС | |
|---|---|---|
| Перевод виртуального адреса в физический при каждом обращении | ||
| Создание и заполнение таблиц страниц | ||
| Обработка страничного отказа | ||
| Генерация исключения, если страница отсутствует или доступ запрещён | ||
| Выбор, какую страницу выгрузить на диск |
Сколько байт может адресовать 32-битный виртуальный адрес? Ответ в гигабайтах (ГиБ), только число.
Войдите, чтобы отмечать пройденные уроки.