1

いくつかのメモリを割り当てるLinuxドライバーを作成しており、ユーザースペースアプリケーションはmmap()そのメモリを使用しています。

今、私はそのモジュールの出口ハンドラーを書いています、そして私はいくつかの安全な仮定が何であるかを理解しようとしています。

まず、カーネルモジュールの終了ハンドラーが呼び出されたときに、すべてのメモリが(アプリケーションまたはカーネルのどちらによっても)マップされていないと想定しても安全ですか?または、メモリを解放する前に、カーネルドライバで手動でマップを解除する必要がありますか?

カーネルはモジュールが終了しているかどうかを認識している必要があり、カーネルはマッピング解除プロセスも処理するため、これを尋ねます。終了ハンドラが呼び出される前にカーネルがマッピング解除を処理する場合は、メモリを解放できます。これが当てはまり、ユーザースペースアプリケーションがそのメモリにアクセスしようとした場合、アプリケーションはセグメンテーション違反になります。これは、仮想アドレスが有効な物理メモリを指していないか、プロセスにそのページの仮想アドレスにアクセスする権限がないためです(カーネルがメモリのマップを解除したと仮定します)。カーネルドライバがメモリのマップを解除した場合も同じことが起こります。これは本当ですか?

4

1 に答える 1

1

この段階で終了するのは安全ではありません。荷降ろしを拒否するだけです。

これは自動ではありません。プロセスが実行するときに、モジュールの使用回数を増やす必要がありますmmap()

失礼になりたい場合は、ユーザープロセスを強制終了します。

于 2012-07-03T18:26:56.500 に答える