1

Windows の VirtualAlloc に似た Linux でメモリを割り当てる方法を探していました。要件は次のとおりです。

  1. 割り当てるメモリ ブロックのサイズは 2^16 です。
  2. メモリ ブロックのアドレスが 0x0000ffff より大きい
  3. メモリ ブロックのアドレスは、最後の 16 ビットがゼロでなければなりません。

Windows では、アプリケーション アドレス (lpMinimumApplicationAddress) の下限のため、(2) 明らかな権利があります。(1)、(2)、システムルールから、(3)も達成できました。

助けてくれてありがとう。

4

3 に答える 3

1

試すmmap(..., MAP_ANONYMOUS, ...)

ページ境界に合わせたアドレスが得られます。それよりも厳密なアラインメントを行うには、おそらく余分に割り当てて、正しくアラインされているよりも大きなブロック内のアドレスを選択する必要があります。

于 2011-05-22T03:44:45.723 に答える
0

あなたがしたいposix_memalign()

void *ptr;
int memalign_err = posix_memalign(&ptr, 1UL << 16, 1UL << 16);

if (memalign_err) {
    fprintf(stderr, "posix_memalign: %s\n", strerror(memalign_err));
} else {
    /* ptr is valid */
}

1 つ目1UL << 16は配置、2 つ目はサイズです。

ブロックの処理が完了したら、それを に渡しますfree()

于 2011-05-23T06:15:47.590 に答える
0

特定のアドレスを mmap に要求できます。一部の特定のアドレスでは失敗する場合がありますが、一般的には機能します

于 2011-05-22T03:51:53.957 に答える