0

TLB を手動で更新して、新しい仮想メモリ ページをカーネル空間内の特定の物理ページ セットに変換しようとしています。do_page_faultロード/ストア命令が特定の仮想アドレス範囲 (まだ割り当てられていない) で発生するたびに、事前に TLB にページ テーブル エントリを配置するように、これを実行したいと考えています。翻訳は簡単です。たとえば、次のコードが適切に機能することを望みます。

int d;
int *pd = (int*)(&d + 0xffff000000000000);
*pd = 25;                  // A page fault occurs and TLB is updated
printk("d = %d\n", *pd);   // No page fault (TLB is already up-to-date)

したがって、翻訳は による単なる減算0xffff000000000000です。TLB 更新機能を実装する最良の方法は何ですか?

編集:これを行う主な理由は、カーネルに大きな仮想メモリ空​​間を予約できるようにするためです。カーネル内の特定のアドレス範囲でページ フォールトを処理したいだけです。そのため、最初にアドレス範囲を予約する必要があります (100TB の制限を超える可能性があります)。次に、その特定の範囲のページ キャッシュを実装する必要があります。それが不可能な場合、そのための最善の解決策は何ですか?

4

0 に答える 0