6

我正在分析虚拟页面之间分配的影响,同时创建一个维度为 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);}
    }
4

2 回答 2

5

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

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

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

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

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

假设这一次, malloc 返回0xDEAD000F

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

如果您不想做所有这些凌乱的指针算术,我认为您可以使用posix_memalign. 在这里查看。如果您在不同的平台上,我相信有类似的内存对齐服务可用。

于 2013-09-26T05:19:35.883 回答
3

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

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

于 2013-09-26T05:25:06.930 回答