アドレス空間に「固定」アドレスを保持する必要がある場合に、仮想メモリシステムをMMUと一緒に管理する方法について疑問に思っています。
たとえば、マシンが起動すると、CPUは固定アドレス(ある種のROMにマップされている)から最初の命令の読み取りを開始し、次に(メモリマップドI/Oシステムが使用されている場合)フェリペラルにアドレスを与えます。次に、OSがブートストラップされます。また、割り込みルーチンなどはメモリ内の「固定」位置にある必要があり、これらはOSによってロードされることも知っています。
このようなプロセスではMMUが無効になり、OSのロード後に有効になると思うかもしれません。
上記のプロセスはシステムアドレス空間を使用しており、ユーザーアドレス空間は実際には仮想化されているにもかかわらず、システムアドレス空間は仮想化されていないと思うかもしれません。
これにより、I/Oペリフェラル、割り込みルーチンなどにアクセスするために同じままの物理アドレスのプールと、MMUによって管理される仮想ユーザースペースが生成されます。この仮想ユーザースペースでは、プロセスが詳細化する必要のあるすべてのデータを詳細化できます。 、OSにI/O周辺機器へのアクセスを要求します。
しかし、私はこれらのことを確信していません。では、MMUが実際に有効になっているのはいつですか?すべてのアドレスを処理しますか、それともユーザースペースのアドレスのみを処理しますか?固定メモリ位置にアクセスするために、システムが実行されている場合でも、一部のアドレスがMMUをバイパスできるというのは本当ですか?それとも私はいくつかの重要な手がかりを逃していますか?
申し訳ありませんが、選択した回答の推測は誤解を招くものであり、最も重要な側面であるページテーブルを介したアドレス変換が省略されています。
PC互換のマシンが起動すると、「リアルモード」で起動するのは事実です。また、x86上の最新の32ビットオペレーティングシステムは、GDTで定義されているセグメント化されたアドレス指定を含む「プロテクトモード」で実行されます。ただし、CR0のPG(ページング)ビット、ビット31を設定することにより、ページテーブルベースのアドレス変換も有効にします。これは、OSの存続期間中はオフになることはありません。
また、最新の32ビットオペレーティングシステムのほとんどでは、GDTベースのセグメント化されたアドレス指定は基本的にバイパスされます。一般的に使用されるすべてのGDTEは、ベースアドレス0、サイズ40億バイトで設定されます。したがって、MMUは、関連するセグメント「ベースアドレス」を命令からの「変位」に追加する動作を実行しますが、これは事実上何もしません。 GDTEはリング0とリング3に使用されますが、すべて同じベースアドレスとサイズを持っています。「特権レベル」フィールド(0と3)はほぼすべて異なります。これにより、ページの「特権アクセス」ビットが有効になります。テーブルエントリが効果的であり、ページごとにカーネルモードまたはユーザー+カーネルモードアクセス用にメモリを保護できます。これはセグメント記述子では不可能であり、粒度が粗すぎます。
X64 CPUでは、セグメント化メカニズムは、ロングモードでは基本的になくなります。もちろん、ページテーブルベースのアドレス変換は、PGビットが設定されている限り発生します。これは、OSの存続期間を通じて行われます。 MMUは、カーネルモードでは無効にされません。また、「SO」(またはその他)は仮想アドレスと物理アドレスの間で1:1のマッピングを使用しません。
PCIのような周辺機器に割り当てられているような既知の物理アドレスへのアクセスは、未使用の仮想アドレスを割り当て、必要な物理ページ番号で対応するページテーブルエントリを設定することによって行われます。次に、デバイスドライバーのコードは仮想アドレスを使用します。
はい、DMAは主に物理アドレスで機能します。ダム/安価なDMAコントローラーは、実際には、指定された開始アドレスと長さで物理的に隣接するバッファーに転送するだけです。そのようなデバイスをサポートするOSまたはデバイスドライバーは、DMAデバイスがアクセスするために物理的に隣接する「バウンスバッファー」を割り当て、そことユーザーのバッファーの間でデータをコピーします。
スマート/より高価なDMAコントローラーは、物理アドレスの不連続な範囲を占めるバッファーを処理できます(「スキャッターギャザーマッピング」と呼ばれます)。これらは、高性能デバイスに非常に適しています。
IOMMUを使用すると、愚かな/安価なDMAコントローラーが、物理的に隣接していないバッファーに、隣接しているかのようにアクセスできます。ただし、IOMMUを備えたプラットフォームは、「プラットフォームにIOMMUが必要です。そのため、現在、IOMMUは主に仮想マシンモニターで使用されています。