1

オペレーティング システムの大学院コースの宿題を終えました。私は素晴らしいスコアを獲得し、問題の小さなポイントを1 つだけ逃しました。どれが特権的な指示でどれがそうでないかを尋ねました。1つを除いてすべて正しく答えました:あるレジスタ値を別のレジスタ値に追加する

私はそれが特権であると答えましたが、明らかにそうではありません!どうすればいいの?

私は、ユーザーがシステム コールを使用してレジスタ/メモリとやり取りしていると考えました。システム コールは、ある意味で、ユーザー モードのシステム コールからカーネル モードのルーチンに変わります。したがって、あるレジスター値を別のレジスター値に追加することは、特権のないユーザーによって呼び出される可能性がありますが、最終的にはカーネルが作業を行い、カーネルの特権モードになります。だから特権?ユーザーは自分でそれを行うことはできません。私が間違っている?どうして?!

  • ありがとう!
4

1 に答える 1

4

レジスタを変更するとカーネルの介入が必要になると考える理由がわかりません。一部の特殊レジスターには特権が与えられている場合があります (ユーザーモードコードがシステムモード保護をバイパスできる記述子テーブルや保護レベルなどを制御するレジスター) が、汎用レジスターはカーネルが関与することなく自由に変更できます。

コードが実行されているとき、命令の部分は次のようなものになります。

inc  %eax
movl $7,%ebx
addl %eax,%ebx

余談ですが、カウンターをインクリメントしたり、関数を呼び出したりするたびにカーネルへのシステム呼び出しが必要になると、コードの実行速度がどれほど遅くなるかを想像しているだけです:-)

私が考えることができる唯一のことは、他のスレッドのレジスタに影響を与える可能性があるため、実行スレッドがレジスタを任意に変更することを許可されていないと考えた場合です。しかし、カーネルはスレッドを切り替えるときにそれを処理します-すべてのレジスタは後で使用できるようにどこかにパックされ、次のスレッド用のレジスタがロードされます.


あなたのコメントに基づいて、追加の時が CPU 保護メカニズムが介入すべき時であると考えているようです。カウンターとして使っているだけかもしれません。

ただし、メモリにアクセスするためのアドレスとしてそれを使用、そのメモリが何らかの形で (アドレス空間の外にある、またはディスクにスワップされている) 無効である場合、カーネルはその時点で介入して状況を修正します (アプリケーションを破棄します)。耳に装着するか、スワップアウトしたメモリを持ち込んでください)。

ただし、それは特権命令ではありませんが、CPU がページ フォールトを処理しているだけです。

特権命令は、割り込み記述子テーブルの位置レジスタを変更したり、割り込みを無効にしたりするなど、まったく許可されていないものです。

于 2010-09-07T04:45:00.460 に答える