[Я решил эту проблему - см. Мой последний комментарий ниже.]
В моем приложении мне нужно использовать свой собственный особый 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, но я не увидел разницы в результатах.
Спасибо!