Goo*_*vie 3 c linux paging valgrind mmap
我正在参加我大学的操作系统课程,我们给出的任务之一是使用mmap实现简单的malloc.现在,我得到它的工作,我试图使用valgrind来检测任何错误.无论是否释放内存,valgrind都没有看到任何内存泄漏.作为示例,请考虑以下C代码:
int main()
{
int psize = getpagesize(),i;
int *ptr = mmap(NULL, psize, PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
for(i = 0; i < psize/4; i++) ptr[i] = i;
for(i = 0; i < psize/4; i++) printf("%d\n", ptr[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
让我们用gcc编译它,并使用valgrind.这是valgrind返回的内容:
==17841== Memcheck, a memory error detector
==17841== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==17841== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==17841== Command: ./test
==17841==
------------ printing numbers from 0 to 1023
==17841==
==17841== HEAP SUMMARY:
==17841== in use at exit: 0 bytes in 0 blocks
==17841== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==17841==
==17841== All heap blocks were freed -- no leaks are possible
==17841==
==17841== For counts of detected and suppressed errors, rerun with: -v
==17841== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
Run Code Online (Sandbox Code Playgroud)
这是意料之外的事情,我们通常希望在退出程序之前取消映射页面以查看此类消息.
起初我认为页面可能会被懒惰地映射,这就是为什么我强迫在页面上执行某些操作,例如更改值和打印它们,但我们可以看到这不是问题.
这可能与valgrind或我对mmap和valgrind如何工作的理解有关.
mmap不会增加堆大小
堆与从中获取的内存是分开的mmap.Unix进程获取内存有两种基本方法:
brk(2)/ sbrk(2)- 这是堆mmap- 这些独立于堆
这可能与valgrind或我对mmap和valgrind如何工作的理解有关.
阅读memcheck手册可能会有所帮助,尤其是关于自定义分配器的部分.它的要点是,为了泄漏检查的目的,mmapvalgrind看不到分配的块.它拦截只malloc,calloc,free,new等.
令人困惑的是,一些被mmap分配的区域被跟踪valgrind!例如,当malloc选择mmap内存而不是使用堆时会发生这种情况.