カーネルは、悪意のあるプログラムがすべての物理RAMを読み取ることをどのように防止しますか?

カーネルは、悪意のあるプログラムがすべての物理RAMを読み取ることをどのように防止しますか?

可能なすべてのアドレスからメモリを読み取ろうとするプログラムを作成し、「フル」Unixで実行すると、すべての物理RAMにアクセスできなくなります。しかし、オペレーティングシステムはこれをどのように防止しますか?

私はどのアセンブリコードでもすべてにアクセスできる小さなCPUアーキテクチャに慣れています。プログラム(カーネル)がそのような悪意のある作業をどのように検出できるかはわかりません。

ベストアンサー1

誤ったメモリアクセスをブロックするのはカーネルではなくCPUです。カーネルの役割はCPUを正しく設定することだけです。

より正確には、誤ったメモリアクセスを防止するハードウェアコンポーネントは次のとおりです。メモリ管理ユニット。プログラムがメモリアドレスにアクセスすると、CPUはMMUの内容に基づいてアドレスをデコードします。 MMU は仮想アドレスを物理アドレスに変換します。 CPUが特定の仮想アドレスにロードまたは保存すると、MMUの内容に基づいて対応する物理アドレスを計算します。カーネルは、各プログラムがアクセス権を持つメモリにのみアクセスできるようにMMU構成を設定します。他のプログラムのメモリとハードウェアレジスタはプログラムのメモリにまったくマッピングされません。これらの物理アドレスには、プログラムのMMU構成に対応する仮想アドレスはありません。

異なるプロセス間でコンテキスト切り替えが発生すると、カーネルは新しいプロセスに必要な変換が含まれるようにMMU設定を変更します。

一部の仮想アドレスはまったくマッピングされません。言い換えれば、MMUはそれを特別な「対応するアドレスなし」の値に変換します。これにより、プロセッサがマップされていないアドレスを逆参照するときにトラップが発生します。プロセッサはカーネルコードから事前定義された位置に分岐します。一部のトラップは合法的ですが、他のトラップは合理的です。たとえば、仮想アドレスは次の場所の場所に対応します。スワップスペースこの時点で、カーネルコードはスワップからページコンテンツをロードし、元のプログラムに戻り、メモリアクセスコマンドを再実行します。他のトラップは正当ではありません。この場合、プロセスは以下を受け取ります。シグナルデフォルトでは、プログラムはすぐにシャットダウンします(プログラムにシグナルハンドラの分岐がない場合は、いかなる場合でもメモリアクセスコマンドは完了しません)。

おすすめ記事