8

システムコール - OSがプロセッサの制御を取得する割り込みを生成する命令です。

そのため、実行中のプロセスがシステム コール (作成/終了/読み取り/書き込みなど) を発行すると、割り込みが生成され、カーネルがプロセッサの制御を取得し、必要な割り込みハンドラ ルーチンが実行されます。正しい?

次に、この命令がプロセスをブロックし、特権モードに移行し、カーネルコードをもたらすことになっていることをプロセッサがどのように認識したかを誰か教えてください。

つまり、プログラマーとして、stream1=system.io.readfile(ABC) などと入力するだけで、ファイル ABC を開いて読み取ることができます。

このプロセスの実行を監視しているのは何ですか?これを検出する魔法の力が CPU にあるのでしょうか?

私が読んだことから、プロセッサーは一度にしかプロセスを実行できないため、モニタープログラムはどこで実行されていますか?

KERNEL は、システム コールが実行状態でないときに、システム コールが行われたかどうかをどのように監視できますか。

または、コンピューターには、命令を実行する前に比較するシステムコール命令テーブルがありますか?

助けてください

ありがとう

4

5 に答える 5

8

カーネルは、システムコールを検出するためのプロセスを監視しません。代わりに、プロセスは、制御をカーネルに移す割り込みを生成します。これは、ソフトウェアで生成された割り込みが、命令セットのリファレンスマニュアルに従って行われるためです。

たとえば、Unixでは、プロセスはsyscall番号を詰め込みeax、命令を実行してint 0x80割り込みを生成し0x80ます。CPUは、割り込み記述子テーブルを調べて、その割り込みのカーネルハンドラーを見つけることにより、これに反応します。このハンドラー、システムコールのエントリポイントです。

したがって、32ビットx86 Linuxで_exit(0)呼び出すには(バッファをフラッシュするglibc関数ではなく、生のシステムコール):exit()

movl  $1, %eax   # The system-call number.  __NR_exit is 1 for 32-bit
xor   %ebx,%ebx  # put the arg (exit status) in ebx
int   $0x80
于 2012-09-01T10:35:51.060 に答える
2

あなたが提起した各質問を分析しましょう。

  1. はい、あなたの理解は正しいです。

  2. プロセス/スレッドがカーネル内に入りたい場合、メカニズムは2つしかありません。1つはTRAPマシン命令を実行することによるもので、もう1つは割り込みによるものです。通常、割り込みはハードウェアによって生成されるため、他のプロセス/スレッドは TRAP を介してカーネルに入りたいと考えています。そのため、プロセスによって TRAP が実行されると、通常どおりカーネルに割り込み (主にソフトウェア割り込み) が発行されます。トラップに加えて、システム コール番号についても言及します。これは、カーネル内の割り込みハンドラへの入力として機能します。システムコール番号に基づいて、カーネルはシステムコールテーブル内のシステムコール関数を見つけ、その関数の実行を開始します。カーネルは、割り込みの処理を開始するとすぐに cs レジスタ内のモード ビットを設定して、現在の命令が特権命令であることをプロセッサに伝えます。これにより、プロセッサは現在の命令が特権付きかどうかを知るようになります。システム コール関数の実行が完了すると、カーネルは IRET 命令を実行します。これは、CS レジスタ内のモード ビットをクリアして、これから内部への命令がユーザー モードからのものであることを通知します。

  3. プロセッサ内に魔法の力はありません。ユーザー コンテキストとカーネル コンテキストを切り替えると、プロセッサは魔法のようなものだと思われます。これは、大量の命令を非常に高速に実行する機能を備えた単なるハードウェアです。

4..5..6. これらすべての質問に対する回答は、上記のケースで回答されています。

あなたの質問にある程度答えられたことを願っています。

于 2016-08-04T21:02:08.317 に答える
-1

最新のハードウェアは、複数のユーザー セッションをサポートしています。ハードウェアがマルチ ユーザー モードをサポートしている場合、割り込みと呼ばれるメカニズムが提供されます。割り込みは、基本的に現在のコードの実行を停止して、他のコード (カーネル コードなど) を実行します。どのコードが実行されるかは、割り込みを発行するコードによって、割り込みに渡されるパラメーターによって決定されます。ハードウェアは実行レベルを上げ、カーネル コードをメモリにロードし、CPU にこのコードを強制的に実行させます。カーネルコードが戻ると、再びハードウェアに直接通知し、実行レベルが下がります。HW は、割り込み前の CPU 状態を復元し、割り込みを開始したコードの次の行に CPU を設定します。終わり。コードはハードウェアをアクティブに呼び出し、これが再びカーネルをアクティブに呼び出すため、カーネル自体で監視を行う必要はありません。

補足: 質問は短くするようにしてください。欲しいものを明確にする。投稿した質問に対する最初の回答は正しかったのですが、言い回しが適切ではありませんでした。このトピックに慣れていないため、これまでに理解した内容を説明するのではなく、基本概念の詳細な説明が必要であり、Caps Lock を使用しないことを明確にしてください。

提供された回答 cnicutar を受け入れてください。ありがとうございました。

于 2014-10-08T19:39:06.627 に答える