Выделение памяти Win32 с большим выравниванием

Мне нужно выделить большие области памяти (мегабайты) с большими выравниваниями (также потенциально в диапазоне мегабайт). Семейство функций VirtualAlloc, похоже, не предоставляет возможностей для этого.

Что я делаю в Linux, чтобы достичь этого, так это mmap большего региона — достаточно большого, чтобы гарантировать, что в нем будет содержаться достаточно большой регион с требуемым выравниванием, — а затем munmap регионов в начале и конце большого региона, который не нужны.

В качестве примера предположим, что мне нужно 4 мегабайта, выровненных по границе 1 мегабайта (т. е. начало области с нулями в младших 20 битах). Я бы mmap 5 мегабайт. Допустим, я получаю регион 0x44ff000-0x49ff000. Внутри этого региона содержится регион 0x4500000-0x4900000, который выровнен по границе 1 мегабайта. Я бы тогда munmap 0x44ff000-0x4500000 и 0x4900000-0x49ff000.

Могу ли я сделать что-то подобное на Win32? Если я использую VirtualProtect с PAGE_NOACCESS, будет ли освобождена память? Есть ли лучшее решение?


person Mark Probst    schedule 30.09.2011    source источник
comment
Наличие требования выравнивания для виртуальной памяти очень странно, это имеет значение только для физической памяти. Во всяком случае, в Windows нельзя. Но это не имеет значения, потому что вам нужно только зарезервировать выделенные ресурсы. Подтверждение — это отдельный шаг. Также возможен запрос распределения по конкретному счастливому адресу. Используйте Виртуаллок().   -  person Hans Passant    schedule 01.10.2011


Ответы (2)


Да, вы можете использовать ту же технику. VirtualAlloc большой диапазон как MEM_RESERVE. Найдите поддиапазон, который правильно выровнен, и вызовите VirtualAlloc во второй раз для поддиапазона с помощью MEM_COMMIT.

person Raymond Chen    schedule 01.10.2011

Взгляните на источник для _aligned_malloc в Windows/MSVC crt, очень просто использовать тот же метод для выравнивания виртуальной памяти, я бы даже сказал, просто замените его внутренний вызов malloc (то же самое касается _aligned_free), это позволяет выделять только с помощью одного системного вызова.

Впрочем, зачем вам такое массовое выравнивание? Вы пытаетесь злоупотреблять битовыми шаблонами адресов для блоков быстрой памяти?

person Necrolis    schedule 01.10.2011