1

x86 CPUでの割り込み、特にページフォールトの制御フローを解決しようとしています。これまでに私が理解できることは次のとおりです。

  1. IDTにはサービスルーチンアドレスが入力されます。
  2. 割り込みが発生します。
  3. CPUは、EFLAGS、CS、およびEIPをスタックに保存します。
  4. EIPは、IDTからフェッチされたISRアドレスに設定されます。mov eip, [idtr+interruptNum*4]
  5. 割り込みルーチンが実行されます。
  6. 割り込みルーチンはiret命令で完了します。

ここで、割り込みが実際にはNICバッファに関連するページフォールトであるとしましょう。ISRはout、DMAコントローラーにシステムメモリからデバイスに(またはその逆に)コピーを発行するように指示するために使用しますか、それともここでベースから離れていますか?

4

1 に答える 1

2

メモリマップドI/Oの仕組みを誤解していると思います。

デバイスがメモリマップドI/Oを使用する場合、物理アドレス範囲が割り当てられます。必要に応じて、ノースブリッジおよび/またはサウスブリッジは、CPUがそのアドレス範囲内でメモリ操作を実行するときに、操作がRAMではなくデバイスに向けられるように構成されます。RAMには同じアドレス空間のコピーはなく、DMAは関係しません。

デバイスドライバがメモリマップドI/Oにアクセスできるように、オペレーティングシステムは仮想アドレス範囲を関連する物理アドレス範囲にマップします。通常、パフォーマンス上の理由から、これはグローバルマッピング(つまり、すべてのプロセスで同じマッピング)になり、アクセスはカーネルモードに制限されます。この仮想アドレス空間は常にマップされているため、ページフォールトは発生しません。

デバイスがメモリマップドI/OではなくDMAを使用している場合、状況は少し異なります。デバイスドライバは通常、操作用にページング不可能なメモリのブロックを予約しているため、ページフォールトは発生しません。DMAコントローラは仮想アドレスではなく物理アドレスで動作するため、DMA操作を実行するためにこのメモリを仮想アドレス空間にマップする必要はありません。(もちろん、メモリブロックをデバイスドライバで読み取り/書き込みできるように、ある段階で仮想アドレス空間マッピングが必要になります。)

于 2012-07-29T00:25:51.943 に答える