64ビットでhighmemなしで各プロセスに対して隔離されたアドレス空間を作成するには?

64ビットでhighmemなしで各プロセスに対して隔離されたアドレス空間を作成するには?

私の質問はおそらく愚かなようです。しかし、数回検索した後でも、64ビットアーキテクチャではhighmemが不要な理由をまだ理解していません。

私が検索した結果、x64ビットにはhighmemはありません。つまり、すべての物理メモリが仮想メモリに直接マップされます。

ただし、セキュリティを含むさまざまな理由で、すべてのプロセスは0x00000からsthまで一意のアドレス空間を持ちます。

すべての物理メモリがすでに各仮想メモリに直接マッピングされている場合は、物理メモリと仮想メモリのマッピングを変更せずに、各プロセスごとに独立した孤立したアドレス空間を作成できますか?

ベストアンサー1

物理メモリと仮想メモリのマッピングを変更せずに、プロセスごとに別々の隔離されたアドレス空間をどのように作成できますか?

これが仮想メモリが許可するものとカーネルがすることです。各プロセスには独自の別々の仮想メモリマップがあります。これにより、あるプロセスのページ1000はメモリの物理ページXを指し、他のプロセスのページ1000はメモリの物理ページYを指し、他のプロセスのページ1000は置き換えられる。コンテキストがあるプロセスから別のプロセスに切り替えられるたびに、仮想メモリマップは新しいプロセスに合わせて変更されます。

高度なメモリこれは、カーネルが仮想アドレス空間(32ビットx86、通常の3G / 1Gパーティションで最も高いアドレス空間GB)に独自の物理メモリマップを保持するために必要です。カーネルは、現在のプロセスの仮想メモリにマップされているかどうかに関係なく、物理メモリのすべてのページにアクセスできる必要があります。これが直接の物理メモリマッピングが有用な理由です。 32ビットシステムでは、この直接マッピングのサイズは、潜在的な物理メモリサイズと比較して制限されています(32ビットx86で最大約896MiB)。この領域外の物理メモリにアクセスするには、カーネルがページを動的にマッピングする必要があります。 64ビットシステムでは、アドレス空間のカーネル側に十分なスペースがあります。最大64TiBの物理メモリを直接マッピングこれはほとんどのシステムで十分です(これが不十分なシステムでは、5レベルのページテーブルを使用して最大32PiBの物理メモリマッピングを可能にします)。

また、見ることができます最近のLWN記事これには、高メモリリフレッシュが含まれます。

おすすめ記事