[我已经解决了这个问题 - 请查看下面我最后的评论]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