2011-12-16 192 views
3

[我已經解決了這個問題 - 請查看下面我最後的評論]dlmalloc的mspace_malloc返回奇怪的地址

在我的應用程序,我需要用我自己的特殊的malloc,基於Doug Lea的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 2011-12-16 22:21:34

回答

3

尤里卡(hahaha)!上面的簡單例子,給定的常量,將正常工作,返回的地址將在範圍內。但是,如果您調用my_malloc的大小相對於原始mspace太大,malloc將調用mmap(除非您明確禁用此選項)。我看到的地址僅僅是那些對mmap的調用而返回的地址。所以這個謎題的解決方案變得相當簡單。如果其他人碰巧遇到此問題,並且忘記了malloc對mmap的調用,我會將其發佈。