2011-01-17 12 views
1

私はユーザーモードを知っています。ss/espは、後で復元するためにカーネルモードスタックに保存する必要があります。システムコールを開始するとき、どのようにユーザモードのssとespが保存されますか? Linuxで?

問題は、カーネルモードのスタックを見つけるためには、まずss/espに対応するカーネルモードの値をロードする必要があるということです。今では、ユーザーモードのss/espがフラッシュされているようです。次に、ハードウェア/システムがユーザーモードss/espをどのように取得しますか?

いくつかの一時的な場所にユーザーモードとespが保存されていますか?または、動作はx86回路でサポートされていますか?

答えて

0

命令ポインタの処理について考えてみましょう。明らかに、そこにはハードウェアサポートがあるはずです。

最新の「高速システムコール」技術(後で説明します)を取り上げると、特定のプロセッサレジスタを適切に設定して特定のソフトウェア割り込みを発行するだけでシステムコールが要求されることに注意してください。それでは、プロセッサ内の割り込みハードウェアに至ります。

割り込みが発生すると、プロセッサはさまざまなレジスタやその他の情報(命令ポインタやハンドラがそれらを保存する機会を得る前でも変更可能なその他の情報)をカーネルスタックに自動的にプッシュします。さらに、プロセッサがカーネルモードで現在ではなくである場合、スタックポインタとスタックセグメントレジスタをカーネルスタックにプッシュし、カーネルモードに移行して割り込みハンドラを実行します。

"高速システムコール"(SYSENTER命令)を見ると、いくつかのマシン状態レジスタが既に設定されていることがわかります。は状態を保存しません割り込みを発行するよりも速くなります)。呼び出しコードは、システム呼び出しを実行するためにカーネルが必要とするデータと、元の状態に戻す必要のあるデータを非連結レジスタに入れる責任があります。

+0

私には意味があります。 CS/EIPについては、ハードウェアのサポートもあるはずです。障害が発生すると、現在のCS/EIPはすでに「次の」命令を指していますが、障害処理後に同じ命令を再実行するには、元の障害CS/EIPを取得してケルネルモードスタックに保存する必要があります。元のCS/EIPを取得するには、ハードウェアのサポートも必要です。 – Infinite

+0

@SetTimer:どのように動作するのかが完全にはわかりませんが、EIPはパイプラインを通じて他の必要なデータと共に運ばれる可能性が高いです。私はCSが同じように扱われることに疑念を抱いています。それを実行するには多くのトランジスタが必要になりますが、変更するのは非常に一般的なケースではありませんので、CSを変更すると、分岐予測ミスに類似している。しかし、現代のプロセッサーは非常に複雑で、私は確かにどちらかの方法を知らない。 –

関連する問題