dlmalloc';s mspace_malloc返回奇怪的地址
[我已经解决了这个问题--请参阅下面我最后的评论。] 在我的应用程序中,我需要基于Doug Lea的dlmalloc使用我自己的特殊malloc:我映射一个匿名文件(使用mmap),从映射文件的一部分创建一个mspace,并将mspace传递给mspace_malloc。我发现mspace_malloc返回的一些地址不在映射文件的范围内——尽管,据我所知,进程可以很好地写入和读取malloc的内存。为什么我会遇到这种行为,我该怎么做才能强制mspace_malloc返回mspace范围内的地址dlmalloc';s mspace_malloc返回奇怪的地址,c,malloc,systems-programming,C,Malloc,Systems Programming,[我已经解决了这个问题--请参阅下面我最后的评论。] 在我的应用程序中,我需要基于Doug Lea的dlmalloc使用我自己的特殊malloc:我映射一个匿名文件(使用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;
}
dl_malloc.c内的/**/
#仅定义_MSPACES 1
#定义MSPACES 1
空*堆;
离堆长度;
mspace-ms;
void init(大小\u t大小){
heap=mmap(NULL,size,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0);
if(heap==MAP\u失败){
perror(“初始:mmap”);
退出(退出失败);
}
堆长度=大小;
ms=create_mspace(堆,大小,0);
mspace\u track\u大块(ms,1);
}
void*my\u malloc(大小\u t字节){
返回mspace_malloc(堆,字节);
}
/************************/
/*应用中*/
#包括
#包括
#定义堆大小0x10000//32页
#定义第2行
#定义COLS 4096
外部无效初始(无效);
extern void*我的malloc(大小为字节);
外部无效*堆;
外部关闭堆长度;
内部主(空){
init(堆大小);
int**matrix=(int**)my_malloc(sizeof(int*)*行);
int i;
对于(i=0;i
当我运行这个程序时(好吧,上面是一个简化,但不是很多),我看到分配给矩阵的地址在堆的打印范围内,但两行的两个地址远远低于下限——低于下限超过0x100000000!但我似乎能够读取和写入矩阵。最后一点我感到困惑并想理解,但更紧迫的问题是我需要做一些事情来确保我的_malloc返回的所有地址都在堆边界内,因为我的应用程序的其他部分需要这样做
顺便说一句,请注意,我不需要锁定我的调用来创建_mspace,因为我在这个程序中只使用了一个线程。无论如何,我尝试将这个参数设置为1,但结果没有什么不同
谢谢!Eureka(哈哈哈)!上面的简化示例和给定的常量将正常工作,返回的地址将在范围内。但是,如果您在相对于原始mspace太大的大小上调用my_malloc,malloc将调用mmap(除非您明确禁用此功能)。我看到的地址仅仅是那些调用mmap后返回的地址。因此,这个谜团的解决方案非常简单。我将发布此消息,以防其他人碰巧遇到此问题并忘记malloc对mmap的调用。您的
main
函数不会调用my_malloc()
没问题。只是一个输入错误:s/malloc/my_malloc/(请)。谢谢。我们已经更正了帖子。问题本身仍然存在。