まず、「手動で」カーネルモードに切り替えることで何を得たいのかよくわかりません。それで、あなたは切り替えました、そして何ですか?次に何をしたいですか?ユーザー アプリケーションでアクセスできないはずのリソースにアクセスしたい場合は、アクセスを許可しないことが重要です。アクセスが許可されていると、アプリは次のような厄介なことを簡単に行うことができるからです。
- OS を損傷し、コンピューターをハングまたは再起動する
- コンピュータのユーザーを人質にして身代金を要求する
- コンピューターを秘密のスパム ボットまたはネットワーク上の他のコンピューターのリモート操作の攻撃者に変える
- OS や他のアプリをスパイし、機密情報を盗む
- 情報を改ざんする
- DRMやその他のさまざまなライセンスなどを回避する
- 同じコンピューターの他のユーザーになりすまして、銀行口座やクレジット カード情報、または他のリソースへのパスワードを使用して、罪を犯したり盗んだりする可能性があります。
- 上記のいずれかまたはすべてにつながる可能性のあるウイルス対策ソフトウェアがある場合は無効にします
- などなど
上記のいずれにも関心がない場合、アプリがカーネル特権を取得する理由はありません。
確かに、OS には特定のバグがあり、アクセス権を取得することで回避したいバグと見なされるものがありますが、それはまれであり、重要なものを壊さずにそれらのバグを実際に「修正」できる人はほとんどいません。信頼性とセキュリティに関する懸念は、OS で気に入らないものを「修正」したいという衝動よりも 1000 倍も重要です。
カーネルモードに切り替える方法である割り込みと例外に関しては、それは理にかなっている一般的な実装です。
割り込みはカーネルで処理する必要があるため、必要に応じて切り替えが発生します。割り込みをトリガーするハードウェアをどう処理するかを知っているのは、カーネルとデバイス ドライバーだけだからです。ハードウェアの違いを抽象化し、統一された API をプログラムに提供して、これまたはそのディスプレイ、サウンド カード、ネットワーク カード、またはプリンターなどの操作方法を知る負担から解放することが、OS の要点です。等
ソフトウェア割り込みは、ハードウェア割り込みと同じメカニズムにピギーバックするだけです。ソフトウェア割り込みの主な用途は、OS に何らかの作業/支援を要求することです。当然のことながら、ハードウェア割り込みが既に行っているように、ソフトウェア割り込みも切り替える必要があります。
x86 プラットフォームでは、ハードウェア割り込みとìnt
命令は CPU でほぼ同じ応答を返し、非常によく似た方法で処理されます。
このシステム コール機能のために、一部の CPU は割り込みとは関係のない特別な命令を提供します。ハードウェア割り込みの上に実装されたソフトウェア割り込みよりも高速である場合や、ソフトウェア割り込みが提供しない便利な追加機能が付属している場合があります。
これは、x86 命令sysenter
とsyscall
. これらは、ユーザー モードからカーネル モードへの高速移行用に最適化されています。
一部の例外は、ページ フォールト例外など、ハードウェア割り込みと同じ性質のものです。OSが仮想オンディスクメモリを実装するために使用するメカニズムであるため、カーネルでも処理する必要があります。OS は、ページ フォールトに応答してディスク上のデータにアクセスし、ページ テーブルを変更する必要があります。アプリ自体がそれを実行できる可能性は低く、任意の場所などの重要なものにアクセスできるようにするのは適切ではありません。ディスクまたはページテーブルで自由に。
他の例外は、アプリの実行を制御し、何か問題が発生したことを OS に通知するために使用されます。これにより、OS は、問題を修正するか、不正な動作をしているアプリケーションを終了する機会が与えられます。ゾンビ状態のままにしておく必要はありません。メモリー。これらの例外もカーネルで処理する必要があり、それが唯一の方法です。
ここで、アプリ自体の中でアプリの例外を処理することに関心があるかもしれません。一部のOSではそれが可能です。Linux と Unix は を実装しているのに対し、Windows はそれが呼ぶものStructured Exception Handling
(AKA ) を実装しています。通常、どちらを実行しても、最初にカーネルで例外を処理し、次にそれを元の場所に反映する必要があります。これは、ほとんどの CPU が実装されている方法です。このような実装は、例外が最初にカーネルにルーティングされるときに簡単かつ安価に実行でき、カーネルは SEH やシグナルなど、これに加えて何かを実装できるため、何も禁止しません。SEH
signals
とにかく、ユーザー アプリに機能を提供し、セキュリティを確保するのは OS/カーネルであるため、この 2 つが密接に関係している場合が多いためです (OS/カーネルはすべてにアクセスでき、アプリは OS にアクセスすることを想定されていないため)。アプリに代わってこれらのものにアクセスすることがありますが、礼儀を考えてください:)、これらは両方とも、ユーザーモードとカーネルモードの間の架空のフェンスの背後にあります.