オペレーティング システム ユーザー モードでは、アプリケーションの仮想アドレス空間はプライベートであるため、あるアプリケーションが別のアプリケーションに属するデータを変更することはできません。各アプリケーションは分離して実行され、アプリケーションがクラッシュした場合、クラッシュはその 1 つのアプリケーションに限定されます。他のアプリケーションとオペレーティング システムは、クラッシュの影響を受けません。
なぜカーネル モード OS でメモリを保護せず、BOSD が発生するのですか??
オペレーティング システム ユーザー モードでは、アプリケーションの仮想アドレス空間はプライベートであるため、あるアプリケーションが別のアプリケーションに属するデータを変更することはできません。各アプリケーションは分離して実行され、アプリケーションがクラッシュした場合、クラッシュはその 1 つのアプリケーションに限定されます。他のアプリケーションとオペレーティング システムは、クラッシュの影響を受けません。
なぜカーネル モード OS でメモリを保護せず、BOSD が発生するのですか??
まず、あるレベルでは、Cannot Fail™ のコンポーネントが常に存在します。このコンポーネントがクラッシュした場合、回復は不可能です。たとえば、実行中のプロセスのテーブルを破棄すると、再起動する以外にこれを再構築することはできません。そのため、メモリ保護によってこのコンポーネントのクラッシュがそれ自体にのみ影響するように制限されていても、BSOD (または同等のもの) が発生する可能性があります。
しかし、あなたのポイントは良いものです-壊滅的な障害なしにリセットできることが多いコンポーネントがいくつかあります. たとえば、ドライバー、またはネットワーク スタック。実際、このレベルで保護を行う OS があり、それらはマイクロカーネル アーキテクチャと呼ばれます。
ただし、マイクロカーネルの問題はパフォーマンスです。x86 CPU では、メモリ保護は、現在の特権レベル(CPL、または「リング」)、0 (最大アクセス) から 3 (ユーザー モード) までの数値、およびページ テーブルの 2 つで実現されます。ページ テーブルは、仮想アドレスを物理アドレスにマッピングし、各ページ (4096 バイトのメモリ ブロック) にアクセス制限を設定します。各プロセスには独自のページ テーブルがあり、ページ テーブル内の各ページは、最大 CPL、読み取り専用フラグ、非実行フラグ、または非アクセス フラグを設定することによって制限できます。
CPL の変更は比較的迅速な操作です (ただし、いつ、どのように変更できるかについてはセキュリティ上の制限があります)。ただし、ページ テーブルの変更には、Translation Lookaside Buffer (TLB) と呼ばれる CPU 上のキャッシュをクリアする必要があるため、非常にコストがかかります。
通常、通常の OS では、OS はユーザー プロセス用に最小 X GB のメモリを予約します (通常、32 ビット アーキテクチャでは 3GB が選択されます)。上位 (4 - X) GB は物理メモリの最初 (4 - X) GB に直接マップされ、CPL 0 (「リング 0」) のみに制限されます。したがって、カーネルはプライベート データ構造を上位 1 GB 程度に配置し、実行中のプロセスに関係なく、常に同じ仮想アドレスでアクセスできます。プロセスが何かを実行するために半ダースのサブシステムを必要とする syscall を行う場合、問題はありません。サブシステム間で関数を呼び出すことができます。
ただし、マイクロカーネル システムでは、各カーネル サブシステムが独自のページ テーブルと独自のアドレス マッピングを取得します。ユーザー呼び出しを処理するために、CPU はかなりの数のページ テーブルの変更を行う必要がある場合があり、このパフォーマンス ヒットが加算されます。さらに、各サブシステムは、その依存関係の障害に対処する準備ができている必要があり、システムの複雑さが増しています。これらの問題のために、マイクロカーネルは概して、研究やおもちゃの OS (例えば、minix、GNU HURD ) としてのみ使用されてきました。
とはいえ、近年、マクロ カーネルとマイクロ カーネルの境界線があいまいになってきています。たとえば、Windows 7 では、グラフィックス ドライバーは実際にはカーネルの残りの部分から分離されています。クラッシュした場合、システムは回復できます。Linux および OS X では、FUSEはファイルシステム ドライバーをユーザー空間にロードできます。実際、これらのシステムの NTFS ドライバはこのメカニズムを使用しています。