x86 アーキテクチャの約 15 の命令は、ユーザー モードでは使用できないというチュートリアルを読みました。
現在の特権レベルを追跡するコードセグメントレジスタと呼ばれるものがあることを私は知っています
私の質問は
、すべての命令を実行する前に、実行中の現在の特権レベルを確認する必要がある cpuですか?
b) ユーザープログラムにユーザーモードで使用できない命令が存在する場合、実際にはどうなりますか?CPU は実行前にこれをどのように認識しますか?
x86 アーキテクチャの約 15 の命令は、ユーザー モードでは使用できないというチュートリアルを読みました。
現在の特権レベルを追跡するコードセグメントレジスタと呼ばれるものがあることを私は知っています
私の質問は
、すべての命令を実行する前に、実行中の現在の特権レベルを確認する必要がある cpuですか?
b) ユーザープログラムにユーザーモードで使用できない命令が存在する場合、実際にはどうなりますか?CPU は実行前にこれをどのように認識しますか?
CPU は、特定の命令またはそれらの特定の部分を実行する前に、CPL、RPL などをチェックします (非常に複雑なロジックを持つ多くの命令があり、実行する一連のチェックは条件の数によって異なります)。
命令の実行が許可されていない場合、CPU は例外イベントを生成し、それがそのハンドラにディスパッチされます。例外ハンドラーは本質的に割り込みハンドラーに似ており、OS によって定義されます。そのため、OS が何らかの形で修正できない例外を処理するようになると、例外の原因となったプログラムを終了します。
「修正可能な」例外の例として、ディスクにオフロードされた仮想メモリのページ フォールトがあります。OS は、アプリケーションが使用しようとしているコード/データをディスクからメモリにロードします。
現在の特権レベルは、CS レジスタのビットの 1 つ (技術的には x86 では 2 ビット) に保存されます。
特定の命令はコードで許可されていません。Ex - ユーザーは特定のシステム コールを作成できません。int X (アセンブリ (x86) ではシステム コールが発生します)。X は IDT (割り込み記述子テーブル) へのインデックスです。このインデックスまた、IDTの各エントリにはDPLというフィールドが格納されています。
次に、int 命令が続く手順を示します。
• IDT から n 番目の記述子をフェッチします。ここで、n は int の引数です。
• %cs の CPL が <= DPL であることを確認します。ここで、DPL は記述子の権限レベルです。
• はいの場合、ユーザー コードはこのシステム コールを実行するのに十分な特権を持っています。カーネル モードに切り替えるため、現在の実行コンテキストが保存されます (レジスタなど)。
• そうでない場合、ユーザーはこれを実行するのに十分な権限を持っておらず、int 13 命令 (一般保護違反) が実行され
ます。DO NOT DO 命令の 1 つのカテゴリについて、このチェックがどのように行われるかはわかりません。他の指導のためにそれがどのように行われたか。
また、GDT(ゲート記述子テーブル)を介してさまざまなセグメントにアクセスする場合も、アプローチは同じです。
PS : これは x86 ベースのシステムでのみ有効です。予約済み命令のリストを見たリンクにコメントしてください。