ページテーブルを変更して、メモリページを移動できますか?

StackOverflow https://stackoverflow.com/questions/2679065

  •  30-09-2019
  •  | 
  •  

質問

ページテーブルのみを変更して実際にデータを移動しないことで、2つのメモリページの内容を交換することは可能ですか?

動機は、密なマトリックス転置です。データがページサイズごとにブロックされた場合、ページ内のデータを転置(キャッシュに適合)し、ページを交換してブロックを最終的な場所に移動できます。大きなマトリックスには多くのページが移動するため、TLBを洗い流すことで問題が発生しないことを願っています。

役に立ちましたか?

解決

メモリマッピングされたファイルがトリックを行う可能性があると思いますが、自分でこれを試したことは一度もないと思います。使用する mmap MAP_Anonymousを使用して、純粋な仮想アドレスをマップします(物理ファイルのバッキングはありません)。次に、ゼロコピーセマンティクスを取得するVAのさまざまな領域に「ファイル」を再マッピングできます。 Windowsで使用します MapViewOffile createmapoffile(invalid_handle_value、...)を使用して作成されたファイルマッピングハンドルを使用すると、ntよりも注意してください。 目標 あなたの再マッピングの(つまり、新しくマッピングされたVAアドレスは 出力 関数呼び出しの)、およびLinuxで、目的のアドレスは ヒント.

これがうまくいかない場合は、おそらくカーネルにメモリマネージャーモジュールを作成する必要がありますが、これは実際のプロジェクトでは実現できません。

他のヒント

#include <stdio.h>
#include <string.h>

#define __USE_GNU
#include <unistd.h>
#include <sys/mman.h>

int main() {
    int PAGE_SIZE = getpagesize();
    char* m = NULL;
    void* temp;

    printf("page size = %d\n", PAGE_SIZE);

    m = (char*)mmap(0, PAGE_SIZE*3, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    temp = m+PAGE_SIZE*2;

    memset(m, '0', PAGE_SIZE);
    memset(m+PAGE_SIZE, '1', PAGE_SIZE);

    printf("before %c %c\n", m[0], m[PAGE_SIZE]);

    mremap(m + PAGE_SIZE, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, temp); 
    mremap(m, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, m+PAGE_SIZE); 
    mremap(temp, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, m); 


    printf("after %c %c\n", m[0], m[PAGE_SIZE]);
    return 0;
}

理論的には、確かに。実際には、i 考える MMAP()を使用して、システムVスタイルの共有メモリブロックをこのように移動できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top