2017-03-16 4 views
0

私は内部構造をよりよく知るために、単純なオペレーティングシステムを開発しています。 Boot loaderと、16-bit Real Modeで実行される単純なカーネルの開発では、私はよく知られていない用語System Callと使い慣れたInterruptに出くわしました。システムコールと割り込みの実装はどのように異なっていますか?

私は概念がまだ私には不明であることを見つけるためにのみ、用語をグーグルしています。私が理解している限り、システムコールはleast privileged modeで動作するアプリケーションプログラムによって、Higher Privileged mode(Ring 0)で動作するカーネルへのサービスを要求するために使用されます。

システムコールの実装方法はまだ不明です。

と言って、私はprint a wordにSimple Cプログラムを作成してコンパイルしています。今、私は画面上の指定された単語を印刷するシステムコールを含む実行可能ファイルが残っています。次のように与えられたシナリオに対応する私の質問は以下のとおりです。

質問1:

とすぐにプログラムが実行され、システムコールは、リクエストのカーネルに知らせる - まさに低レベルの観点から、ここで何が起こりますプログラミング?

質問2:

割り込みは、システムコールまたはその逆のことができますか?


私が概念をはっきりと理解していないと思われる場合は、「システムコールの概念」を説明してください。


ありがとうございます。

+2

リアルタイムモードの特権レベルはありません。システムコールは、OSを呼び出すための一般的な用語です。システムコールですが、x86も持っています( '' syscall'、 '' sysenter')に特化した指示です。 – Jester

+0

システムコールと割り込みは同じ意味ですか? –

+1

いいえ、同じではありません。割り込みはシステムコールを実装するために使用できますが、それはその主要な目的ではありません。 – Jester

答えて

1

ほとんどのシステムでは、割り込みとシステムコール(および例外ハンドラ)は同じ方法で実装されます。

システムコールはすぐにカーネルに要求を通知します。低レベルプログラミングの点でここではどういうことが起こりますか?

通常、システムコールはアセンブリ言語ルーチンのラッパーです。一連のイベントは次のとおりです。ルーチンシステム

  • システムルーチンへ

    1. コールは、レジスタにパラメータをロードして解凍します。
    2. システムルーチンは、変更モード命令(ユーザーモードよりも高いモード)を実行することによって例外(番号で識別)を強制します。
    3. CPUは、システムディスパッチテーブルの例外ハンドラにディスパッチすることによって例外を処理します。
    4. ハンドラはシステムサービスを実行します。
    5. ハンドラは例外または割り込み命令からの戻りを実行し、プロセスをユーザーモード(または呼び出し元のモード)およびシステムサービスルーチンに戻します。
    6. システムサービスルーチンは、レジスタから戻り値をアンパックし、パラメータを更新します。
    7. 呼び出し関数に戻ります。

    割り込みは、システムコールまたはその逆のことができますか?

    いいえ、同じ方法で送信されます。

    おそらく、オペレーティングシステムは、システムコールと割り込みを同じハンドラにマップできますが、それはうんざりです。

  • 1

    システムコールは、オペレーティングシステムの関数呼び出しのようなもので、プログラムによって手動で処理することはできないか、または処理すべきではない操作を実行し、オペレーティングシステムのタスクスコープに入ります。ファイルの操作、画面への書き込みなど。

    x86ハンドルは、何らかのコールバックメカニズムによって割り込みを処理します。あらゆる種類の外部割り込みに割り込み番号が与えられます。オペレーティングシステムは、対応する割り込みを処理する関数へのポインタを格納するテーブル(実モードの割り込みベクタテーブルと保護モードの割り込みディスクリプタテーブル)を設定します。たとえば、割込みコントローラから割込みを受信すると、キー割込みをint 21hに割り当てると、CPUは現在のコードセグメント、命令ポインタ、フラグおよびスタックを格納し、CPUは割込みテーブルのエントリ21hを検査し、命令ハンドラが置かれているアドレスを取り出します。その後、ハンドラを実行して通常の実行を再開します。

    しかし、割り込みテーブルのハンドラを呼び出すこの動作は、実際のハードウェア割り込みだけでなく、内部例外(ゼロで割る、未定義のオペコードに達するなど)によっても引き起こされる可能性があります。例外は、ハードウェア割り込みによって使用される割り込み番号とは異なる可能性がある割り込み番号に割り当てられます。

    最後に、 "int n"命令を使用して、現在実行されているプログラムによって直接割り込みをトリガすることもできます。

    この最後の機能は、システムコールでよく使用されます。その理由は、ユーザプログラムは割り込み番号(通常はDOSが主に21h、Linuxは主に80hを使用します)を知る必要があり、オペレーティングシステムは割り込みハンドラがどこにあってもそのアドレスを

    システムコールを実装する他の方法があることに注意してください。例えば、プロテクトモードでは、コールゲートは、CSにロードしようとするとシステムコールを引き起こす特別なセグメントですより新しいプロセッサでは、より高速な特別なシステムコール命令が提供されます。

    関連する問題