2012-05-05 19 views
3

IRETは、EFLAGS、ESP、EIPなどのスタックからレジスタを復元できますが、すべてのレジスタを自分で復元することもできます。たとえば、 "movl"を使用して%espレジスタを復元すると、 "jmp"はスタックに格納されているEIPを指すアドレスをジャンプできます。割り込みから復帰するときにIRETを使用する必要がありますか?

Linuxカーネルはウェイト命令であるIRETによってすべての割り込みから復帰します。

(コンテキストスイッチのような)カーネル操作の中には、頻繁に起こるものがあります。

IRETは無駄ですか?

+0

「体重の指示」とはどういう意味ですか? –

+0

多くの作業があり、コストがかかります。 –

答えて

9

重いもののほかに、POPF+RETFの単なるブレンドに加えて、しばしば行うべきことがあります。 ノンマスカブル割り込みNMIs)に関連する特別な機能を持っています。

同時にNMIがCPUに1つずつ配信されます。 IRETはNMI回路に信号を送信し、別のNMIを今すぐ配信することができます。このシグナリングは他の命令では実行できません。 NMIが他のNMI ISRの実行を先取りする可能性がある場合、スタックオーバーフローが発生する可能性があります。これはめったに良いことではありません。私たちがこの素晴らしいウェブサイトについて話していない限り。 :)

したがって、すべてで、IRETは無駄ではありません。

+0

IRETだけが割り込みから復帰するときに使用できることを意味しますか? –

+0

それは唯一の選択肢です。 NMIもその一つです。割り込み/例外タスクを使用する場合は、別のタスクです。ダブルフォルトハンドラはタスクでなければなりません。さらに、IRETは、(たとえば、ユーザーモードのコールバックを実行するために)制御を低特権コ​​ードに移行する場合に非常に便利です。それがあれば、それを使わないのはなぜですか? –

+0

: "PICによって割り込みが送信されると、PICはI/Oポートを介して確認応答を受け取るまで同じソースから別の割り込みを送信しません。誰が現在の割り込みハンドラが完了したか、IRETか他の何かを知らせますか? –

0

多分、手動で行うにはさらに多くのCPUクロックが必要なのでしょう。 wikipedijaから

0

割り込みが発生したときに呼び出される実際のコードは 割り込みサービスルーチン(ISR)と呼ばれています。例外が発生すると、プログラム が割り込みを呼び出すか、またはハードウェアが割り込みを発生させると、 プロセッサはISRに コントロールを転送するためにいくつかの方法(説明する)の1つを使用し、ISRは安全にコントロール 実行後に中断したものはすべて完了です。最低でも のFLAGSとCS:IPが保存され、ISRのCS:IPがロードされます。ただし、一部の メカニズムでは、ISRが (および終了時に別のタスクスイッチ)を開始する前に、フルタスクスイッチが発生します。

したがってIRETは、無駄ではありませんが、ISRからの返却は最小限(かつ最速の方法)です。実行の前に、ISRで使用されている他のCPUレジスタもすべて初期化して復元する必要があります。

関連する問題