2017-01-30 9 views
0

今後のOS用の簡単なカーネルを開発しています。私はスケジューラまですべてを開発しました。私はスケジューラがどのようにそのサイクルに入るのだろうかと思います。例えばOSスケジューラはどのように復帰しますか?

  1. タイマ割り込みが発生します。
  2. ハンドラはスケジューラを呼び出します。
  3. スケジューラはキュー内の次のプロセスをジャンプします。
  4. 割り込みが(IRETD)を返さなければなりません

しかし、スケジューラは、割り込みリターンをしたときに、次のプロセスにジャンプする必要がある場合。そしてもしそうなら、それは最後のプロセスに戻らないでしょう。

私はこの明確化が必要です - どのようにタイマ割り込みがスケジューラから戻るのですか?そしてスケジューラはタイマ割り込みとどのように通信しますか?(関数呼び出しでは、いつ復帰しますか?

が想定 - モノリシックカーネル

+0

  • ピック次のプロセスをプッシュI私はIRETD命令の特質に慣れていませんが、再開するために命令ポインタや他のレジスタをいくつかのスタックからポップする必要があると思います。 IRETDが必要なものをポップすると、中断されたものではなく新しいプロセスが効果的に再開できるように、スタックの値を変更する必要があります。 自分自身でx86命令セットのその部分を勉強することなく、具体的な記述はできません。 私の経験は、ほとんどが私の趣味プロジェクト(https://bitbucket.org/ruifig/g4devkit)から来ています。これは、ARMをベースにしています。 – RuiFig

  • 答えて

    0

    に割り込みが発生すると、プロセッサは、そのコンテキストを切り替えます。これは、EFLAGSレジスタ内のフラグを更新し、スタックに関するいくつかの情報をプッシュすることによって行われます(インテルマニュアルに記載されています)。ユーザモードで割り込みが発生すると、現在のタスクのTSSに従ってスタックスイッチも発生します。

    としてスケジューラプロセスが実行される - 割り込み状態で、ユーザプロセスから来た

    1. は、新しいプロセスの中断状態にIRETD
    2. スタック上
    関連する問題