SYSENTER
古いCPUアーキテクチャでは、オペレーティングシステムの割り込み(Windowsの使用:INT 0x2E)は、システムコールを実装し、CPUは現在、急速なシステムコール(高速システムコール)をサポートします。
リングに命令0 SYSENTERを使用してクイック呼び出しは、ここでは「インテルのホワイトペーパーは、」SYSENTERの実行のプロセスを説明します:
1.ロードCSレジスタにIA32_SYSENTER_CSからセグメント・セレクタ。
2.ロードEIPレジスタにIA32_SYSENTER_EIPからの命令ポインタ。
IA32_SYSENTER_CSの値とSSレジスタにロードし3.追加8。
4.ロードESPレジスタにIA32_SYSENTER_ESPからスタックポインタ。
5.特権レベル0に切り替えます。
フラグが設定されている場合、EFLAGS 6.クリアVMフラグは、登録します。
7.選択されたシステム・プロシージャの実行を開始します。
簡単の集計である:計算CS + 8:SSである式により、複数のレジスタから値CS、EIP、SS、ESP MSRを取得し、充填されました。
:WinDbgのコマンド(リードMSR)を使用することができますとRDMSRアドレスを表示MSRの内容を。
KD> RDMSR 174
MSR [174] = 00000000`00000008
KD> RDMSR 175
MSR [175] = 00000000`f8ac2000
KD> RDMSR 176
MSR [176] = 00000000`8053e540
SYSENTERと割り込みは、データがメモリを読み出すのではなく、登録SYSENTER MSRによって読み取らので、相対的効率の速度が高いほど、環のエントリ0の対象にしています。
スタックの異なる内容:しかし、結果はいくつかの違いがあるでしょう。割り込み入力として 0 SSリング3つのリングを、ESP、EFLAGS、CSは、EIPは、CPUがスタックにプッシュされますが、これらのレジスタのSYSENTER値に押し込まれていません。Windowsは準備ができて0リングの入り口に、中断してすばやくアクセスすることだった理由です。
KiFastCallEntryを探します
MSR [上記で得られたIA32_SYSENTER_EIP ] 0リングそのWindowsアドレスへの迅速なアクセスのための缶関数エントリ:0x8053e540が。
KD> U 8053e540
NT KiFastCallEntry !:
8053e540 b923000000 MOV ECX、23H
8053e545 6a30プッシュ30H
8053e547 0fa1ポップFS
8053e549 8ed9 MOV DS、CX
8053e54b 8ec1、CX
8053e54d 8b0d40f0dfff ECX、DWORD PTR DS:[0FFDFF040h]
8053e553 8b6104 MOV ESP、DWORD PTR [ECX + 4]
8053e556 6a23プッシュ23H
切り替えレジスタ
入力されたKiFastCallEntryはすぐにFS / DS / ES / ESPこれらのレジスタを変更します。
もっと面白いです
- すぐに0x30をを使用して、FS、
- DS / ESすぐ0x23の数です。
- ESP直接TSS.Esp0になった切り替え。
保存サイト
int2e自動的SS / ESP / EFLAGS / CS /手動でスタックにこれらの5つのレジスタをプッシュするように、これらの5件のスタックに登録するが、迅速ではないコールをEIP。
それは注目に値する:KTRAP_FRAME.EipがSystemCallReturnアドレスに設定されて。
遂に
最終的なコードとKiSystemService非常に類似している。このコードが実行された後、SharedCodeに直接ジャンプします。