繁体   English   中英

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

[英]How allocate memory which is page size aligned?

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

您应该使用这些功能。

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

像这样的东西:

/* 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);
}

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

请注意,以后找出正确指向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;
}

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

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

char *data = memalign(PAGESIZE, alloc_size);

其中PAGESIZE是页面的大小, alloc_size是将分配的内存大小。

可以使用sysconf(_SC_PAGESIZE)找到页面的大小。

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

注意: vallocmemalign都已过时。

使用valloc而不是malloc -它具有相同签名malloc ,但它分配页对齐的内存。 请注意,您仍然使用free()随后free()内存。

另请注意, valloc在技​​术上已经过时,因此请考虑使用posix_memalign ,尽管这不是malloc的简单替代品,因为它具有非常不同的函数签名。

//面向Linux,//看看我的诡计来安排自己

我刚写了一个程序,它必须分配硬件页面对齐的内存; 这里是包含main()函数的程序

main()函数调用一个Func_a()函数,该函数调用一个Func_b()函数调用前面提到的Func_a()函数,依此类推......并且没有停止条件,因此无限期地烧掉程序堆栈,最终导致SIGSEGV。

这应该对你有所帮助:

#include "Func_A.h"
#include "Func_B.h"


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define STACK_SIZE (1024 * 1024)

int main(void)
{
  // Allocate a 2nd stack for the SIG_SEGV signal handler
  long pgsz = sysconf(_SC_PAGESIZE);
  printf("Page size is %ld\n", pgsz);

  long stacksize = STACK_SIZE;

  long sigstkpages = (STACK_SIZE + (pgsz - 1) ) / pgsz;

  void* newstack = calloc(sigstkpages, pgsz);
  if (NULL == newstack)
  {
    perror("calloc()\n");
    exit(2);
  }
  newstack = (void*) (((((long) newstack) + (pgsz - 1)) / pgsz) * pgsz);
  void* newstackhigh = (void*) (((long) newstack) + (stacksize - 1));
  stacksize = (newstackhigh - newstack) + 1;
  printf("Stack size is %ld\n", stacksize);

  printf("New Stack spans %p-%p  (%ld pages)\n", newstack, newstackhigh, sigstkpages);

  a();
}

它的输出是:

页面大小是4096堆栈大小是1048576新堆栈跨度0x7f28435cd000-0x7f28436ccfff(256页)Erreur de segmentation(core dumped)

预计coredump在这里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM