システムコールは実際にハードウェア割り込みのようにCPUを「中断」しますか?

システムコールは実際にハードウェア割り込みのようにCPUを「中断」しますか?

私はシステムコールとハードウェア割り込みがどのように実装されているかをより深く理解しようとしていますが、私を混乱させ続けるのは、どのように処理方法が異なるかです。たとえば、(少なくとも過去には)システムコールを開始する1つの方法がx86INT 0x80命令を介して行われたことがわかります。

  1. プロセッサは、ハードウェア周辺機器がCPUを中断するのとまったく同じ方法でこれを処理しますか?そうでなければ、どのような点で違いがありますか?私の理解はどちらもIDTをインデックス化し、ベクトルのインデックスだけが異なることです。

  2. 同じ意味で処理の「サブハーフ」を処理するというアイデアがあると理解していますsoftirqが、物理ハードウェア割り込みキューを介して実行されることを言うこのような「ソフトウェア割り込み」だけを見ました。システムコール「ソフトウェア割り込み」もsoftirq処理のためにトリガされますか?人々はシステムコールを「ソフトウェア割り込み」と呼んでいますが、「softirqソフトウェア割り込み」とも呼ぶことがあるので、この用語は私を少し混乱させます。

答え1

INT 0x80hカーネルサービス(システム機能)を呼び出す古い方法です。現在、syscallsこれらのサービスは割り込みコールよりも高速であるため、コールに使用されます。これを確認できますマッピングカーネルの割り込み記述子テーブルからidt.cそして50行目irq_Vectors.h文書。

あなたの質問に答える重要な点は、割り込み要求(IRQ)がどのように構成されているかを確認できる最後のファイルのヘッダーだと思います。

 This is the general layout of the IDT entries: 
   Vectors   0 ...  31 : system traps and exceptions - hardcoded events
   Vectors  32 ... 127 : device interrupts
   Vector  128         : legacy int80 syscall interface
   Vectors 129 ... INVALIDATE_TLB_VECTOR_START-1 except 204 : device interrupts
   Vectors INVALIDATE_TLB_VECTOR_START ... 255 : special interrupts

電気的でもソフトウェア的でも構いません。割り込みがトリガされるたびに、カーネルはIDTからそのIDを照会し、関連する割り込みをカーネルモードで実行します。割り込みハンドラ。非常に高速である必要があるため、通常、後でsoftirqaまたはaで処理する情報をいくつか設定しますtasklet。第2章を読む(クイック読み取り...)信頼できないLinuxカーネルクラッキングガイド

stackoverflowに対する非常に素晴らしく徹底的な答えも読んでください。Intel x86およびx64システムコール質問、どこにINT 0x80hsysenterそしてsyscall文脈に入れて…

私は自分の(非常に控えめでまだ準備中の)自律学習ページを作成しました。割り込みと信号信号とトラップが割り込みとどのように関連しているかを理解するのに役立ちます(例:SIGFPE - 0で割る)。

関連情報