Виртуальная и физическая память
Подсистема предоставляет ряд методов для чтения и записи виртуальной и физической памяти целевого объекта.
Виртуальная память
При указании расположения в виртуальной памяти целевого объекта используется виртуальное адресное пространство целевого объекта. При отладке в пользовательском режиме это виртуальное адресное пространство текущего процесса. При отладке в режиме ядра это виртуальное адресное пространство неявного процесса. Дополнительные сведения о текущем и неявном процессе см. в разделе Потоки и процессы .
Виртуальную память (целевого объекта) можно считывать с помощью ReadVirtual и записывать с помощью WriteVirtual.
Указатели в памяти целевого объекта можно считывать и записывать с помощью удобных методов ReadPointersVirtual и WritePointersVirtual. Эти методы автоматически преобразуются между 64-разрядными указателями, используемыми подсистемой, и собственными указателями, используемыми целевым объектом. Эти методы полезны при запросе памяти, содержащей указатели, которые будут использоваться для последующих запросов, например указателя на строку.
Методы SearchVirtual и SearchVirtual2 можно использовать для поиска шаблона байтов в виртуальной памяти целевого объекта.
Метод FillVirtual можно использовать для многократного копирования шаблона байтов в виртуальную память целевого объекта.
Виртуальную память целевого объекта также можно считать и записать таким образом, чтобы обойти кэш виртуальной памяти подсистемы отладчика с помощью методов ReadVirtualUncached и WriteVirtualUncached. Эти некэшированные версии полезны для чтения виртуальной памяти, которая является непостоянной, например, сопоставленных с памятью областей устройств, без загрязнения или недействительности кэша. Некэшированный доступ к памяти следует использовать только в ситуациях, когда это необходимо, так как производительность некэшированного доступа может быть значительно ниже, чем кэшированный доступ.
Подсистема предоставляет некоторые удобные методы для чтения строк из виртуальной памяти целевого объекта. Для чтения многобайтовой строки из целевого объекта используйте readMultiByteStringVirtual и ReadMultiByteStringVirtualWide. Для чтения строки Юникода из целевого объекта используйте ReadUnicodeStringVirtual и ReadUnicodeStringVirtualWide.
Чтобы найти сведения о расположении в памяти, используйте GetOffsetInformation. Не все виртуальные адресные пространства в целевом объекте содержат допустимую память. Чтобы найти допустимую память в регионе, используйте GetValidRegionVirtual. При поиске допустимой памяти в целевом объекте вручную метод GetNextDifferentlyValidOffsetVirtual найдет следующее расположение, в котором допустимость может измениться.
Физическая память
Прямой доступ к физической памяти можно получить только при отладке в режиме ядра.
Метод FillPhysical можно использовать для многократного копирования шаблона байтов в физическую память целевого объекта.
Адрес в виртуальном адресном пространстве целевого объекта можно преобразовать в физический адрес целевого объекта с помощью метода VirtualToPhysical . Структуры подкачки системы, используемые для преобразования виртуального адреса в физический, можно найти с помощью GetVirtualTranslationPhysicalOffsets.
События
При изменении виртуальной или физической памяти целевого объекта вызывается метод обратного вызова IDebugEventCallbacks::ChangeDebuggeeState .
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Windows driver documentation
Виртуальная и физическая память — WEBSITE X5 UNREGISTERED VERSION 12.0.5.22 — Электронный справочник по дисциплине Операционные системы и среды
О перативная память является, пожалуй, одним из наиболее дорогих компонентов компьютерной системы. Ранние системы UNIX имели в своем распоряжении 64 Кбайт оперативной памяти, и это количество было явно недостаточным, современные компьютеры обладают гигабайтами оперативной памяти, но и этого уже мало.
Оперативная память может быть представлена в виде последовательности байтов, каждый из которых имеет свой уникальный адрес, называемый физическим адресом . Именно эти адреса в конечном счете использует процессор, обмениваясь данными с оперативной памятью. Однако адресное пространство процесса существенным образом отличается от адресного пространства физической оперативной памяти. Представим себе, что адресное пространство процесса непосредственно отображалось бы в оперативную память, другими словами, что адреса, используемые процессом, являлись бы физическими адресами. При таком подходе на пути создания многозадачной системы нас ожидал бы ряд непреодолимых препятствий:
Во-первых, трудно себе представить механизм, защищающий адресное пространство одного процесса, от адресного пространства другого или, что более важно, от адресного пространства самой операционной системы. Поскольку каждый процесс работает с физическими адресами, нет никакой гарантии, что процесс не обратится к ячейкам памяти, принадлежащим другим процессам или ядру системы. Последствия такого обращения скорее всего будут весьма плачевными.
Во-вторых, уже на этапе компиляции необходимо было бы предусмотреть распределение существующего физического адресного пространства. При запуске каждый процесс должен занимать непрерывную и непересекающуюся область физических адресов.
В-третьих, подобное распределение памяти между процессами вряд ли можно назвать оптимальным. Объем физической оперативной памяти будет существенным образом ограничивать число процессов, одновременно выполняющихся в системе. Так восемь процессов, каждый из которых занимает 1 Мбайт памяти, исчерпают 8 Мбайт оперативной памяти, а операционная система при средней загрузке насчитывает более 80 процессов!
Все перечисленные проблемы преодолимы с помощью виртуальной памяти. При этом адреса, используемые приложениями и самим ядром, не обязаны соответствовать физическим адресам. Виртуальные адреса транслируются или отображаются в физические на аппаратном уровне при активном участии ядра операционной системы.
Смысл виртуальной памяти заключается в том, что каждый процесс выполняется в собственном виртуальном адресном пространстве. Виртуальное адресное пространство — настоящий рай для процесса. Во-первых, у процесса создается ощущение исключительности — ведь все адресное пространство принадлежит только ему. Во-вторых, он больше не ограничен объемом физической памяти — виртуальная память может значительно превышать физическую. В результате процессы становятся изолированными друг от друга и не имеют возможности (даже при желании) «хозяйничать» в адресном пространстве соседа. Физическая память распределяется максимально эффективно — она не зависит от распределения виртуальной памяти отдельного процесса.
Очевидно, что для реализации виртуальной памяти необходим управляемый механизм отображения виртуального адреса в физический. В современных компьютерных системах процесс отображения выполняется на аппаратном уровне (с помощью обеспечивая высокую скорость трансляции. Операционная система осуществляет управление этим процессом.
Современные процессоры, как правило, поддерживают объединение адресного пространства в области переменного размера — сегменты и области фиксированного размера — страницы. При этом для каждого сегмента или страницы может быть задано собственное отображение виртуальных адресов в физические.
Виртуальное адресное пространство процесса, как правило, является последовательным в рамках уже знакомых нам сегментов — кода, данных, стека и библиотек. Расположение соответствующих областей физической памяти может иметь фрагментированный характер, позволяя оптимально распределять память между процессами.
Физическая и виртуальная память.
При выполнении программы мы имеем дело с физической оперативной памятью, собственно с которой и работает процессор, извлекая из нее команды и данные и помещая в нее результаты вычислений.
Физическая память представляет собой упорядоченное множество ячеек реально существующей оперативной памяти, и все они пронумерованы, то есть к каждой из них можно обратиться, указав ее порядковый номер (адрес). Количество ячеек физической памяти ограниченно и имеет свой фиксированный объем.
Процессор в своей работе извлекает команды и данные из физической оперативной памяти, данные из внешней памяти (винчестера, CD) непосредственно на обработку в процессор попасть не могут.
Системное программное обеспечение должно связать каждое указанное пользователем символьное имя с физической ячейкой памяти, то есть осуществить отображение пространства имен на физическую память компьютера. В общем случае это отображение осуществляется в два этапа: сначала системой программирования, а затем операционной системой. Это второе отображение осуществляется с помощью соответствующих аппаратных средств процессора — подсистемы управления памятью, которая использует дополнительную информацию, подготавливаемую и обрабатываемую операционной системой. Между этими этапами обращения к памяти имеют форму виртуального адреса. При этом можно сказать, что множество всех допустимых значений виртуального адреса для некоторой программы определяет ее виртуальное адресное пространство, или виртуальную память. Виртуальное адресное пространство программы зависит, прежде всего, от архитектуры процессора и от системы программирования и практически не зависит от объема реальной физической памяти компьютера. Можно еще сказать, что адреса команд и переменных в машинной программе, подготовленной к выполнению системой программирования, как раз и являются виртуальными адресами.
При программировании на языках высокого уровня программист обращается к памяти с помощью логических имен. Имена переменных, входных точек составляют пространство имен. Процессор работает только с физической оперативной памятью, которая достаточно дорога и имеет большие, но не всегда достаточные размеры. Когда задача попадает на обработку, то перед ОС встает задача привязать символическое имя задачи с конкретной ячейкой ОП. Так, система программирования, в данном случае транслятор Ассемблера, присваивает каждому символическому имени адрес относительно начала сегмента, а операционная система в сегментные регистры заносит адреса начала сегментов и, при их сложении, получается физический адрес памяти расположения элемента с данным символическим именем. Когда программа прошла этапы трансляции и редактирования, она приобрела двоичный вид. Все символические имена имеют двоичные адреса от какого-то нулевого значения, но они не указывают на конкретные ячейки памяти. В этом случае говорят, что символические имена, команды имеют виртуальный адрес. А когда операционная система соизволит запустить программу на выполнение, применив какую-то дисциплину обслуживания заданий, она каждому виртуальному адресу присвоит конкретный физический адрес оперативной памяти.
Когда администратор вычислительной системы запускает на выполнение множество заданий, то физический адрес команды или данного имеет только та задача, которая в данный момент обрабатывается процессором. Все остальные программы имеют виртуальные адреса, а их сумма составляет виртуальное адресное пространство. Современные ОС могут поддерживать виртуальное адресное пространство размером до 4Гбайт. При большой загрузке вычислительной системы, когда все запущенные на обработку программы не помещаются в оперативной памяти, они располагаются в виртуальной памяти и имеют виртуальные адреса. Когда по какой-либо дисциплине диспетчеризации они запускаются на обработку, модулями операционной системы виртуальные адреса превращаются в физические адреса оперативной памяти.
В некоторых случаях отображение пространства имен на физическую память тождественно отображению на виртуальное пространство. Получается абсолютная двоичная программа, где виртуальные адреса в точности соответствуют физическим. К таким программам относятся часть модулей ОС, которые каждый раз располагаются в ОП по одним и тем же адресам.
При работе на компьютере может встретиться наличие трех ситуаций:
— V(вирт) < V(оп) - виртуальное адресное пространство меньше объема ОП;
— V(вирт) = V(оп) — виртуальное адресное пространство равно объему ОП;
— V(вирт) > V(оп) — виртуальное адресное пространство больше объема ОП.
В первых двух случаях никаких трудностей в распределении оперативной памяти возникнуть не может. Программ мало, все команды и данные находятся в ОП. Распределение ресурсов памяти обеспечивается разными методами.
При мультипрограммировании виртуальное адресное пространство, как правило, бывает намного большего размера, чем свободная оперативная память, предоставляемая операционной системой для выполнения программ. В этом случае от методов распределения памяти между задачами во многом зависит производительность вычислительной системы.
Sysadminium
Каждому процессу выделяется память, такая память называется виртуальной. В этой статье я покажу вам, чем отличаются виртуальная и физическая память Windows.
Виртуальная и физическая память Windows
Для каждого нового процесса, в операционной системе Windows, выделяется некоторый объём оперативной памяти. Процесс не обязательно должен использовать весь выделенный объем памяти, он может занять всего лишь часть. Этот объем памяти называется виртуальным адресным пространством.

Процесс помещает все свои данные в выделенное ему виртуальное адресное пространство. И кстати, он не заботится о реальном расположении памяти. Собственно говоря, физическая память может находиться в оперативной памяти или на жестком диске. Такая память, расположенная на жёстком диске, называется SWAP. В Windows SWAP — это файл на жёстком диске в который помещаются данные из оперативной памяти. Данные в этом файле хранятся точно также как и в оперативной памяти.

Виртуальную память так назвали, потому что процесс думает что он в операционной системе один. Процесс видит только выделенный ему объём памяти (своё виртуальное адресное пространство) и не знает сколько в системе реально физической памяти.
Соотношение виртуальной памяти с физической
В общем работу виртуальной и физической памяти можно представить, таким образом:

- процесс помещает свои данные в ячейки памяти, которые принадлежат его виртуальному адресному пространству;
- вместе с тем, виртуальные ячейки связаны с физическими ячейками в оперативной памяти или на жестком диске в SWAP;
- и в итоге процессу не обязательно знать про физическое расположение памяти.
Размер виртуального адресного пространства теоретически ограничивается архитектурой компьютера. Но операционная система накладывает дополнительные ограничения.
| Архитектура | Теоретический предел | Реальный предел для системных компонентов Windows |
Реальный предел для виртуального адресного пространства процесса |
|---|---|---|---|
| 32-разрядная | 4 ГБ | 2 ГБ | 2 ГБ |
| 64-разрядная | 16 ЭБ = = 17600000000 ГБ |
128 ТБ = = 128000 ГБ |
128 ТБ = = 128000 ГБ |
Вы можете спросить, куда девается остальная память на 64-разрядной Windows? Она просто игнорируется, так как пока сложно себе представить такой объём оперативной памяти.
У физической памяти тоже есть лимит и он намного меньше чем лимиты для виртуальной памяти и составляет 24 ТБ.
Надеюсь вам стало понятнее зачем нужна виртуальная и физическая память Windows.

Каждому процессу выделяется память, такая память называется виртуальной. В этой статье я покажу вам, чем отличаются виртуальная и физическая память Windows