dlmalloc的mspace_malloc返回奇怪的地址

时间:2011-12-16 22:15:02

标签: c malloc systems-programming

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

在我的应用程序中,我需要使用我自己的特殊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返回的所有地址都在堆边界内,因为我的应用程序的其他部分需要这个。 / p> 顺便说一句,请注意我不需要锁定对create_mspace的调用,因为我在这个程序中只使用了一个线程。无论如何,我尝试将此参数设置为1,但我发现结果没有差异。

谢谢!

1 个答案:

答案 0 :(得分:3)

尤里卡(哈哈哈)!上面的简化示例,使用给定的常量,将正常工作,返回的地址将在范围内。但是,如果在相对于原始mspace的大小上调用my_malloc,则malloc将调用mmap(除非您明确禁用它)。我看到的地址仅仅是那些对mmap的调用返回的地址。因此,这个谜团的解决方案变得相当简单。我将其留下,以防其他人碰巧碰到这个问题并忘记了malloc对mmap的调用。