Как выделить область памяти, на которую похож VirtualAlloc? - PullRequest
1 голос
/ 22 мая 2011

Я искал способ выделения памяти в Linux, аналогичный VirtualAlloc для Windows. Требования:

  1. Размер блока памяти для выделения равен 2 ^ 16.
  2. Адрес блока памяти больше 0x0000ffff
  3. Адрес блока памяти должен иметь последние 16 бит, равные нулю.

В Windows, поскольку нижний предел адреса приложения (lpMinimumApplicationAddress) у нас (2) очевиден, верно. Из (1), (2) и системных правил мы также достигли (3).

Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 22 мая 2011

Попробуйте mmap(..., MAP_ANONYMOUS, ...)

Вы получите адрес, который выровнен по границе страницы.Для более строгого выравнивания вам, вероятно, нужно выделить дополнительные и выбрать адрес внутри вашего большего блока, чем правильно выровненный.

0 голосов
/ 23 мая 2011

Вы хотите posix_memalign():

void *ptr;
int memalign_err = posix_memalign(&ptr, 1UL << 16, 1UL << 16);

if (memalign_err) {
    fprintf(stderr, "posix_memalign: %s\n", strerror(memalign_err));
} else {
    /* ptr is valid */
}

Первый 1UL << 16 - это выравнивание, а второй - размер.

Когда вы закончите с блоком, вы передадите его free().

0 голосов
/ 22 мая 2011

вы можете задать конкретный адрес в mmap, он может не работать для некоторых конкретных адресов, но обычно он работает

...