我只是在摆弄内存映射,想查看用户空间虚拟内存区域映射。写了一些类似的行
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
的输出。
为了证明这一点,我用这个代码做了一个快速测试
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
简而言之,回答你的问题不,这与魔法领域无关。