これは実際の実装よりも知識に関する質問によく似ています。私は、カーネル機能がシステムの起動後に異なる仮想アドレスを持つことができるかどうか疑問に思っていました。実行可能ファイルのコンパイルに関する私の理解は、バイナリに割り当てられた仮想アドレスですが、実行時にosによって仮想アドレスが物理アドレスに割り当てられます(ページング、私はそのことを知っています。システムを再起動するたびに仮想アドレスが異なることを確認してください。 1.カーネル機能はどのようにアドレス範囲にマッピングされていますか? 2.実行時に異なる仮想アドレスにマッピングできるか。 (私はそれが可能なのだろうか)3. dllのアドレスマッピングはどのようになっていますか?コンパイル時に仮想アドレスが与えられているか、実行時に相対アドレスが割り当てられていますか? (私はそれがどのように行われたのかと思います。)4.カーネル仮想アドレスが物理メモリに固定されているかどうかを調べる方法はありますか?カーネル関数は異なる仮想アドレスを持つことができます
おかげ
実行時に異なる場所にモジュールをアンロードして再ロードします。カーネルライブラリの相対マッピングを試みますが、一度ロードされると仮想アドレスは変わりますか?(他のモジュールはこれらのアドレスに依存していると思います。しかし、それらのアドレスが照会する必要のあるテーブルに保持されていれば、実行時のロード/アンロードが可能です。したがって、カーネルは実行時に仮想アドレスを移動できます。しかし、システムは、実行時にアンロード)仮想アドレスがphyメモリに固定されているかどうか確認できますか? –
@ agent.smith、コメントで複雑なフォローアップを尋ねるのではなく、別の質問を開いてください。また、複数の質問があるようです。いくつかの人々はいくつかの質問に対する答えを知っているかもしれないが、それらのすべてではないことがあるので、これらを個別の質問として質問してください。 – bdonlan