Как malloc в диапазоне адресов> 4 ГиБ - PullRequest
2 голосов
/ 17 марта 2011

Я пытаюсь провести несколько тестов на X86_64 Linux, и я хочу знать, как make malloc () выделяет адреса возврата в диапазоне выше 4 ГиБ

Должен ли я переопределять malloc отдельной / настраиваемой библиотекой или есть другой простой способ сделать это?

Спасибо.

---- Изменить ----

Что меня интересует, так это адрес, который принимается за значение (uintptr_t) и не имеет значения, является ли его виртуальный или физический адрес, потому что все что я хочу это адрес должен быть значение больше, чем 4 ГБ

Я использую gcc (4.2.1) с -m64, в Linux x86_64

(надеюсь, я прояснил вопрос)

Ответы [ 5 ]

4 голосов
/ 17 марта 2011

malloc() - неправильный инструмент.Вы хотите mmap() /dev/zero (это то, что malloc() делает за кулисами в современном glibc), IIRC.(В Unix. Я считаю, что есть аналогичный API для Win32, но я не могу сказать вам, что это такое.)

3 голосов
/ 17 марта 2011

malloc () не позволяет запрашивать адреса в определенном диапазоне. Как описано в некоторых других ответах, если это всего лишь тест, вы можете просто продолжать вызывать malloc () для получения все большего объема памяти, пока не получите ответ, который вам нравится, но это довольно расточительно.

Используйте mmap (). Если вы звоните как:

mmap (ADDRESS_ABOVE_4GB, размер, PROT_READ | PROT_WRITE, MAP_ANONYMOUS, -1, 0)

он даст вам то, что вы хотите, с почти такой же семантикой, что и malloc ().

Если вы пытаетесь заставить это произойти для вызовов malloc () в коде, который вы не контролируете / не имеете исходного кода, например код библиотеки, да, вам придется предоставить собственную реализацию malloc () это делает выше.

2 голосов
/ 17 марта 2011

Пока вы компилируете, например, gcc -m64 ... (может быть по умолчанию) и убедитесь, что вы включили соответствующие заголовки (т.е. <stdlib.h> в случае malloc), тогда все должно просто работать .Указатели будут 64 битами, size_t будут 64 битами, и вы можете malloc столько памяти, сколько хотите (ну, в любом случае, до 2 ^ 64-1 байта, что должно быть достаточно для любого ...).

0 голосов
/ 17 марта 2011

malloc возвращает адрес, соответствующий вызову ядра операционной системы, который найдет «следующий» доступный блок памяти, который соответствует требованию size_t.

Если вы хотите убедиться, что адрес находится в определенном диапазоне, пользовательская версия malloc не сработает, поскольку фактическое назначение памяти - это ретрансляция от выделения ядром страниц памяти для процесса.

Это в основном означает, что единственная другая оставшаяся техника - это удерживать malloc'ы до тех пор, пока вы не исчерпаете память ниже 4 ГБ, или, возможно, вам повезет и вы получите адрес в нужном вам диапазоне. Обратите внимание, что даже для достижения этого диапазона и ваша программа, и операционная система должны быть скомпилированы для поддержки более чем 32-разрядных адресов, что подразумевает 64-разрядные архитектуры.

0 голосов
/ 17 марта 2011

Не существует стандартного способа заставить malloc() выделять адреса в определенном диапазоне.

Однако вы можете выделить 4 ГиБ памяти.Если он выделен так, что в верхнем диапазоне адресов достаточно места, используйте это пространство.В противном случае выделите больше места;он должен быть выделен с начальным адресом в верхнем диапазоне, но вы должны проверить (потому что небольшое выделение может все еще втиснуться в пространство, оставшееся в низком диапазоне адресов), и продолжать выделять, пока выделенное пространство не окажется в верхнем диапазоне адресов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...