2012-01-29 24 views
5

オペレーティングシステムユーザーモードアプリケーションの仮想アドレス空間はプライベートです.1つのアプリケーションは別のアプリケーションに属するデータを変更できません。各アプリケーションは単独で実行され、アプリケーションがクラッシュした場合、クラッシュはその1つのアプリケーションに限定されます。他のアプリケーションとオペレーティングシステムはクラッシュの影響を受けませんカーネルモードとメモリ保護

なぜカーネルモードでOSがメモリを保護せず、BOSDが発生するのですか?

+0

なぜオフトピックになるのですか? –

+0

これはトピックonsdevの質問のように聞こえます... – bdonlan

答えて

8

まず、あるレベルでは、常にCan not Fail™コンポーネントを使用します。このコンポーネントがクラッシュした場合、回復は不可能です。たとえば、実行中のプロセスのテーブルをゴミ箱に入れた場合、リブートから離れて再構築することはできません。したがって、このコンポーネントのクラッシュをメモリ保護だけで制限しても、BSOD(または同等のもの)が発生する可能性があります。

しかし、あなたのポイントは良いです - 多くの場合、に致命的な障害を起こすことなくリセットされる多くのコンポーネントがあります。例えば、ドライバ、またはネットワークスタック。実際、このレベルで保護を行うOSがあります - それはmicrokernel architecturesと呼ばれます。

しかし、マイクロカーネルの問題はパフォーマンスです。 x86 CPUでは、Current Privilege Level(CPLまたは 'ring')、0(最大アクセス)と3(ユーザーモード)の間の数字、およびPage Tableの2つのものでメモリ保護が達成されます。ページテーブルは、仮想アドレスを物理アドレスにマッピングし、各ページ(4096バイトのメモリブロック)にアクセス制限を設定します。各プロセスには独自のページテーブルがあり、最大CPL、読み取り専用フラグ、実行不能フラグ、またはアクセス不能フラグを設定することにより、ページテーブルの各ページを制限できます。

あなたのCPLを変更するのは比較的速い操作です(ただし、いつ、どのようにして行うことが許可されているかについてのセキュリティ制限があります)。しかし、ページテーブルを変更することは、CPU上でTranslation Lookaside Buffer(TLB)と呼ばれるキャッシュをクリアする必要があるため、非常に高価です。

一般的に通常のOSでは、OSはユーザプロセス用に最低のXGBのメモリを予約します(通常3GBは32ビットアーキテクチャ用に選択された数です)。上位(4 - X)GBは物理メモリの最初の(4 - X)GBに直接マッピングされ、CPL 0( 'リング0')にのみ制限されます。したがって、カーネルはプライベートデータ構造を上位1GB程度に置くことができ、実行中のプロセスにかかわらず常に同じ仮想アドレスにアクセスすることができます。プロセスが半ダースのサブシステムが何かをするのを必要とするシステムコールを作る場合、問題はありません。それらの間で関数を呼び出すことができます。

しかし、マイクロカーネルシステムでは、各カーネルサブシステムが独自のページテーブルとそれ自身のアドレスマッピングを取得します。ユーザー呼び出しを処理するために、CPUはかなりの数のページテーブルを変更する必要があり、このパフォーマンスヒットが加算されます。さらに、各サブシステムは、依存関係の障害に対処するために準備する必要があり、システムの複雑さが増します。これらの問題のために、マイクロカーネルは、研究および玩具のOS(例えば、minixGNU HURD)としてのみ使用されてきました。

しかし、近年、マクロカーネルとマイクロカーネルの間の線がぼやけています。たとえば、Windows 7ではグラフィックスドライバは実際にはで、残りのカーネルとは分離されています。クラッシュした場合、システムは復旧できます。 LinuxおよびOS Xでは、FUSEはファイルシステムドライバをユーザ空間にロードできます。実際には、これらのシステム上のNTFSドライバはこのメカニズムを使用します。

+0

bdonlan.butありがとうございました。私の質問はsimple.iが知りたい "なぜオペレーティングシステムはカーネルモードで(各コンポーネントとKMD用に)メモリを分離しないのですか? –

+0

@AS、私はそれを説明しました。マイクロカーネルは実際にメモリを分離します。彼らはそれゆえに遅いです。 – bdonlan

関連する問題