Что такое виртуальная память компьютера и где она находится
Виртуальная память представляет собой совмещение оперативной памяти и временного хранилища файлов на жестком диске. В случае если памяти ОЗУ не достаточно, данные перемещаются во временное хранилище, называемое файлом подкачки. Для выполняющейся программы данный метод полностью прозрачен и не требует дополнительных усилий со стороны, однако реализация этого метода требует как аппаратной поддержки, так и поддержки со стороны операционной системы.
В системе с виртуальной памятью используемые программами адреса, называемые виртуальными адресами, транслируются в физические адреса в памяти компьютера. Трансляцию виртуальных адресов в физические выполняет аппаратное обеспечение, называемое блоком управления памятью (см. рисунок 1).
Содержание
История появления
В 1940-ых и 50-ых все крупные программы должны были реализовывать логику управления памятью - оверлеи. Виртуальная предназначалась не только, чтобы расширить реальную оперативную память, но и облегчить использование памяти программистам. [Источник 1] .Чтобы использовать мультипрограммирование и многозадачность многие ранние системы разделяли память между множеством программ без использования виртуальной памяти (например ранние модели PDP-10 через регистры).
Перед тем как виртуальная память могла быть реализована в основным популярных операционных системах, много проблем должны были быть решены. Динамическая трансляция адресов требовала дорогого и трудно реализуемого специализированного оборудования (первые реализации несколько замедляли доступ к памяти). Так же существовало беспокойство, что новые общесистемные алгоритмы будут не так эффективно использовать вторичную память, как ранее используемые специальные алгоритмы реализуемые каждым приложением в отдельности. В 1969-ом году дебаты касающиеся использования виртуальной памяти в коммерческих компьютерах закончились, исследовательская команда IBM, возглавляемая David Sayre показала, что их система виртуальной памяти работает лучше, чем любая управляемая вручную система. Первый миникомпьютер использующий виртуальную память был Норвежский NORD-1, в течении 1970-ых годов, появились другие компьютеры реализующие виртуальную память (например компьютер VAX с системой VMS).
Виртуальная память была реализована в архитектуре x86 вместе с |защищённым режимом в процессоре Intel 80286, но его способ подкачки сегментов плохо масштабировался для сегментов большего размера. В процессор Intel 80386 была реализована подкачка страниц под существующем слоем сегментации, позволяя исключение подкачки страниц связывать с другими исключениями не вызывая двойного сбоя. Однако, загрузка дескриптора сегмента была дорогостоящей операции, в результате чего, разработчики операционных систем полагались только на подкачку страниц, а не на комбинацию сегментации и подкачки страниц. [Источник 4]
Преимущества виртуальной памяти
- Освобождает программиста от необходимости вручную управлять загрузкой частей программы в память и согласовывать использование памяти с другими программами;
- Предоставляет программам больше памяти, чем физически установлено в системе;
- В многозадачных системах изолирует выполняющиеся программы друг от друга путём назначения им непересекающихся адресных пространств;
- Приложения исполняются в своём адресном пространстве и не мешают друг другу;
- Повышается безопасность за счёт защиты памяти.
Способы организации памяти
Страничный способ
Страничная память — способ организации памяти, при котором единицей отображения виртуальных адресов на физические является регион постоянного размера (т. н. страница). Типичный размер страницы — 4096 байт, для некоторых архитектур — до 128 КБ.
Основным достоинством страничного способа распределения памяти является минимально возможная фрагментация. Поскольку на каждую задачу может приходиться по одной незаполненной странице, то становится очевидно, что память можно использовать достаточно эффективно; этот метод организации виртуальной памяти был бы одним из самых лучших, если бы не два обстоятельства:
- Страничная трансляция виртуальной памяти требует существенных накладных расходов. В самом деле, таблицы страниц нужно тоже размещать в памяти. Кроме этого, эти таблицы нужно обрабатывать; именно с ними работает диспетчер памяти.
- Программы разбиваются на страницы случайно, без учета логических взаимосвязей, имеющихся в коде. Это приводит к тому, что межстраничные переходы, как правило, осуществляются чаще, нежели межсегментные, и к тому, что становится трудно организовать разделение программных модулей между выполняющимися процессами.
Решаемые задачи
- Поддержка изоляции процессов и защиты памяти путём создания своего собственного виртуального адресного пространства для каждого процесса
- Поддержка изоляции области ядра от кода пользовательского режима
- Поддержка памяти «только для чтения» и неисполняемой памяти
- Поддержка отгрузки давно не используемых страниц в область подкачки на диске (см. свопинг)
- Поддержка отображённых в память файлов, в том числе загрузочных модулей
- Поддержка разделяемой между процессами памяти, в том числе с копированием-по-записи для экономии физических страниц
- Поддержка системного вызова fork() в ОС семейства UNIX
Сегментный способ
Сегментная адресация памяти — схема логической адресации памяти компьютера в архитектуре x86. Линейный адрес конкретной ячейки памяти, который в некоторых режимах работы процессора будет совпадать с физическим адресом, делится на две части: сегмент и смещение. Сегментом называется условно выделенная область адресного пространства определённого размера, а смещением — адрес ячейки памяти относительно начала сегмента. Базой сегмента называется линейный адрес (адрес относительно всего объёма памяти), который указывает на начало сегмента в адресном пространстве. В результате получается сегментный (логический) адрес, который соответствует линейному адресу база сегмента+смещение и который выставляется процессором на шину адреса.
Достоинства сегментного способа
- Появляется возможность при загрузке программы на исполнение размещать ее в памяти не целиком, а «по мере необходимости». Поскольку в подавляющем большинстве случаев алгоритм, по которому работает код программы, является разветвленным, а не линейным, то в зависимости от исходных данных некоторые части программы, расположенные в самостоятельных сегментах, могут быть не задействованы, значит, их можно и не загружать в оперативную память.
- Некоторые программные модули могут быть разделяемыми. Эти программные модули являются сегментами, и в этом случае относительно легко организовать доступ к таким сегментам. Сегмент с разделяемым кодом располагается в памяти в единственном экземпляре, а в нескольких таблицах дескрипторов сегментов исполняющихся задач будут находиться указатели на такие разделяемые сегменты.
Недостатки сегментного способа
- Для получения доступа к искомой ячейке памяти необходимо потратить намного больше времени. Необходимо сначала найти и прочитать дескриптор сегмента, а уже потом, используя данные из него о местонахождении нужного сегмента, можем вычислить и конечный физический адрес. Для того чтобы уменьшить эти потери, используется кэширование — то есть те дескрипторы, с которыми мы имеем дело в данный момент, могут быть размещены в сверхоперативной памяти.
- Имеются большие потери памяти и процессорного времени на размещение и обработку дескрипторных таблиц. Ведь на каждую задачу необходимо иметь свою таблицу дескрипторов сегментов, а при определении физических адресов необходимо выполнять операции сложения.
Подкачка страниц
Практические все реализации виртуальной памяти делят виртуальное адресное пространство на страницы: блоки непрерывных виртуальных адресов. Размер страницы на современной системе обычно не меньше 4 килобайт, системы с большим диапазоном виртуальных адресов или количеством реальной оперативной памяти обычно используют более большие размеры страниц.
Таблица страниц
Таблица страниц используется для чтобы транслировать адреса используемые приложением в физические адреса используемые устройствами. Оборудование, обеспечивающие такую трансляцию чаще всего называют устройством управления памятью. Каждая запись в таблицы страниц содержит флаг, указывающий находится ли соответствующая страница в реальной памяти или нет. Если страница в реальной памяти, в записи будет также хранится адрес реальной памяти, где эта страница записана. Если запись в таблице указывает, что на данный момент страница отсутствует в реальной оперативной памяти, аппаратная часть генерирует исключение ошибки страницы и вызывается страничный супервизор операционной системы.
В операционной системе может быть одна таблица страниц, по таблице страниц на каждое приложение или сегмент, дерево таблиц страниц для больших сегментов или комбинация перечисленного.
Супервизор страниц
Это часть операционной системы, которая создаёт и управляет таблицами страниц. Если аппаратная часть генерирует исключение ошибки страницы, тогда супервизор страниц обращается к вторичному устройству памяти, извлекает необходимую страницу, обновляет таблицу страниц, чтобы отобразить новый физический адрес соответствующий виртуальному и запрашивает механизм трансляции повторить запрос.
Когда вся реальная оперативная память уже использована, супервизор страниц должен выгрузить какую-либо страницу во вторичную память, чтобы загрузить нужную. Супервизор использует алгоритм замещения страниц (например LRU), чтобы определить какую именно страницу можно выгрузить.
Закреплённые страницы
Операционные системы часто имеют области фиксированные области оперативной памяти, то есть область, никогда не выгружаемая во вторичную память. Это делается для улучшения производительности и упрощения реализации. Например, механизм прерываний полагается на массив указателей к свои обработчикам. Если страница, содержащая этот массив будет выгружена, или будет выгружен код, который должен быть вызван в случае исключения, то обработка исключения затянется во времени или станет невозможной.
Некоторые страницы требуется закрепить на короткое время, другие должны быть закреплены всегда:
- Код супервизора страниц и драйвера доступа к вторичной памяти (на котором находятся страницы), должен быть постоянно закреплён, иначе подкачка страниц не может не работать, так как необходимый код будет недоступен.
- Компоненты сильно зависимые от времени, должны быть закреплены, чтобы избежать задержек.
- Буферы данных, напрямую обращающиеся к периферийным устройствам, которые используют прямой доступ к памяти или каналы ввода/вывода должны находится в закреплённых страницах, во время операций с вводом/выводом, потому что устройства ожидают, что буферы расположены в реальной оперативной памяти. Передача информации с устройства не может быть остановлена в случае исключения ошибки страниц, и перезапущена позже.
V=R режим
В OS/VS1 и похожих операционных системах, некоторые части системной памяти работают в режиме "Virtual-Real", часто сокращаемый до "V=R". В этом режиме каждый виртуальный адрес соответствует такому же реальному адресу. Этот режим используется для механизма прерываний, для супервизора страниц и таблицы страниц в старых операционных системах, и для приложений использующих не стандартное управление вводом/выводом.
Пробуксовка
Эта проблема возникает когда суммарный размер необходимых для работы приложений страниц превышает количество доступной реальной оперативной памяти, что вынуждает операционную систему постоянно выгружать и загружать страницы, затрачивая на это большое количество времени.
Привет, Хабрахабр!
В предыдущей статье я рассказал про vfork() и пообещал рассказать о реализации вызова fork() как с поддержкой MMU, так и без неё (последняя, само собой, со значительными ограничениями). Но прежде, чем перейти к подробностям, будет логичнее начать с устройства виртуальной памяти.
Конечно, многие слышали про MMU, страничные таблицы и TLB. К сожалению, материалы на эту тему обычно рассматривают аппаратную сторону этого механизма, упоминая механизмы ОС только в общих чертах. Я же хочу разобрать конкретную программную реализацию в проекте Embox. Это лишь один из возможных подходов, и он достаточно лёгок для понимания. Кроме того, это не музейный экспонат, и при желании можно залезть “под капот” ОС и попробовать что-нибудь поменять.
Любая программная система имеет логическую модель памяти. Самая простая из них — совпадающая с физической, когда все программы имеют прямой доступ ко всему адресному пространству.
При таком подходе программы имеют доступ ко всему адресному пространству, не только могут “мешать” друг другу, но и способны привести к сбою работы всей системы — для этого достаточно, например, затереть кусок памяти, в котором располагается код ОС. Кроме того, иногда физической памяти может просто не хватить для того, чтобы все нужные процессы могли работать одновременно. Виртуальная память — один из механизмов, позволяющих решить эти проблемы. В данной статье рассматривается работа с этим механизмом со стороны операционной системы на примере ОС Embox. Все функции и типы данных, упомянутые в статье, вы можете найти в исходном коде нашего проекта.
Будет приведён ряд листингов, и некоторые из них слишком громоздки для размещения в статье в оригинальном виде, поэтому по возможности они будут сокращены и адаптированы. Также в тексте будут возникать отсылки к функциям и структурам, не имеющим прямого отношения к тематике статьи. Для них будет дано краткое описание, а более полную информацию о реализации можно найти на вики проекта.
- Расширение реального адресного пространства. Часть виртуальной памяти может быть вытеснена на жёсткий диск, и это позволяет программам использовать больше оперативной памяти, чем есть на самом деле.
- Создание изолированных адресных пространств для различных процессов, что повышает безопасность системы, а также решает проблему привязанности программы к определённым адресам памяти.
- Задание различных свойств для разных участков участков памяти. Например, может существовать неизменяемый участок памяти, видный нескольким процессам.
Аппаратная поддержка
Обращение к памяти хорошо описанно в этой хабростатье. Происходит оно следующим образом:
Процессор подаёт на вход MMU виртуальный адрес
Если MMU выключено или если виртуальный адрес попал в нетранслируемую область, то физический адрес просто приравнивается к виртуальному
Если MMU включено и виртуальный адрес попал в транслируемую область, производится трансляция адреса, то есть замена номера виртуальной страницы на номер соответствующей ей физической страницы (смещение внутри страницы одинаковое):
Если запись с нужным номером виртуальной страницы есть в TLB [Translation Lookaside Buffer], то номер физической страницы берётся из нее же
Если нужной записи в TLB нет, то приходится искать ее в таблицах страниц, которые операционная система размещает в нетранслируемой области ОЗУ (чтобы не было промаха TLB при обработке предыдущего промаха). Поиск может быть реализован как аппаратно, так и программно — через обработчик исключения, называемого страничной ошибкой (page fault). Найденная запись добавляется в TLB, после чего команда, вызвавшая промах TLB, выполняется снова.
Таким образом, при обращении программы к тому или иному участку памяти трансляция адресов производится аппаратно. Программная часть работы с MMU — формирование таблиц страниц и работа с ними, распределение участков памяти, установка тех или иных флагов для страниц, а также обработка page fault, ошибки, которая происходит при отсутствии страницы в отображении.
В тексте статьи в основном будет рассматриваться трёхуровневая модель памяти, но это не является принципиальным ограничением: для получения модели с бóльшим количеством уровней можно действовать аналогичным образом, а особенности работы с меньшим количеством уровней (как, например, в архитектуре x86 — там всего два уровня) будут рассмотрены отдельно.
Программная поддержка
- Выделение физических страниц из некоторого зарезервированного участка памяти
- Внесение соответствующих изменений в таблицы виртуальной памяти
- Сопоставление участков виртуальной памяти с процессами, выделившими их
- Проецирование региона физической памяти на виртуальный адрес
Виртуальный адрес
Page Global Directory (далее — PGD) — таблица (здесь и далее — то же самое, что директория) самого высокого уровня, каждая запись в ней — ссылка на Page Middle Directory (PMD), записи которой, в свою очередь, ссылаются на таблицу Page Table Entry (PTE). Записи в PTE ссылаются на реальные физические адреса, а также хранят флаги состояния страницы.
То есть, при трёхуровневой иерархии памяти виртуальный адрес будет выглядеть так:
Значения полей PGD, PMD и PTE — это индексы в соответствующих таблицах (то есть сдвиги от начала этих таблиц), а offset — это смещение адреса от начала страницы.
В зависимости от архитектуры и режима страничной адресации, количество битов, выделяемых для каждого из полей, может отличаться. Кроме того, сама страничная иерархия может иметь число уровней, отличное от трёх: например, на x86 нет PMD.
Для обеспечения переносимости мы задали границы этих полей с помощью констант: MMU_PGD_SHIFT, MMU_PMD_SHIFT, MMU_PTE_SHIFT, которые в приведённой выше схеме равны 24, 18 и 12 соответственно их определение дано в заголовочном файле src/include/hal/mmu.h. В дальнейшем будет рассматриваться именно этот пример.
На основании сдвигов PGD, PMD и PTE вычисляются соответствующие маски адресов.
Эти макросы даны в том же заголовочном файле.
Для работы с виртуальной таблицами виртуальной памяти в некоторой области памяти хранятся указатели на все PGD. При этом каждая задача хранит в себе контекст struct mmu_context, который, по сути, является индексом в этой таблице. Таким образом, к каждой задаче относится одна таблица PGD, которую можно определить с помощью mmu_get_root(ctx).
Размер страницы
В реальных (то есть не в учебных) системах используются страницы от 512 байт до 64 килобайт. Чаще всего размер страницы определяется архитектурой и является фиксированным для всей системы, например — 4 KiB.
С одной стороны, при меньшем размере страницы память меньше фрагментируется. Ведь наименьшая единица виртуальной памяти, которая может быть выделена процессу — это одна страница, а программам очень редко требуется целое число страниц. А значит, в последней странице, которую запросил процесс, скорее всего останется неиспользуемая память, которая, тем не менее, будет выделена, а значит — использована неэффективно.
С другой стороны, чем меньше размер страницы, тем больше размер страничных таблиц. Более того, при отгрузке на HDD и при чтении страниц с HDD быстрее получится записать несколько больших страниц, чем много маленьких такого же суммарного размера.
Отдельного внимания заслуживают так называемые большие страницы: huge pages и large pages [вики] .
Платформа | Размер обычной страницы | Размер страницы максимально возможного размера |
x86 | 4KB | 4MB |
x86_64 | 4KB | 1GB |
IA-64 | 4KB | 256MB |
PPC | 4KB | 16GB |
SPARC | 8KB | 2GB |
ARMv7 | 4KB | 16MB |
Действительно, при использовании таких страниц накладные расходы памяти повышаются. Тем не менее, прирост производительности программ в некоторых случаях может доходить до 10% [ссылка] , что объясняется меньшим размером страничных директорий и более эффективной работой TLB.
В дальнейшем речь пойдёт о страницах обычного размера.
Устройство Page Table Entry
В реализации проекта Embox тип mmu_pte_t — это указатель.
Каждая запись PTE должна ссылаться на некоторую физическую страницу, а каждая физическая страница должна быть адресована какой-то записью PTE. Таким образом, в mmu_pte_t незанятыми остаются MMU_PTE_SHIFT бит, которые можно использовать для сохранения состояния страницы. Конкретный адрес бита, отвечающего за тот или иной флаг, как и набор флагов в целом, зависит от архитектуры.
- MMU_PAGE_WRITABLE — Можно ли менять страницу
- MMU_PAGE_SUPERVISOR — Пространство супер-пользователя/пользователя
- MMU_PAGE_CACHEABLE — Нужно ли кэшировать
- MMU_PAGE_PRESENT — Используется ли данная запись директории
Можно установить сразу несколько флагов:
Здесь vmem_page_flags_t — 32-битное значение, и соответствующие флаги берутся из первых MMU_PTE_SHIFT бит.
Трансляция виртуального адреса в физический
Как уже писалось выше, при обращении к памяти трансляция адресов производится аппаратно, однако, явный доступ к физическим адресам может быть полезен в ряде случаев. Принцип поиска нужного участка памяти, конечно, такой же, как и в MMU.
Для того, чтобы получить из виртуального адреса физический, необходимо пройти по цепочке таблиц PGD, PMD и PTE. Функция vmem_translate() и производит эти шаги.
Сначала проверяется, есть ли в PGD указатель на директорию PMD. Если это так, то вычисляется адрес PMD, а затем аналогичным образом находится PTE. После выделения физического адреса страницы из PTE необходимо добавить смещение, и после этого будет получен искомый физический адрес.
Пояснения к коду функции.
mmu_paddr_t — это физический адрес страницы, назначение mmu_ctx_t уже обсуждалось выше в разделе “Виртуальный адрес”.
С помощью функции vmem_get_idx_from_vaddr() находятся сдвиги в таблицах PGD, PMD и PTE.
Работа с Page Table Entry
Для работы с записей в таблице страниц, а так же с самими таблицами, есть ряд функций:
Эти функции возвращают 1, если у соответствующей структуры установлен бит MMU_PAGE_PRESENT
Page Fault
Page fault — это исключение, возникающее при обращении к странице, которая не загружена в физическую память — или потому, что она была вытеснена, или потому, что не была выделена.
В операционных системах общего назначения при обработке этого исключения происходит поиск нужной странице на внешнем носителе (жёстком диске, к примеру).
В нашей системе все страницы, к которым процесс имеет доступ, считаются присутствующими в оперативной памяти. Так, например, соответствующие сегменты .text, .data, .bss; куча; и так далее отображаются в таблицы при инициализации процесса. Данные, связанные с потоками (например, стэк), отображаются в таблицы процесса при создании потоков.
Выталкивание страниц во внешнюю память и их чтение в случае page fault не реализовано. С одной стороны, это лишает возможности использовать больше физической памяти, чем имеется на самом деле, а с другой — не является актуальной проблемой для встраиваемых систем. Нет никаких ограничений, делающих невозможной реализацию данного механизма, и при желании читатель может попробовать себя в этом деле :)
Для виртуальных страниц и для физических страниц, которые могут быть использованы при работе с виртуальной памятью, статически резервируется некоторое место в оперативной памяти. Тогда при выделении новых страниц и директорий они будут браться именно из этого места.
Исключением является набор указателей на PGD для каждого процесса (MMU-контексты процессов): этот массив хранится отдельно и используется при создании и разрушении процесса.
Выделение страниц
Итак, выделить физическую страницу можно с помощью vmem_alloc_page
Функция page_alloc() ищет участок памяти из N незанятых страниц и возвращает физический адрес начала этого участка, помечая его как занятый. В приведённом коде virt_page_allocator ссылается на участок памяти, резервированной для выделения физических страниц, а 1 — количество необходимых страниц.
Выделение таблиц
Тип таблицы (PGD, PMD, PTE) не имеет значения при аллокации. Более того, выделение таблиц производится также с помощью функции page_alloc(), только с другим аллокатором (virt_table_allocator).
После добавления страниц в соответствующие таблицы нужно уметь сопоставлять участки памяти с процессами, к которым они относятся. У нас в системе процесс представлен структурой task, содержащей всю необходимую информацию для работы ОС с процессом. Все физически доступные участки адресного пространства процесса записываются в специальный репозиторий: task_mmap. Он представляет из себя список дескрипторов этих участков (регионов), которые могут быть отображены на виртуальную память, если включена соответствующая поддержка.
brk — это самый большой из всех физических адресов репозитория, данное значение необходимо для ряда системных вызовов, которые не будут рассматриваться в данной статье.
ctx — это контекст задачи, использование которого обсуждалось в разделе “Виртуальный адрес”.
struct dlist_head — это указатель на начало двусвязного списка, организация которого аналогична организации Linux Linked List.
За каждый выделенный участок памяти отвечает структура marea
Поля данной структуры имеют говорящие имена: адреса начала и конца данного участка памяти, флаги региона памяти. Поле mmap_link нужно для поддержания двусвязного списка, о котором говорилось выше.
Ранее уже рассказывалось о том, как происходит выделение физических страниц, какие данные о виртуальной памяти относятся к задаче, и теперь всё готово для того, чтобы говорить о непосредственном отображении виртуальных участков памяти на физические.
Отображение виртуальных участков памяти на физическую память подразумевает внесение соответствующих изменений в иерархию страничных директорий.
Подразумевается, что некоторый участок физической памяти уже выделен. Для того, чтобы выделить соответствующие виртуальные страницы и привязать их к физическим, используется функция vmem_map_region()
В качестве параметров передаётся контекст задачи, адрес начала физического участка памяти, а также адрес начала виртуального участка. Переменная flags содержит флаги, которые будут установлены у соответствующих записей в PTE.
Основную работу на себя берёт do_map_region(). Она возвращает 0 при удачном выполнении и код ошибки — в ином случае. Если во время маппирования произошла ошибка, то часть страниц, которые успели выделиться, нужно откатить сделанные изменения с помощью функции vmem_unmap_region(), которая будет рассмотрена позднее.
Рассмотрим функцию do_map_region() подробнее.
Макросы GET_PTE и GET_PMD нужны для лучшей читаемости кода. Они делают следующее: если в таблице памяти нужный нам указатель не ссылается на существующую запись, нужно выделить её, если нет — то просто перейти по указателю к следующей записи.
В самом начале необходимо проверить, выровнены ли под размер страницы размер региона, физический и виртуальный адреса. После этого определяется PGD, соответствующая указанному контексту, и извлекаются сдвиги из виртуального адреса (более подробно это уже обсуждалось выше).
Затем последовательно перебираются виртуальные адреса, и в соответствующих записях PTE к ним привязывается нужный физический адрес. Если в таблицах отсутствуют какие-то записи, то они будут автоматически сгенерированы при вызове вышеупомянутых макросов GET_PTE и GET_PMD.
После того, как участок виртуальной памяти был отображён на физическую, рано или поздно её придётся освободить: либо в случае ошибки, либо в случае завершения работы процесса.
Изменения, которые при этом необходимо внести в структуру страничной иерархии памяти, производятся с помощью функции vmem_unmap_region().
Все параметры функции, кроме последнего, должны быть уже знакомы. free_pages отвечает за то, должны ли быть удалены страничные записи из таблиц.
try_free_pte, try_free_pmd, try_free_pgd — это вспомогательные функции. При удалении очередной страницы может выясниться, что директория, её содержащая, могла стать пустой, а значит, её нужно удалить из памяти.
Исходный код функций try_free_pte, try_free_pmd, try_free_pgd
нужны как раз для случая двухуровневой иерархии памяти.
Конечно, данной статьи не достаточно, чтобы с нуля организовать работу с MMU, но, я надеюсь, она хоть немного поможет погрузиться в OSDev тем, кому он кажется слишком сложным.
В компьютере, как известно, есть оперативная память, используемая для хранения данных, которые нужны процессору в первую очередь, но есть также такое понятие, как виртуальная память компьютера.
Процессор постоянно решает какие-то задачи и все данные, которые нужны для его работы, помещаются в оперативную память и поскольку оперативная память имеет очень высокое быстродействие, то процессор также быстро получает доступ к необходимой информации.
Но оперативная память часто ограничена по размеру, так в домашних компьютерах, к примеру, размер ее редко превышает четыре гигабайта. Обычный размер оперативной памяти для ноутбуков, это 1 или 2 гигабайта.
Что такое виртуальная память компьютера
Для того, чтобы помочь компьютеру, несколько разгрузить оперативную память, операционная система Windows создает специальный файл, который в дальнейшем выполняет роль виртуальной памяти.
Этот файл называют также файлом подкачки – pagefile.sys, он располагаться на жестком диске компьютера и содержит атрибуты скрытый и системный.
Этот файл используется системой, чтобы хранить части программ и файлов, которые не умещаются в оперативной памяти, но необходимы для работы компьютера в данный момент.
По мере надобности Windows передает данные из файла виртуальной памяти в оперативную память и процессор получает таким образом быстрый доступ к этим данным.
Доступ к виртуальной памяти
Чтобы увидеть файл подкачки, заходим в программу Проводник и зайдем на диск С. Если отключено отображение скрытых файлов, то можно зайти в настройки программы Проводник, в меню – Упорядочить – Свойства – Параметры папок и поиска – Вид и откроется окошко Параметры папок.
Если собрана сеть, то доступ можно получить в Центре управления сетями и общим доступом. Тут опять же избираем Сервис – Параметры папок.
Откроется одноименное окно, выбираем в нем Вид и в Дополнительных параметрах снимаем пометку Скрывать защищенные системные файлы, а также нажимаем Показывать скрытые файлы, папки и диски. Жмем Применить.
Теперь на диске С появляются несколько папок и файлов, которые имеют атрибуты скрытый или системный. Здесь же можно увидеть файл pagefile.sys, который отмечен, как системный и его объем на данный момент составляет более 3 Гб.
По мере работы компьютера и запуска различных программ размер файла виртуальной памяти может увеличиваться. При этом можно увидеть, что размер свободного места на диске С непрерывно меняется.
В первую очередь это связано с тем, что работает виртуальная память, постоянно в нее помещаются какие-то файлы, фрагменты программ и поэтому этот файл постоянно изменяет свой размер.
При этом может быть две ситуации. Во-первых, место на диске С уменьшилось до таких размеров, что файл подкачки не может более увеличиваться в объеме.
Вторая ситуация, это файл подкачки ограничен в объеме пользователем и его не достаточно для хорошего функционирования компьютера.
Свободное место на диске С требуется как для работы файла подкачки, так и для работы различных программ, поскольку они создают различные временные файлы, в большинстве случаев они затем удаляются, как только работа программы будет закончена.
Поэтому надо следить, чтобы на диске С постоянно было свободное место. Так при работе ОС Windows 7 его должно быть не менее 5 -7 Гб.
Объем современных жестких дисков исчисляется часто терабайтами, поэтому оставить достаточное свободное место на диске С проблем не составит.
Как изменить объем виртуальной памяти
Для изменения объема виртуальной памяти необходимо перейти из панели управления в окно Система или нажимаем клавиши Windows + Pause.
В окне Система переходим во вкладку Дополнительные параметры системы. Открывается окно Свойства системы и в нем есть блок Быстродействие.
Нажимаем на кнопку Параметры, откроется окошко Параметры быстродействия. Открываем вкладку Дополнительно, где есть раздел Виртуальная память.
Нажимаем здесь на кнопку Изменить. В открывшемся окне снимаем галочку Автоматически выбирать объем файла подкачки и отмечаем Указать размер вручную.
Если размер установлен автоматически, то операционная система будет изменять размер по своему желанию. Можно этот размер ограничить, допустим 3500 Мб.
В этом случае виртуальная память компьютера всегда будет одного размера и пространство на диске С не будет изменяться из-за файла подкачки.
Есть возможность также выбрать какой-то диапазон значений и тогда файл виртуальной памяти станет меняться в заданных пределах.
Можно установить опцию Без файла подкачки и тогда виртуальная память компьютера использоваться вообще не будет.
Тогда быстродействие операционной системы несколько повысится, потому как оперативная память работает намного быстрее, чем жесткий диск.
Но произойдет это только в том случае, если на компьютере установлено достаточно оперативной памяти.
Чаще всего файл подкачки отключить невозможно, поэтому указываем его величину вручную, либо оставляем галочку Автоматически изменять объем файла подкачки. Нажимаем OK и выбранные параметры вступают в силу после того, как компьютер будет перезагружен.
Начинающие пользователи ПК, как правило, понятия не имеют, что такое виртуальная память в системе «Виндовс». В каких целях её используют? Как её включить, поменять размер или вовсе отключить? Как организована виртуальная память в «Виндовс» 10?
Что такое виртуальная память на Windows 10 и зачем она нужна
Вашей «оперативки» может не хватать на то количество программ, которые открыты сейчас на ПК. Чтобы система не тормозила, подключается виртуальная память. Это файл подкачки определённого размера (устанавливается вручную пользователем либо самой системой) на жёстком диске, в который временно помещается память из «оперативки». Иными словами, часть жёсткого диска используется как «оперативка», если последней оказалось мало.
Обычно в файл подкачки помещаются данные об открытых приложениях, которые в данный момент не используются процессором (окна этих приложений свёрнуты). При необходимости данные перемещаются обратно в «оперативку».
Файл подкачки, кстати, называется pagefile.sys.
Где находится виртуальная память Windows 10 и как её включить
Виртуальная память в виде файла подкачки находится в корневой папке локального системного диска. По умолчанию эта память включена в «Виндовс». Но даже если она отключена, вы можете её сами включить в настройках системы — об этом в следующем разделе.
Файл pagefile.sys по умолчанию находится прямо на системном диске
Как настроить виртуальную память: увеличить или уменьшить размер, отключить её
Ручная настройка файла подкачки поможет оптимизировать работу компьютера. Можно увеличить размер памяти, если ваша «оперативка» не справляется с задачей. Если вам не хватает места на системном диске, вы можете перебросить этот файл на пользовательский диск либо вовсе отключить функцию — файл исчезнет, места станет больше. Выключать файл подкачки стоит только в том случае, если вы уверены, что голой «оперативки» вам хватит на все нужды ПК.
Параметры pagefile.sys
В «десятке» можно очень быстро перейти в настройки виртуальной памяти:
-
Кликаем по лупе справа от «Пуска». В поле для поиска набираем слово «представление». По мере ввода должна сразу появиться выдача «Настройка представления и производительности системы». Щёлкаем по этому результату.
Вбейте запрос в «Поиске Виндовс»
Перейдите к изменению параметров виртуальной памяти
Задайте определённый размер для вашего файла подкачки
Настройка дополнительного файла подкачки swapfile.sys
В «Виндовс» 10 есть ещё один файл подкачки — дополнительный swapfile.sys. Он также находится на системном диске. Он предназначен для хранения информации о приложениях из магазина «Виндовс Стор». Причём в файле хранятся не отдельные разбросанные данные, а вся информация о работе программы целиком. Благодаря этому файлу программы из магазина могут уходить в гибернацию (режим по типу сна), как это делает вся система «Виндовс».
Файл swapfile.sys отвечает за сохранение информации работающих приложений из магазина
Настроить как-либо этот документ нельзя. Вы можете его удалить, но система его вновь создаст, если вы будете пользоваться приложениями из фирменного магазина Windows. Переживать по поводу размеров swapfile.sys не стоит — он весит довольно мало.
Как очистить виртуальную память
Виртуальную память нужно периодически очищать. Можно сразу настроить её очистку вместе с отключением компьютера:
-
Запустите «Панель управления» через меню «Пуск» либо с помощью панели «Выполнить». В последнем случае зажмите «Виндовс» и R. Напишите control и щёлкните по ОК.
Выполните команду control
Перейдите в «Администрирование»
Дважды кликните по ярлыку «Локальная политика безопасности»
Виртуальная память на «Виндовс» может компенсировать нехватку «оперативки», когда система перегружена открытыми окнами. Вы вправе сами указать размер файла подкачки (виртуальной памяти) либо вовсе отключить его, чтобы сэкономить место на системном диске. Желательно сразу настроить очистку виртуальной памяти вместе с отключением «компа».
Читайте также: