1

いくつかのオペコード逆アセンブリを使用するLinuxカーネルのページフォールトハンドラーで、x86アーキテクチャでは、CALLまたは0xE8命令が書き込みフォールトをスローし、ESIとEDIが両方ともNULLであることがわかります。CALLはメモリアドレスを取得し、EIPをその値に変更するだけであり、EIP + Relative_offsetであるため、ページを必要としないため、これには特定の理由があるのではないかと思いました。誰かがこれを片付けることができればそれは大いにありがたいです。

4

1 に答える 1

8

call命令は変更されるだけでなく、変更前eipに現在のeip(次の命令を指すように更新された)スタックに書き込む必要もあります。タイプのjmp命令はあなたが提案するように機能しますが、後で現在の場所に移動callできる必要があるという点で少し異なります。ret

コード、完全なレジスタの内容、およびページテーブル(質問の場合は大量の情報になります)を提供していないため、わかりませんが、最も可能性の高い説明は、スタックが現在あることですスイッチアウトし、買い戻す必要があります。

私が最初に考えたもう1つの可能性は、ジャンプ先のアドレスが非居住者であるということでしたが、それ自体に障害が発生することはないと思いますcall

その後、CPUが次の命令をフェッチしようとしたため、すぐに障害が発生しますが、それはあなたの説明が示していることではないと思います。

  • あなたはそれがで起こっていると述べていcallます; と
  • これは読み取り障害であり、書き込み障害ではありません。

esiedi値は問題ではありません-それらはに参加しませんcall

于 2011-06-23T20:31:38.120 に答える