4

IRET は、EFLAGS、ESP、EIP などを含むスタックからレジスタを復元できますが、すべて自分でレジスタを復元することもできます。たとえば、「movl」を使用して %esp レジスタを復元できます。「jmp」を使用すると、スタックに格納されている EIP を指すアドレスにジャンプできます。

Linux カーネルは、重み付け命令である IRET によってすべての割り込みから復帰します。

一部のカーネル操作 (コンテキスト スイッチなど) は頻繁に発生します。

IRETはもったいない?

4

3 に答える 3

9

. IRET_ POPF+RETF_ ノンマスカブル割り込み( )に関する特殊な機能を持っていNMIsます。

並行 NMI は 1 つずつ CPU に配信されます。IRET別の NMI を配信できるようになったことを NMI 回路に通知します。他の命令は、このシグナリングを実行できません。NMI が他の NMI ISR の実行を先取りできる場合、スタック オーバーフローを引き起こすことができますが、これは良いことではありません。この素晴らしいウェブサイトについて話している場合を除きます。:)

ですから、全体としてIRET、無駄ではありません。

于 2012-05-05T15:51:30.607 に答える
0

おそらく、すべてを手動で行うと、さらに多くの CPU クロックが必要になるためです。

于 2012-05-05T14:44:22.067 に答える
0

ウィキペディアから:

割り込みが発生したときに呼び出される実際のコードは、割り込みサービス ルーチン (ISR) と呼ばれます。例外が発生した場合、プログラムが割り込みを呼び出した場合、またはハードウェアが割り込みを発生させた場合、プロセッサはいくつかの方法 (後述) のいずれかを使用して制御を ISR に転送し、ISR は割り込み後に制御を安全に戻すことができます。実行が完了しました。少なくとも、FLAGS と CS:IP が保存され、ISR の CS:IP がロードされます。ただし、一部のメカニズムでは、ISR が開始する前に完全なタスク スイッチが発生します (また、ISR が終了すると別のタスク スイッチが発生します)。

無駄ではありません。ISRIRETから戻るのは最小限 (そして最速の方法) です。また、ISR で使用される他のすべての CPU レジスタは、最初に保存し、実行前に復元する必要がありますIRET

于 2012-05-05T14:56:58.957 に答える