mspace_malloc dlmalloc возвращает странные адреса - PullRequest
3 голосов
/ 17 декабря 2011

[Я решил эту проблему - см. Мой последний комментарий ниже.]

В моем приложении мне нужно использовать свой собственный особый malloc, основанный на 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, но я не увидел разницы в результатах.

Спасибо!

1 Ответ

3 голосов
/ 18 декабря 2011

Эврика (хахаха)!Упомянутый выше упрощенный пример с данными константами будет работать правильно, а возвращаемые адреса будут в пределах диапазона.Однако если вы вызовете my_malloc для размеров, которые слишком велики по сравнению с исходным mspace, malloc вызовет mmap (если вы явно не отключите это).Адреса, которые я видел, были просто теми, которые были возвращены в результате этих вызовов в mmap.Так что решение этой загадки оказалось довольно простым.Я оставляю это сообщение на всякий случай, если другие столкнутся с этой проблемой и забудут о вызовах malloc в mmap.

...