如何分配页面大小对齐的内存?

Chi*_*nna 7 c linux memory memory-management

我需要分配应该页面大小对齐的内存.我需要将此内存传递给ASM计算所有数据块的xor 的代码.我需要这样做malloc().

unw*_*ind 10

您应该使用这些功能.

如果不能,无论出于何种原因,通常这样做的方法是将块大小添加到分配大小,然后使用整数数学技巧来舍入指针.

像这样的东西:

/* Note that alignment must be a power of two. */
void * allocate_aligned(size_t size, size_t alignment)
{
  const size_t mask = alignment - 1;
  const uintptr_t mem = (uintptr_t) malloc(size + alignment);
  return (void *) ((mem + mask) & ~mask);
}
Run Code Online (Sandbox Code Playgroud)

这还没有经过深刻的测试,但你明白了.

请注意,以后找不到适当free()的内存指针是不可能的.要解决这个问题,我们必须添加一些额外的机制:

typedef struct {
  void *aligned;
} AlignedMemory;

AlignedMemory * allocate_aligned2(size_t size, size_t alignment)
{
  const size_t mask = alignment - 1;
  AlignedMemory *am = malloc(sizeof *am + size + alignment);
  am->aligned = (void *) ((((uintptr_t) (am + 1)) + mask) & ~mask);
  return am;
}
Run Code Online (Sandbox Code Playgroud)

这会稍微包装指针技巧,并为您提供一个指针free(),但您需要取消引用aligned指针才能获得正确对齐的指针.


fed*_*024 7

我认为只有malloc才有可能.你可以使用memalign():

char *data = memalign(PAGESIZE, alloc_size);
Run Code Online (Sandbox Code Playgroud)

PAGESIZE页面大小在哪里,是alloc_size要分配的内存大小.

可以找到页面的大小sysconf(_SC_PAGESIZE).


Sun*_*lly 7

使用posix_memalign获取已对齐的内存.

注:valloc&memalign都被废弃.