いくつかのオペコード逆アセンブリを使用するLinuxカーネルのページフォールトハンドラーで、x86アーキテクチャでは、CALLまたは0xE8命令が書き込みフォールトをスローし、ESIとEDIが両方ともNULLであることがわかります。CALLはメモリアドレスを取得し、EIPをその値に変更するだけであり、EIP + Relative_offsetであるため、ページを必要としないため、これには特定の理由があるのではないかと思いました。誰かがこれを片付けることができればそれは大いにありがたいです。
1 に答える
8
call
命令は変更されるだけでなく、変更前eip
に現在のeip
(次の命令を指すように更新された)スタックに書き込む必要もあります。タイプのjmp
命令はあなたが提案するように機能しますが、後で現在の場所に移動call
できる必要があるという点で少し異なります。ret
コード、完全なレジスタの内容、およびページテーブル(質問の場合は大量の情報になります)を提供していないため、わかりませんが、最も可能性の高い説明は、スタックが現在あることです。スイッチアウトし、買い戻す必要があります。
私が最初に考えたもう1つの可能性は、ジャンプ先のアドレスが非居住者であるということでしたが、それ自体に障害が発生することはないと思いますcall
。
その後、CPUが次の命令をフェッチしようとしたため、すぐに障害が発生しますが、それはあなたの説明が示していることではないと思います。
- あなたはそれがで起こっていると述べてい
call
ます; と - これは読み取り障害であり、書き込み障害ではありません。
esi
とedi
値は問題ではありません-それらはに参加しませんcall
。
于 2011-06-23T20:31:38.120 に答える