malloc()
выделяет кусок памяти, который практически неотделим внутри пространства памяти процесса. malloc()
принимает размер как параметр в байтах и возвращает указатель на выделенное пространство памяти, но что, если требование состоит в том, чтобы выделить память, которая выровнена на 4k?Как выделить 4k выровненную память
ответ
Это почти наверняка будет достигнуто с использованием чего-то вроде posix_memalign.
Поскольку 4Kbytes часто размер страницы (см sysconf(3) с _SC_PAGESIZE
или старым getpagesize(2) системным вызовом), вы можете использовать mmap(2) (системный вызов, который используется malloc
и posix_memalign
), чтобы получить память 4Kaligned.
Обратите внимание, что если вы используете 'mmap()' напрямую, вы можете оказаться с меньшим объемом памяти. В наиболее пессимированном случае выделение 4 блоков KiB из 'mmap()' дает максимум 256 выделенных сумм памяти MiB, так как существует ограничение 2^16 на число областей 'mmap()'. –
Я не думаю, что существует ограничение 2^16 на количество сегментов 'mmap'-ed. Мой пример [manydl.c] (http://starynkevitch.net/Basile/manydl.c) способен сделать много тысяч тысяч 'dlopen' (и каждый из них использует более одного сегмента mmap-ed). –
Вы не можете выделить физически смежную память в пространстве пользователя. Потому что в ящике User space всегда выделяет память из зоны highmem. Но если вы пишете модуль ядра или код системного пространства, вы можете использовать _get_page() или _get_pages().
Функция posix_memalign() выделяет байты размера и помещает адрес выделенной памяти в * memptr. Адрес выделенной памяти будет кратным выравниванию, который должен быть мощностью двух и кратным sizeof (void *). Если размер равен 0, то значение, помещенное в * memptr, равно NULL или уникальное значение указателя, которое впоследствии может быть успешно передано на бесплатное (3). – LtWorf
- 1. Как выделить и освободить выровненную память в C
- 2. возвращает выровненную память с новым?
- 3. Как указатели выделить память
- 4. Как выделить память C
- 5. Как выделить память структуры?
- 6. Как выделить память указателям
- 7. Удалить выровненную память из другого потока
- 8. Аллокатор, который выделяет 32-байтную выровненную память
- 9. как выделить память структурной переменной
- 10. Как выделить память в java?
- 11. Как и где выделить память?
- 12. Как JVM выделить эту память
- 13. Как выделить память для матрицы?
- 14. Выделить память (сборка x64)
- 15. Выделить пользовательскую память
- 16. Не удается выделить память
- 17. выделить память в C
- 18. Выделить память для вектора
- 19. Выделить постоянную память
- 20. Невозможно выделить память
- 21. ММАП: Невозможно выделить память
- 22. Выделить память для списка
- 23. Выделить память в JavaScript
- 24. виртуальная память исчерпана: не удается выделить память
- 25. Errno :: ENOMEM: Не удается выделить память - cat
- 26. Выделить память во время выполнения
- 27. Iphone Выделить память в initWithNibName
- 28. выделить память для многомерного массива
- 29. Невозможно выделить общую память CUDA
- 30. Единорог не может выделить память
Возможно, вы имеете в виду 'aligned' not' aliened' –
Возможно, вам стоит [прочитать этот вопрос] (http://stackoverflow.com/questions/227897/solve-the-memory-alignment-in-c-interview-question -that-stumped-me/227900 # 227900), что касается очень сходной проблемы, хотя и для общего (не специфичного для Linux) домена. – Jubatian