2012-02-02 5 views
1

システムコール、例外、0で割ったものなど、それらはすべてlinuxで同じベクトルエントリを持っています。 x86の場合は0x80です。だからシグナルはどうですか? OSはプロセスへのシグナルにint 0x80も使用しますか?はいの場合、誰がそれを呼び出しますか?カーネルにトラップが必要な場合、システムコールのようにint 0x80またはそのラッパーをコールする必要がありますが、0x80を呼び出すシグナルの場合は?linuxのシグナルの場合、whoはint 0x80を呼び出しますか?

+2

おそらく混乱しています。シグナルはカーネルによってアプリケーションプロセスに送られます(したがって、 'int'やトラップは必要ありません)。 http://basepath.com/aup/ http://www.advancedlinuxprogramming.com/ http://tldp.org/HOWTO/Assembly-HOWTO/ –

+0

int 80hを使用して割り込みを生成します(CPUは実行を停止します)。現在のコードをintに変換してベクトルにジャンプします)。 「0で割る」は割り込みを生成する別の方法です(DIVの2番目の引数が0のときにCPU自身によって生成されます)、 'int 0h'のように処理します。ベクタ要素が特定の** Interrupt handler **を指しています。これはOSカーネルの一部です。ハンドラは何をすべきかをチェックし、動作は各int番号ごとに異なります。例えば。ハンドラは選択されたシステムコールを開始します(ユーザモードからカーネルモードに切り替える)。 0時には信号を発生します。 – osgx

答えて

6

まずは。 int 0x80は、現代のIntelのCPU上で、現代のOSでは長い間使用されていません。 sysenter命令は通常は現在使用されています(http://siyobik.info/main/reference/instruction/SYSENTER参照)。信号用として

、あなたは2例がある - 信号が送信されたときに、信号のターゲットがCPU上で実行されていない場合

を、その後、信号を送信することは、その後の何物でもありませんカーネルデータのビットをマーキングそれは、そのプロセスをCPUに戻してプログラムカウンタを元のPCではなく信号処理ルーチンに置くことをカーネルに示した構造です。

信号が送信されたときに信号を送るプログラムがCPU上で実行されている場合、信号は割り込みとしてトリガされます。信号が同期(たとえばゼロ除算など)の場合、割り込みは例外コアはCPUコアから生成されます。シグナルが非同期(シグナルを送信している別のコアで実行されている別のプロセスなど)の場合、割り込みは他のコアから送信されたプロセッサ間割り込みです。

したがって、int 0x80はどこでも:-)

4

基本的に信号は割り込みと似ていません。ユーザーレベルのプロセスは、カーネルによって定期的に中断されます。ユーザーレベルのプロセスにシグナルを送信しようとするとき、カーネルはユーザーレベルのプロセスの命令ポインタをシグナルハンドラのコードにポイントさせてから、再度スケジューリングします。それに応じて、スタックやその他のレジスタも設定します。

+0

遠距離から概念的には(ただし詳細ではないが)非同期信号は割り込みのようなものであることを除いて合意されている...(もちろん割り込みではないとしても) –

+1

Pls、質問を読んでください。 "ゼロ除算"は割り込み(ソフトウェアで生成された同期)で、http://pdos.csail.mit.edu/6.828/2005/lec/lec8-slides.pdfを参照してください。カーネル内の割り込みハンドラによって処理されます(ここでは、ハンドラhttp://lxr.linux.no/#linux+v2.6.33/arch/x86/kernel/traps.c#L891の設定があります)。(do_trap関数で)保留中のシグナルの "フラグ"をセットし、 'force_sig_info'で即座にシグナルを送るようにします。 – osgx

3

syscallに電話すると、int 0x80を使用します。

SIGSEGVまたはSIGFPEのいずれかの信号を受信した場合は、int 0x80に電話する必要はありません。

sched_tickの呼び出しを処理するタイマ割り込みが、ユーザー空間プロセスに制御を戻す前に保留中の信号があるかどうかをチェックし、存在する場合(信号マスクが許可する場合)、適切な信号を呼び出しますハンドラ。

+2

また、シグナルが受信されると、カーネルはコールスタックを設定して、' sigreturn'システムコールがユーザーのシグナルハンドラから戻った直後に呼び出されます。 –

+0

戻り値のプログラミングは、その最高の= D – cha0site

関連する問題