[英]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获取已对齐的内存。
注意: valloc
和memalign
都已过时。
使用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.