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 の制限を超える可能性があります)。次に、その特定の範囲のページ キャッシュを実装する必要があります。それが不可能な場合、そのための最善の解決策は何ですか?