c/c++语言开发共享malloc:匿名映射和魔术区域

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

char *ptr = NULL; printf("Allocating 300KBn"); ptr = malloc (300*1024); printf("Allocated at %p.. sleepingn", ptr); sleep (30); free (ptr); printf("Freed... sleepingn"); sleep (30); 

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

 00007f73b1e57000 316K rw--- [ anon ] 

而程序o / p说:

 Allocated at 0x7f73b1e57010.. sleeping 

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

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

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

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

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

      "Virtual Mapping Size (Kbytes) The virtual size in kilobytes of each mapping." 

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

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

      int main(int argc, char **argv) { char *timeBuf = (char *)malloc(100); printf("allocated address is %pn",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

    所以简单地回答你的问题不是这与魔术领域无关。

      以上就是c/c++开发分享malloc:匿名映射和魔术区域相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/523168.html

      (0)
      上一篇 2020年12月11日
      下一篇 2020年12月11日

      精彩推荐