gpt4 book ai didi

c - dlmalloc 的 mspace_malloc 返回奇怪的地址

转载 作者:行者123 更新时间:2023-12-02 06:18:38 24 4
gpt4 key购买 nike

[我已经解决了这个问题——请参阅下面我的最后一条评论。]

在我的应用程序中,我需要使用自己的特殊 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,但结果没有发现任何差异。

谢谢!

最佳答案

Eureka (哈哈哈)!上面的简化示例,使用给定的常量,将正常工作,并且返回的地址将在范围内。但是,如果您在相对于原始 mspace 太大的大小上调用 my_malloc,malloc 将调用 mmap(除非您明确禁用此功能)。我看到的地址只是由于调用 mmap 而返回的地址。所以这个谜团的解决方案其实相当简单。我将发布此帖子,以防其他人碰巧遇到此问题并忘记 malloc 对 mmap 的调用。

关于c - dlmalloc 的 mspace_malloc 返回奇怪的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8540773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com