2015-01-31 3 views
1

Я посещаю курс операционной системы в своем университете, одной из задач, которые нам были даны, является реализация простого malloc с помощью mmap. Теперь, когда я получил работу, я попытался использовать valgrind для обнаружения ошибок. И ясность освобождения памяти или нет, valgrind не видит утечек памяти. В качестве примера рассмотрим следующий код C:Mmap и valgrind, mmap не увеличивает размер кучи

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; 
} 

позволяет скомпилировать его с помощью 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) 

Это что-то неожиданное, мы обычно хотим страниц, чтобы быть некартированными перед тем exitting программы, чтобы увидеть такое сообщение.

Сначала я думал, что страницы могут отображаться лениво, поэтому я заставил выполнять некоторые вещи на этой странице, как изменение значений, и их печать, но, как мы видим, это не проблема.

Это, вероятно, что-то не так с valgrind или мое понимание того, как работают mmap и valgrind.

+0

'valgrind' связан с системой' malloc' (или предоставляет свои собственные). Я не уверен, что он может использовать ваш собственный 'malloc', если вы не предоставите определенные перехваты в своей реализации' malloc'! –

ответ

5

ММАП не увеличивает размер кучи

Куча отделена от памяти, полученной из mmap. Есть 2 основных способа процесс Unix получает память:

  • за счет увеличения «разрыв» с помощью brk(2)/sbrk(2) - это куча
  • отображением в память при помощи mmap - это не зависит от кучи

Anatomy of a Program in Memory имеет хорошую картину:

Anatomy of a Program in Memory

Это, вероятно, что-то не так с valgrind или моим пониманием , как работает mmap и valgrind.

Чтение memcheck manual может помочь, особенно раздел о пользовательских распределителях. Суть его в том, что для целей проверок утечки mmap -распределенные куски невидимы для valgrind. Он перехватывает только malloc, calloc, free, new и т.д.


Смутно некоторые mmap -allocated области являются отслеживаются valgrind! Это происходит, например, когда malloc выбирает память mmap вместо использования кучи.