2013-07-03 4 views
0

malloc() выделяет кусок памяти, который практически неотделим внутри пространства памяти процесса. malloc() принимает размер как параметр в байтах и ​​возвращает указатель на выделенное пространство памяти, но что, если требование состоит в том, чтобы выделить память, которая выровнена на 4k?Как выделить 4k выровненную память

+0

Возможно, вы имеете в виду 'aligned' not' aliened' –

+0

Возможно, вам стоит [прочитать этот вопрос] (http://stackoverflow.com/questions/227897/solve-the-memory-alignment-in-c-interview-question -that-stumped-me/227900 # 227900), что касается очень сходной проблемы, хотя и для общего (не специфичного для Linux) домена. – Jubatian

ответ

2

Это почти наверняка будет достигнуто с использованием чего-то вроде posix_memalign.

1

Поскольку 4Kbytes часто размер страницы (см sysconf(3) с _SC_PAGESIZE или старым getpagesize(2) системным вызовом), вы можете использовать mmap(2) (системный вызов, который используется malloc и posix_memalign), чтобы получить память 4Kaligned.

+0

Обратите внимание, что если вы используете 'mmap()' напрямую, вы можете оказаться с меньшим объемом памяти. В наиболее пессимированном случае выделение 4 блоков KiB из 'mmap()' дает максимум 256 выделенных сумм памяти MiB, так как существует ограничение 2^16 на число областей 'mmap()'. –

+1

Я не думаю, что существует ограничение 2^16 на количество сегментов 'mmap'-ed. Мой пример [manydl.c] (http://starynkevitch.net/Basile/manydl.c) способен сделать много тысяч тысяч 'dlopen' (и каждый из них использует более одного сегмента mmap-ed). –

0

Вы не можете выделить физически смежную память в пространстве пользователя. Потому что в ящике User space всегда выделяет память из зоны highmem. Но если вы пишете модуль ядра или код системного пространства, вы можете использовать _get_page() или _get_pages().

+0

Функция posix_memalign() выделяет байты размера и помещает адрес выделенной памяти в * memptr. Адрес выделенной памяти будет кратным выравниванию, который должен быть мощностью двух и кратным sizeof (void *). Если размер равен 0, то значение, помещенное в * memptr, равно NULL или уникальное значение указателя, которое впоследствии может быть успешно передано на бесплатное (3). – LtWorf

Смежные вопросы