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


10

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

私は、任意のアセンブリコードがすべてにアクセスできる小さなCPUアーキテクチャに慣れています。プログラム(カーネル)がこのような悪意のある操作を検出する方法を理解していません。


2
通常、MMUは許可された領域外のメモリにアクセスできないように注意します。
ott-- 2015年

1
まあ、MMUはアセンブリによって構成されます。したがって、アセンブリコードはMMU構成を変更し、別のメモリページにアクセスできます。
nowox

これは、コードをルートとして実行する場合にのみ当てはまります。
ott-- 2015年

2
ページテーブルとカーネルの抽象化については、その中で読む必要があります。
Clarus

@ott:rootでもMMUを変更できません(少なくともLinuxでは)。カーネルだけが行います。
Basile Starynkevitch、2015年

回答:


12

不正なメモリアクセスを防止しているのはカーネルではなく、CPUです。カーネルの役割は、CPUを正しく構成することだけです。

より正確には、不正なメモリアクセスを防止するハードウェアコンポーネントはMMUです。プログラムがメモリアドレスにアクセスすると、そのアドレスはMMUの内容に基づいてCPUによってデコードされます。MMUは、仮想アドレスから物理アドレスへの変換を確立します。CPUが特定の仮想アドレスでロードまたはストアを実行すると、MMUの内容に基づいて対応する物理アドレスを計算します。カーネルは、各プログラムが資格のあるメモリにのみアクセスできるようにMMU構成を設定します。他のプログラムのメモリとハードウェアレジスタは、プログラムのメモリにまったくマップされません。これらの物理アドレスには、そのプログラムのMMU構成に対応する仮想アドレスがありません。

異なるプロセス間のコンテキストスイッチでは、カーネルはMMU構成を変更して、新しいプロセスに必要な変換が含まれるようにします。

一部の仮想アドレスはまったくマップされません。つまり、MMUはそれらを特別な「そのようなアドレスなし」の値に変換します。プロセッサがマップされていないアドレスを逆参照すると、これによりトラップが発生します。プロセッサはカーネルコード内の事前定義された場所に分岐します。一部のトラップは正当です。たとえば、仮想アドレスはスワップ空間にあるページに対応する可能性があります。その場合、カーネルコードはスワップからページコンテンツをロードし、メモリアクセス命令が再度実行されるように元のプログラムに切り替えます。他のトラップは正当ではありません。この場合、プロセスはデフォルトでプログラムを強制終了するシグナルを受け取ります(プログラム内のシグナルハンドラーに分岐しない場合は、メモリアクセス命令は完了しません)。


「アドレスはMMUの内容に基づいてCPUによってデコードされます」というステートメントを少し指定できますか?実行中のプログラムに、アドレスをデコードする実際のコードはありますか?または、CPUがアドレスにアクセスするとき-アクセスはMMUに対して行われ、MMUはそれを適切に変換/処理します(メモリまたはキャッシュにアクセスして結果を返すか、カーネルプロシージャをトリガーします)?したがって、マイクロコントローラ/アセンブリの観点から見ると、MMUは新しい部分です。CPUはメモリに直接接続されておらず、MMUに接続されており、そこで仮想メモリの抽象化が行われます。
xealits 2015年

3
@xealits仮想アドレスから物理アドレスへの変換は、ハードウェア回路であるMMU内で行われます。プログラムやカーネルにそれを行うコードはありません。カーネルは、MMUエントリに「無効なアドレス」と記載されている仮想アドレスにプログラムがアクセスしようとした場合にのみ、例外的に呼び出されます。カーネルは、MMUが使用するRAM内のレジスタとテーブルを構成する作業も行います。
Gilles「SO-邪悪なことをやめなさい」2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.