割り込みは、他に何が起こっているかに関係なく、すぐに処理する必要のある「異常な」イベントです。それらは必ずしも予期せぬものや悪いものではないため、引用符で「異常」と言いますが、CPUの観点からは「異常」です。これは、無関係である可能性のあるコードの実行でビジー状態になっているためです。
CPUには、割り込みをリッスンするためのいくつかのメカニズムと、さまざまな種類の割り込みが発生したときに「何をすべきか」を構成するいくつかの方法があります。これにより、オペレーティングシステムは、ハードウェアデバイスが動作するときに通知されるように調整できます(非常に重要なハードウェアクロックを含み、定期的に割り込みを生成するだけです)。CPUの割り込み処理構成により、割り込みが発生するたびに、OS内の指定されたコードが制御を取得します。
割り込みハンドラが実行を開始すると、コンピュータは(アプリケーションプログラマにとって)非常に不愉快な状態になります。マシンは他の何か(何でもかまいません)の実行でビジーであり、OSに「何かが起こった」ことが通知されました。マシン内のどこからでも割り込みを実際に処理するために必要な他の情報を収集し、CPUで実行されている「何でもあり得る」ことを妨げることなく必要な処理を実行する必要があります。OSが現在実行中のアプリケーションプロセスを切り替えたい場合は、後で復元できるようにコンテキストを十分に保存する必要があります(ここでも、そのコンテキストに影響を与えずに)、他のコンテキストをロードして、CPUを通常の状態に戻します。そのコンテキストでの実行。
前述のように、割り込みはハードウェアデバイスから通知を取得するために使用され(唯一の代替策は定期的にチェックすることです)、時間を追跡し、アプリケーションプロセスから制御を回復する保証された機会を取得します(実行中のアプリケーションを切り替えるため)。 、無効な命令を実行するアプリケーションプロセスからの回復、およびアプリケーションがOSの要求を行えるようにする。これらはシステムコールと呼ばれます。アプリケーションがマシンをめちゃくちゃにしてしまうことを防ぐために、アプリケーションは通常「ユーザーモード」でマシンと共に実行されます。これにより、アプリケーションは、すでに割り当てられている(仮想)メモリの読み取りと書き込み以外の基本的な処理を行いません。つまり、何をするにもそれ以外の場合(ファイルの読み取り/書き込み、メモリの追加の要求、デバイスへのアクセスなど)、アプリケーションはシステムコールを行う必要があります。基本的には、OSがそれを探すことがわかっている場所に、実行したい処理に関する情報を残し、適切な種類の割り込みを発生させるCPU命令を実行します。OSは、アプリケーションが何をしようとしているかを確認し、その要求を実行する必要があるかどうかを判断できます。これは、プロセスの外部で何かに影響を与える何かを実行しようとするプロセスの試行にOSが関与することを保証することが、アクセスポリシーを実施できる唯一の方法です。
つまり、本質的には、OSは割り込みによって駆動されます。「抽象的な」OSはマシンを「通常の動作」状態にブートストラップし、ある時点で制御を「通常の」プロセスに引き渡します。通常の状況下では、OSは割り込みを処理することによってのみ制御を取り戻します。しかし、割り込みがなければ興味深いことはほとんど発生しないため、OSは基本的に常にすべてを制御しています。