use*_*947 5 c arrays malloc virtualization paging
在创建尺寸为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);}
}
Run Code Online (Sandbox Code Playgroud)
如果您知道页面大小,则可以分配足够大小的内存部分,这将保证新分配的内存的某些部分在页面边界上对齐。您需要分配至少 8192 字节的内存,以保证 4096 字节在 4096 字节边界上对齐。
例如,如果您调用malloc并且它返回与 (4097) 对齐的偏移量0xDEAD1001,则您将需要转到内存地址处的下一页0xDEAD2000以获得 4096 字节对齐。然后,您将需要至少 4096 字节的连续空间。因此,需要分配8192字节。
malloc要获得 4k 字节对齐的内存位置,您可以将 4095 添加到and mask 最后 3 个字节返回的地址。
void *mem = malloc(8192);
void *ptr = ((void *)mem+0x0FFF) & ~ (void *)0x0FFF;
Run Code Online (Sandbox Code Playgroud)
编辑:确保保留指向分配的原始内存的指针,以便稍后可以转身并使用它来调用free().
假设这一次,malloc返回了0xDEAD000F。
0xDEAD000F + 0x0000FFF = 0xDEAD100E
0xDEAD100E & ~0x0000FFF = 0xDEAD1000
Run Code Online (Sandbox Code Playgroud)
如果您不想执行所有这些混乱的指针算术,我认为您可以使用posix_memalign. 在这里查看一下。如果您使用不同的平台,我确信有类似的内存对齐服务可用。