[Я решил эту проблему - пожалуйста, смотрите мой последний комментарий ниже.]dlmalloc возвращает странные адреса
В моем приложении, я должен использовать свой собственный специальный таНос, основанный на 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
Только ошибка ввода: s/malloc/my_malloc/(пожалуйста). Благодарю. –
Исправили проводку. Сама проблема остается. –