私はシステムコールとハードウェア割り込みがどのように実装されているかをより深く理解しようとしていますが、私を混乱させ続けるのは、どのように処理方法が異なるかです。たとえば、(少なくとも過去には)システムコールを開始する1つの方法がx86INT 0x80
命令を介して行われたことがわかります。
プロセッサは、ハードウェア周辺機器がCPUを中断するのとまったく同じ方法でこれを処理しますか?そうでなければ、どのような点で違いがありますか?私の理解はどちらもIDTをインデックス化し、ベクトルのインデックスだけが異なることです。
同じ意味で処理の「サブハーフ」を処理するというアイデアがあると理解しています
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を照会し、関連する割り込みをカーネルモードで実行します。割り込みハンドラ。非常に高速である必要があるため、通常、後でsoftirq
aまたはaで処理する情報をいくつか設定しますtasklet
。第2章を読む(クイック読み取り...)信頼できないLinuxカーネルクラッキングガイド
stackoverflowに対する非常に素晴らしく徹底的な答えも読んでください。Intel x86およびx64システムコール質問、どこにINT 0x80h
、sysenter
そしてsyscall
文脈に入れて…
私は自分の(非常に控えめでまだ準備中の)自律学習ページを作成しました。割り込みと信号信号とトラップが割り込みとどのように関連しているかを理解するのに役立ちます(例:SIGFPE - 0で割る)。