Может ли Windows 64-bit распределять виртуальную память по 7FFF'FFFF'FFFF? - PullRequest
1 голос
/ 26 марта 2019

Контекст

Я работаю над обновлением библиотеки .NET для поддержки 64-битной.Эта библиотека выполняет различные операции непосредственно в памяти других процессов в Windows.Я должен выбрать один из двух типов IntPtr (макс. Положительное значение 7FFF'FFFF'FFFF'FFFF) или UIntPtr (макс. Положительное значение FFFF'FFFF'FFFF'FFFF) для работы с указателями памяти.В Интернете много информации о них.IntPtr представляется фактически согласованным выбором, поскольку он совместим с CLS, и большая часть .NET API полагается на это (ref Marshal из InteropServices).

Вопрос

Я решил открыть 64-битный процесс и проверить выделенные области памяти, а также загруженные модули в процессе, чтобы увидеть, было бы полезно поддерживать указатели без знака, используя UIntPtr (адреса>7FFF'FFFF'FFFF'FFFF).Как показано на скриншоте ниже, кажется, что адреса памяти не загружают символы и не распределяют память по 7FFF'FFFF'FFFF.Есть ли конкретная причина для этого?Может ли Windows выделять области памяти по этому значению в некоторых случаях?

Спасибо!

Memory allocation on Cheat Engine (64-bit)

Ответы [ 3 ]

2 голосов
/ 26 марта 2019

Из-за спецификаций для x64 вы можете зависеть от указателей пользовательского пространства, всегда вписывающихся в IntPtr.Вы не можете зависеть от меньшего пространства.Процессор может получить больше адресных строк в будущем.Когда это происходило между Windows 8 и Windows 8.1, флаг обратной совместимости не добавлялся.

На самом деле вы получили как положительные, так и отрицательные указатели в x86, но хранение указателей в IntPtr все равно работало из-за отсутствия людей-land в 0x7FFF0000 и нулевой диапазон ловушек в 0x00000000.

Я не думаю, что вы пытаетесь делать помеченные указатели, но если вы это делаете, единственный приемлемый способ сделать помеченные указатели этонижние два бита.

1 голос
/ 26 марта 2019

В Windows каждый процесс имеет только адресное пространство 8 ТБ, поэтому верхний предел для кода пользователя составляет 0x7FF'FFFF'FFFF

Диапазон виртуальных адресов, доступных для процесса, называетсявиртуальное адресное пространство для процесса.Каждый процесс пользовательского режима имеет свое собственное личное виртуальное адресное пространство.Для 32-разрядного процесса виртуальное адресное пространство обычно составляет 2-гигабайтный диапазон от 0x00000000 до 0x7FFFFFFF.Для 64-разрядного процесса виртуальное адресное пространство представляет собой 8-терабайтный диапазон от 0x000'00000000 до 0x7FF'FFFFFFFF.Диапазон виртуальных адресов иногда называют диапазоном виртуальной памяти.

Эта диаграмма иллюстрирует некоторые ключевые особенности виртуальных адресных пространств.

some of the key features of virtual address spaces

https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/virtual-address-spaces

Верхние 248 ТБ относятся к режиму ядра, суммируя до 256 ТБ адресного пространства, которое адресуется 48 бит .Это означает, что максимально возможный положительный адрес равен 2 47 -1 = 0x7FFF'FFFF'FFFF

В 64-битной Windows теоретический объем виртуального адресного пространства равен 2 ^ 64байт (16 эксабайт), но фактически используется только небольшая часть диапазона 16 эксабайт.8-терабайтный диапазон от 0x000'00000000 до 0x7FF'FFFFFFFF используется для пространства пользователя, а части 248-терабайтного диапазона от 0xFFFF0800'00000000 до 0xFFFFFFFF'FFFFFFFF используются для системного пространства.

Значительная часть имеет ширину 48 бит, вероятно, потому что большинство современных реализаций x86-64 используют 48-битный виртуальный адрес

Первоначальная реализация архитектуры AMD64 реализовала 40-битные физические адреса и поэтому могла адресовать до1 ТБ (2 40 байт) оперативной памяти.Современные реализации архитектуры AMD64 (начиная с 10-часовой микроархитектуры AMD) расширяют ее до 48-битных физических адресов и, следовательно, могут адресовать до 256 ТБ ОЗУ.Архитектура позволяет расширять это до 52 битов в будущем (ограничено форматом записи таблицы страниц);это позволило бы адресовать до 4 ПБ ОЗУ.

https://en.wikipedia.org/wiki/X86-64#Architectural_features

1 голос
/ 26 марта 2019

В Windows максимальный адрес виртуальной памяти равен 7FFF'FFFF'FFFF'FFFF, т. Е. Невозможно выделить память вне этого адреса. Исторически первые 64-разрядные процессоры от AMD и Intel (согласно спецификации AMD64) поддерживали только адреса 48 бит. Отсюда и предел.

Подробнее см. Здесь: http://www.alex -ionescu.com /? Р = 50 а также https://blogs.technet.microsoft.com/markrussinovich/2008/11/17/pushing-the-limits-of-windows-virtual-memory/

...