如何从C中的新虚拟页面分配内存?

时间:2013-09-26 02:50:23

标签: c arrays malloc paging virtualization

我正在分析在创建维度PageSize x PageSize的二维数组时跨虚拟页面的分配效果。我的机器的页面大小是4096.我有一个4096个整数指针(列)的数组,指向4096个整数(行)。

我想在新的虚拟页面上开始分配第一个整数指针。如何识别当前内存位置是否为新页面? 有一次,我已经确定了,我相信我可以写一些垃圾值并将指针移动到一个新的虚拟页面。 这是我分配数组的方式。

    array = malloc(ncolumns * sizeof(int *));
    for(j = 0; j < ncolumns; j++)
    {
        array[j] = malloc(nrows * sizeof(int));
        if(array[j] == NULL)
        { reportError(8);}
    }

2 个答案:

答案 0 :(得分:4)

如果您知道页面大小,则可以分配足够大小的内存部分,以保证新分配的内存的某些部分在页面边界上对齐。您将需要分配至少8192字节的内存,以保证在4096字节边界上对齐4096字节。

例如,如果您调用malloc并返回一个与0xDEAD1001(4097)对齐的偏移量,则需要转到内存地址0xDEAD2000的下一页达到4096字节对齐。然后,您将需要至少4096个字节的连续空间。因此,需要分配8192个字节。

要获得4k字节对齐的内存位置,可以将{40}添加到malloc返回的地址,并屏蔽最后3个字节。

void *mem = malloc(8192);
void *ptr = ((void *)mem+0x0FFF) & ~ (void *)0x0FFF;

编辑确保保留指向所分配的原始内存的指针,以便稍后转身并使用它来调用free()

假设这次,malloc返回0xDEAD000F

0xDEAD000F + 0x0000FFF = 0xDEAD100E 
0xDEAD100E & ~0x0000FFF = 0xDEAD1000

如果你不想做所有这些凌乱的指针算法,我想你可以使用posix_memalign。看看here。如果您使用的是其他平台,我相信可以使用类似的内存对齐服务。

答案 1 :(得分:2)

仅使用C语言的功能,您无法在页面边界上对齐您的分配(即从malloc返回的内容)。您的示例代码只是分配指向数组的指针数组。它们的位置可以位于虚拟地址空间中的任何位置。确切的位置取决于编译器/库/ OS /等。

操作系统通常具有允许执行此类操作的功能。在Windows上,您可以使用VirtualAlloc功能。