を返す[私はこの問題を解決してきました - 以下の私の最後のコメントを参照してください。]dlmallocのmspace_mallocは奇妙なアドレス
私のアプリケーションでは、私はダグ・リーのdlmallocに基づいて、私自身の特別なmalloc関数を使用する必要があります。私は、マップ匿名ファイル(mmapを使用)を作成し、マップされたファイルの一部からmspaceを作成し、mspace_mallocにmspaceを渡します。私はmspace_mallocが返すアドレスのいくつかがマップされたファイルの境界内にないことを発見しています - 私が知る限り、プロセスはmallocのメモリに書き込みと読み取りを行うことができます。 mspace_mallocがmspaceの範囲内のアドレスを返すように強制するにはどうしたらよいですか?私は(良く、上記単純化であるが、あまりによって)このプログラムを実行すると、Iは行列に割り当てられたアドレスは、ヒープのために印刷された範囲内であるがために2つのアドレスことがわかり
/* 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;
}
2行は非常に遠いですの下に - それより下の0x100000000以上!それでも、私はマトリックスに読み書きすることができるようです。私が困惑していることを理解したいと思う最後の点ですが、もっと緊急な問題は、アプリケーションの他の部分がこれを必要とするため、my_mallocが返すすべてのアドレスがヒープ境界内にあることを確認する必要があることです。
私はこのプログラムで1つのスレッドしか使用していないため、create_mspaceへの呼び出しをロックする必要はありません。とにかく、この引数を1に設定しようとしましたが、結果に違いは見られませんでした。
ありがとうございます!
あなたの 'main'関数は' my_malloc() 'を全く呼び出さない。 – caf
入力エラーです:s/malloc/my_malloc /(please)。ありがとう。 –
転記を修正しました。問題自体は残っています。 –