Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Процессоры используют виртуальные адреса при чтении или записи в участки памяти. Во время этих операций процессор преобразует виртуальный адрес в физический.
Существует несколько преимуществ доступа к памяти с помощью виртуальных адресов:
Программа может использовать непрерывный диапазон виртуальных адресов для доступа к большому неконтигуционному буферу памяти в физической памяти.
Программа может использовать диапазон виртуальных адресов для доступа к буферу памяти больше доступной физической памяти. Если физическая память низка, диспетчер памяти сохраняет страницы физической памяти (обычно размером 4 килобайта) в файл диска. Система перемещает страницы данных или кода между физической памятью и диском по мере необходимости.
Виртуальные адреса, используемые различными процессами, изолированы. Код в одном процессе не может изменить физическую память, которая используется другим процессом или операционной системой.
Диапазон виртуальных адресов, доступных для процесса, называется виртуального адресного пространства процесса. Каждый процесс пользовательского режима имеет собственное частное виртуальное адресное пространство.
32-разрядный процесс обычно имеет виртуальное адресное пространство в диапазоне 2-гигабайтов, 0x00000000 через 0x7FFFFFFF.
64-разрядный процесс в 64-разрядной версии Windows имеет виртуальное адресное пространство в диапазоне 128-терабайтов 0x000'00000000 до 0x7FFF'FFFFFFFFFFFF.
Диапазон виртуальных адресов иногда называется диапазоном виртуальной памяти. Дополнительные сведения см. в разделе ограничения памяти и адресного пространства.
На следующей схеме показаны некоторые ключевые функции виртуальных адресных пространств.
диаграмма
На схеме показаны виртуальные адресные пространства для двух 64-разрядных процессов: Notepad.exe и MyApp.exe. Каждый процесс имеет собственное виртуальное адресное пространство, начиная от 0x000'0000000 до 0x7FF'FFFFFFFFFF. Каждый затенированный блок представляет одну страницу (размер 4 килобайта) виртуальной или физической памяти. В процессе Блокнот используются три смежных страницы виртуальных адресов, начиная с 0x7F7'93950000. Однако эти три смежных страницы виртуальных адресов сопоставляют с неконтигентными страницами в физической памяти. Кроме того, оба процесса используют страницу виртуальной памяти, начиная с 0x7F7'93950000, но эти виртуальные страницы отображаются на разные страницы физической памяти.
Пространство пользователя и системное пространство
Такие процессы, как Notepad.exe и MyApp.exe выполняются в пользовательском режиме. Основные компоненты операционной системы и многие драйверы выполняются в более привилегированном режиме ядра. Дополнительные сведения о режимах процессора см. в режиме пользователя и режиме ядра.
Каждый процесс пользовательского режима имеет собственное частное виртуальное адресное пространство, но весь код, который выполняется в режиме ядра, использует одно виртуальное адресное пространство, называемое системным пространством. Виртуальное адресное пространство в пользовательском режиме называется пространство пользователя.
В 32-разрядной версии Windows общее доступное виртуальное адресное пространство составляет 2^32 байта (4 гигабайта). Как правило, для пространства пользователя используются нижние 2 гигабайта, а для системного пространства используются верхние 2 гигабайта.
В 32-разрядной версии Windows можно указать (во время загрузки), что для пользовательского пространства доступно более 2 гигабайта. Однако это означает, что для системного пространства доступно меньше виртуальных адресов. Размер пространства пользователя можно увеличить до 3 гигабайт, оставив только 1 гигабайт для системного пространства. Чтобы увеличить размер пространства пользователя, используйте BCDEdit /set increaseuserva.
В 64-разрядной версии Windows теоретический объем виртуального адресного пространства составляет 2^64 байта (16 exabytes), но на самом деле используется только небольшая часть диапазона 16-exabyte.
Код, выполняемый в пользовательском режиме, может получить доступ к пространству пользователя, но не к системным пространствам. Это ограничение предотвращает чтение или изменение защищенных структур данных операционной системы в пользовательском режиме. Код, выполняемый в режиме ядра, может получить доступ как к пространству пользователя, так и к системным пространствам. То есть код, выполняющийся в режиме ядра, может получить доступ к системным пространствам и виртуальному адресу текущего процесса пользовательского режима.
Драйверы, работающие в режиме ядра, должны быть осторожны при непосредственном чтении или записи по адресам в пространстве пользователя. В следующем сценарии показано, почему.
Программа пользовательского режима инициирует запрос на чтение некоторых данных с устройства. Программа предоставляет начальный адрес буфера для получения данных.
Подпрограмма драйвера устройства, запущенная в режиме ядра, запускает операцию чтения и возвращает управление вызывающей функции.
Позже устройство прерывает текущий поток, чтобы указать, что операция чтения завершена. Подпрограммы драйвера в режиме ядра обрабатывают прерывание в этом произвольном потоке, который принадлежит произвольному процессу.
На этом этапе драйвер не должен записывать данные в начальный адрес, предоставленный программой пользовательского режима на шаге 1. Этот адрес находится в виртуальном адресном пространстве процесса, инициируемого запросом, который, скорее всего, не совпадает с текущим процессом.
Страничный пул и нестраничный пул
В пользовательском пространстве все страницы физической памяти можно вывести на дисковый файл по мере необходимости. В системном пространстве некоторые физические страницы можно выгрузить, а другие — нет. Системное пространство имеет два региона для динамического выделения памяти: страничный пул и непагированный пул.
Память, выделенная в пуле страниц, можно вывести на дисковый файл по мере необходимости. Память, выделенная в нестраничном пуле, никогда не может быть выгружена в файл диска.