3

コンテキスト:この説明
によると、ユーザー空間プログラムは、プロセッサによって提供されるすべての操作を実行することはできません。上記のリンクの説明によると、CPU 内にはさまざまな操作レベルがあります。

質問:
ユーザー空間コードが CPU によって特権レベルで実行されないようにするにはどうすればよいですか? システムコールを使わずにアセンブリ言語を使って、より高いレベルに切り替えることはできないでしょうか?

そうではないことは確かですが、その理由はわかりません。誰かがこれを指摘したり、このトピックを扱っているリソースを指摘したりできますか?

4

2 に答える 2

10

CPU が、実行される命令の ID、アクセスされるメモリ アドレス、またはその他の条件により、現在の特権レベルで許可されていない命令に達すると、CPU 例外が発生します。これにより、基本的に現在の CPU 状態 (レジスタの内容など) が保存され、カーネル特権レベルで実行されている事前設定されたカーネル アドレスに実行が転送されます。これにより、実行される操作が検査され、処理方法が決定されます。実際には、実行する操作が許可されていない場合、通常はカーネルがプロセスを強制終了して終了します。

于 2013-11-14T18:25:47.847 に答える
0

CPU は RAM に格納されたコードを処理します。メモリはフラグを保持します。メモリには特別なレイアウトがあります。物理メモリを仮想メモリに変換する、いわゆる記述子テーブルがあります。最初に、gdt が読み取られる記述子テストまたはセグメント テストがあります。gdt には、記述子特権レベルと呼ばれる値が含まれています。これには、呼び出しプロセスが満たさなければならないリングレベルの値が含まれています。そうでない場合、アクセスは許可されません。次に、スーパバイザ ビットを持つページ ディレクトリ テストが続きます。これも一定の条件を満たす必要があります。ゼロの場合、特権プロセスのみがページ ディレクトリ内のこのページ テーブルにアクセスできます。値が 1 の場合、すべてのプロセスは、現在チェックされているページ ディレクトリ エントリ内のページにアクセスできます。最後のテストはページテストです。そのチェックは、以前のチェックに似ています。プロセスがすべてのチェックを正常に通過した場合、メモリ ページへのアクセスが許可されます。ここで注目すべきは、CPU レジスタ c3 です。

于 2013-11-14T19:28:36.333 に答える