2

32 ビット保護モード (明らかに x86) で PIT IRQ ハンドラーからの戻り値を確認するにはどうすればよいですか? 私はそれができると思いますが、完全にはわかりません。

pop eax ; pop last thing from stack
mov dword return_address,eax
push eax
iret 
4

2 に答える 2

5

これにより、スタックから適切なアイテムが読み取られますが、このようにすると、が破損しeaxます。

適切なISRは、実行が終了するまでに、使用されているすべてのレジスタをISRの開始時の状態に復元する必要があります。

注意すべきもう1つのことreturn_addressは、セグメントレジスタ(ここでは)を介して(暗黙的に)参照されることdsです。dsISRとISRが割り込むコードで常に同じであれば、これは問題ありません。ただし、中断されたコードが変更された場合ds、ISRはds最初に保存し、適切なセレクター値に設定して使用し、復元する必要があります。これを行わないと、そのmov命令によってメモリが破損したり、例外が発生したりする可能性があります。

于 2012-09-16T09:02:45.257 に答える
0

もっと似たようなもの

push eax
push ds
mov eax,cs:saved_ds
mov ds,eax
mov eax,[esp+8]
mov return_address,eax
pop ds
pop eax
iret

eaxを保持し、任意のセグメント値を処理できます。saved_ds上記のISRを実行する前に、「ds」セグメントレジスタを保存する必要があります。レジスターを使用しcsてアクセスします。ほとんどの(すべて?)プラットフォームは、csのベースがdsのベースと等しく、csが読み取り可能です。

通常、ISRはIRQを確認する必要があります(コードはソフトウェア割り込みフックですか?)。あなたのコードはそれを示していないので、質問のあなたのコードフラグメントは実際のコードの単純化されたバージョンであると私は考えました。

于 2013-01-21T23:20:16.773 に答える