2011-12-16 1 views
3

[Я решил эту проблему - пожалуйста, смотрите мой последний комментарий ниже.]dlmalloc возвращает странные адреса

В моем приложении, я должен использовать свой собственный специальный таНос, основанный на dlmalloc Даг Ли: Я карта анонимный файл (используя mmap), создайте mspace из части отображаемого файла и передайте mspace в mspace_malloc. Я нахожу, что некоторые из адресов, которые возвращает mspace_malloc, не находятся в пределах отображаемого файла, хотя, насколько я могу судить, процесс может записывать и считывать из памяти malloc'а просто отлично. Почему я сталкиваюсь с этим поведением и что могу сделать, чтобы заставить mspace_malloc возвращать адрес в пределах диапазона mspace?

/* Inside dl_malloc.c */ 

#define ONLY_MSPACES 1 
#define MSPACES 1 

void * heap; 
off_t heap_length; 
mspace ms; 

void init(size_t size) { 
    heap = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 
    if (heap == MAP_FAILED) { 
    perror("init: mmap"); 
    exit(EXIT_FAILURE); 
    } 
    heap_length = size; 
    ms = create_mspace(heap, size, 0); 
    mspace_track_large_chunks(ms, 1); 
} 

void * my_malloc(size_t bytes) { 
    return mspace_malloc(heap, bytes); 
} 
/************************/ 


/* In application */ 
#include <stdio.h> 
#include <stdlib.h> 
#define HEAP_SIZE 0x10000 // 32 pages 
#define ROWS 2 
#define COLS 4096 

extern void init(void); 
extern void * my_malloc(size_t bytes); 

extern void * heap; 
extern off_t heap_length; 

int main(void) { 
    init(HEAP_SIZE); 
    int ** matrix = (int **)my_malloc(sizeof(int *) * ROWS); 
    int i; 
    for (i = 0; i < ROWS; ++i) 
    matrix[i] = (int *)my_malloc(sizeof(int) * COLS); 

    printf("Heap bounds: %lx to %lx\n", 
    (off_t)heap, (off_t)heap + heap_length); 
    printf("Matrix: %p ", matrix; 
    for (i = 0; i < ROWS; ++i) 
    printf("Matrix[%d]: %p ", i, matrix[i]"); 
    printf("\n"); 

    return EXIT_SUCCESS; 
} 

Когда я запускаю эту программу (ну, выше, является упрощением, но не очень), я вижу, что адрес, назначенные матрицы в пределах отпечатанных для кучи, но два адреса две строки очень далеко ниже нижняя граница - более 0x100000000 ниже этого! И все же я, похоже, умею читать и писать в матрицу. Этот последний момент, который я нахожу озадачивающим и хотел бы понять, но более срочная проблема заключается в том, что мне нужно что-то сделать, чтобы убедиться, что все адреса, возвращаемые my_malloc, находятся в границах кучи, потому что для этого нужны другие части моего приложения.

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

Спасибо!

+0

Ваша функция 'main' не вызывает' my_malloc() 'вообще. – caf

+0

Только ошибка ввода: s/malloc/my_malloc/(пожалуйста). Благодарю. –

+0

Исправили проводку. Сама проблема остается. –

ответ

3

Eureka (hahaha)! Вышеприведенный упрощенный пример с заданными константами будет работать правильно, а возвращаемые адреса будут находиться в пределах диапазона. Однако, если вы вызываете my_malloc при слишком больших размерах относительно исходного mspace, malloc вызовет mmap (если вы явно не отключите это). Адреса, которые я видел, были просто те, которые были возвращены в результате этих вызовов в mmap. Поэтому решение этой тайны оказалось довольно простым. Я оставляю это в том случае, если другие сталкиваются с этой проблемой и забывают о вызовах malloc в mmap.