gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:00:45 26 4
gpt4 key购买 nike

我在创建维度为 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);}
}

最佳答案

如果您知道您的页面大小,您可以分配足够大小的内存部分,以保证新分配的内存的某些部分在页面边界上对齐。您将需要分配至少 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。看看here .如果您在不同的平台上,我相信也有类似的内存对齐服务可用。

关于c - 如何从 C 中的新虚拟页分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19018517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com