Виртуальная память и адресные пространства

⏱ 25 мин · 🧩 заданий: 4

Проблема

Если программы обращаются к физической памяти напрямую:

  • одна программа может испортить данные другой или ядра;
  • программа должна знать, по какому адресу её загрузят;
  • память фрагментируется, а программа больше физической памяти не запустится.

Идея виртуальной памяти

Каждый процесс работает с виртуальными адресами в собственном адресном пространстве. Аппаратный блок MMU (Memory Management Unit) при каждом обращении переводит виртуальный адрес в физический по таблицам, которые подготовило ядро.

процесс A физическая память процесс B ┌─────────┐ ┌──────────────┐ ┌─────────┐ │ стр. 0 │────────────▶│ кадр 5 │◀──────────│ стр. 0 │ код libc — │ стр. 1 │──────┐ │ кадр 6 │ │ стр. 1 │ общий кадр │ стр. 2 │──┐ └─────▶│ кадр 7 (A) │ ┌─────│ стр. 2 │ └─────────┘ │ │ кадр 8 (B) │◀────┘ └─────────┘ └─────────▶│ кадр 9 (A) │ таблица └──────────────┘ таблица страниц A страниц B

Одинаковый виртуальный адрес в разных процессах ведёт в разные физические ячейки — или в одну, если ядро так решило (общая библиотека, разделяемая память).

Что даёт виртуальная память

Возможность Как достигается
Изоляция в таблицах процесса нет отображений на чужую память; ядро помечено как недоступное из режима пользователя
Одинаковая раскладка каждая программа компонуется для своих виртуальных адресов
Больше, чем 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. Таблицы страниц пусты. При первом обращении:

  1. MMU не находит отображения → страничный отказ;
  2. ядро находит VMA, выделяет кадр, обнуляет его (или читает с диска), записывает в таблицу страниц;
  3. инструкция выполняется повторно — уже успешно.

Аналогия

Виртуальная память — как номера в отеле по брони: вам выдали ключ от номера 305 (виртуальный адрес), а какую реальную комнату он открывает — решает администратор (ядро) и замок (MMU). Комнату даже не готовят, пока вы не придёте.

Итог

  • Процессы работают с виртуальными адресами; MMU переводит их в физические по таблицам ядра.
  • Страничная организация: страницы и кадры одного размера.
  • Адресное пространство — набор областей (VMA) с правами; карта — в /proc/<pid>/maps.
  • Физическая память выделяется лениво — при первом обращении через страничный отказ.

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

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

Какие задачи решает виртуальная память?

Задание 2 Один вариант ответа

Два процесса напечатали &x для глобальной переменной x и получили одинаковый адрес 0x404028. Что это значит?

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

Кто выполняет каждое действие?

Аппаратура (MMU)Ядро ОС
Перевод виртуального адреса в физический при каждом обращении
Создание и заполнение таблиц страниц
Обработка страничного отказа
Генерация исключения, если страница отсутствует или доступ запрещён
Выбор, какую страницу выгрузить на диск
Отметьте ячейку — «+», пустая — «−».
Задание 4 Ввод ответа

Сколько байт может адресовать 32-битный виртуальный адрес? Ответ в гигабайтах (ГиБ), только число.

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