2011-12-16 23 views
3

を返す[私はこの問題を解決してきました - 以下の私の最後のコメントを参照してください。]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に設定しようとしましたが、結果に違いは見られませんでした。

ありがとうございます!

+0

あなたの 'main'関数は' my_malloc() 'を全く呼び出さない。 – caf

+0

入力エラーです:s/malloc/my_malloc /(please)。ありがとう。 –

+0

転記を修正しました。問題自体は残っています。 –

答えて

3

ユーレカ(ハハハ)!上記の単純化された例は、与えられた定数で正しく動作し、返されるアドレスは範囲内になります。しかし、元のmspaceに比べて大きすぎるサイズでmy_mallocを呼び出すと、mallocはmmapを呼び出します(これを明示的に無効にしない限り)。私が見ていたアドレスは、mmapへの呼び出しの結果として返されたものでした。だから、この謎に対する解決策はかなり単純であることが判明しました。他の人がこの問題に遭遇し、mmapへのmallocの呼び出しを忘れると、私はこれを投稿したままにしておきます。