2011-10-20 6 views
1

これは実際の実装よりも知識に関する質問によく似ています。私は、カーネル機能がシステムの起動後に異なる仮想アドレスを持つことができるかどうか疑問に思っていました。実行可能ファイルのコンパイルに関する私の理解は、バイナリに割り当てられた仮想アドレスですが、実行時にosによって仮想アドレスが物理アドレスに割り当てられます(ページング、私はそのことを知っています。システムを再起動するたびに仮想アドレスが異なることを確認してください。 1.カーネル機能はどのようにアドレス範囲にマッピングされていますか? 2.実行時に異なる仮想アドレスにマッピングできるか。 (私はそれが可能なのだろうか)3. dllのアドレスマッピングはどのようになっていますか?コンパイル時に仮想アドレスが与えられているか、実行時に相対アドレスが割り当てられていますか? (私はそれがどのように行われたのかと思います。)4.カーネル仮想アドレスが物理メモリに固定されているかどうかを調べる方法はありますか?カーネル関数は異なる仮想アドレスを持つことができます

おかげ

答えて

4

は伝統的に、実行可能ファイルは、コンパイル時に固定の仮想アドレスのマッピングを割り当てられています。しかし、近年では、これがセキュリティにとって悪いことが明らかになりました。攻撃者は、攻撃の一部として物事が記憶されている場所を正確に知ることができます。これを軽減するために、位置非依存または再配置可能な実行可能ファイルを使用して、ロードアドレスをランダム化することができます(少なくともLinuxでは)。ただし、これには欠点があります。動的ローダが再配置を実行する必要があるため、プログラムの起動に時間がかかります(実行時に位置に依存しないマシンコードから追加のオーバーヘッドが発生する)。

OSカーネルでは、ブートに費やされた残りの時間と比較して追加のオーバーヘッドが簡単です。実際、Windowsカーネルは実際には多くのコンポーネントを動的にリンクしています。したがって、カーネルはロードアドレスをランダム化する明白な場所です。カーネル関数は、アドレス範囲にマップされている方法

+0

実行時に異なる場所にモジュールをアンロードして再ロードします。カーネルライブラリの相対マッピングを試みますが、一度ロードされると仮想アドレスは変わりますか?(他のモジュールはこれらのアドレスに依存していると思います。しかし、それらのアドレスが照会する必要のあるテーブルに保持されていれば、実行時のロード/アンロードが可能です。したがって、カーネルは実行時に仮想アドレスを移動できます。しかし、システムは、実行時にアンロード)仮想アドレスがphyメモリに固定されているかどうか確認できますか? –

+1

@ agent.smith、コメントで複雑なフォローアップを尋ねるのではなく、別の質問を開いてください。また、複数の質問があるようです。いくつかの人々はいくつかの質問に対する答えを知っているかもしれないが、それらのすべてではないことがあるので、これらを個別の質問として質問してください。 – bdonlan

1

これらは必ずしもユーザー空間にマップされる必要はありません。私がこの分野で練習を中止するまで、ソフトな割り込みによって到達しました。

+0

そうです。だから、私が4GBのアドレス空間を考えると、スペースの約半分はカーネルコード/データと半分のユーザー空間のprogを含んでいます。カーネルコードは、すべてのユーザー空間プログラムで同じです。カーネルルーチンを起動したいときは、そのアドレス範囲にアクセスできないのでソフトウェア割り込みが発生します。私が知りたいのは、カーネルの仮想アドレスがどのように与えられているかです。 –

+0

@ agent.smithあなたが私の言うことを受け入れるならば、質問は無意味です。カーネルはプロセスのユーザーモード空間とは別の独自のアドレス空間を持っているため、カーネルアドレスがユーザー空間にどのようにマッピングされるかという問題は起こり得ません。 – EJP

関連する問題