[我已經解決了這個問題 - 請查看下面我最後的評論]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,但是我看到結果沒有任何區別。
謝謝!
您的`main`函數完全不會調用`my_malloc()`。 – caf 2011-12-16 22:21:34