malloc:匿名映射和魔术区域

时间:2015-02-11 18:07:13

标签: c memory-management malloc

我只是在摆弄内存映射,想要查看用户空间虚拟内存区域映射。写了一些像

这样的行
char *ptr = NULL;
printf("Allocating 300KB\n");
ptr = malloc (300*1024);    
printf("Allocated at %p.. sleeping\n", ptr);
sleep (30);
free (ptr);
printf("Freed... sleeping\n");
sleep (30);    

在运行程序时,pid上的pmap将分配的区域显示为:

00007f73b1e57000    316K rw---    [ anon ]

虽然程序o / p说:

Allocated at 0x7f73b1e57010.. sleeping

对于我们称之为魔法区域的分配,这是16KB的额外分配吗? 在内核中,相应的vm_area_struct将保持程序可见范围或魔法区域开始的整个范围?

2 个答案:

答案 0 :(得分:1)

差异不是16KB,而是16字节。哪个最可能对应于malloc必须在内存块之前分配的头,以便将块链接在一起等等。

答案 1 :(得分:0)

从任何具有内存管理单元的操作系统开始,使用MMU管理其所有内存(堆,代码空间,堆栈I / O内存),所有内存都存在于虚拟空间中,并使用页表要将虚拟地址转换为物理地址,映射到物理内存取决于操作系统

malloc将使用sbrk调用返回指向堆内存的指针,这反过来将增加堆大小,访问此内存时的MMU将分配实际的物理页面并映射到虚拟地址。

根据pmap手册页,输出显示的不是malloc分配的内存块大小,而是虚拟映射大小。

 "Virtual Mapping Size (Kbytes)

     The virtual size in kilobytes of each mapping."

快速实验,检查malloc返回的内存的块大小是否应该等于pmap的输出。

为证明这一点,我使用此代码进行了快速测试

 int main(int argc, char **argv)
 {
      char *timeBuf = (char *)malloc(100);
      printf("allocated address is %p\n",timeBuf);
      int i;
      for(i =0 ;i < atoi(argv[1]);i++)
      {              
      }
      return 0;
}

pmap输出是:

`0000000001338000    132K rw---    [ anon ]`

来自malloc的返回指针:

allocated address is 0x1338010

我认为16个字节是由malloc保存的,用于保存在其前面的答案中提到的标题中。您可以在程序中分配的内存只有100个字节,但pmap虚拟内存大小为132K

所以简单地回答你的问题,这与魔法区无关。