3

これは私の推測です:

esp0 は、カーネル スタックのトップ アドレスで初期化されます。カーネル スタックが割り当てられ、プロセスの切り替え中に tss->esp0 を初期化するために使用されます。これにより、コンテキストがユーザー モードからカーネル モードに切り替わったときに、カーネル スタックを見つけることができます。一方、esp は、プロセスの切り替え中にスケジュールされるプロセスのカーネル スタック トップを保存するために使用されます。

したがって、thread_struct の esp0 は初期化されると変更されませんが、esp は変更されます。

私の推測は正しいですか?

4

1 に答える 1

1

thread_struct構造には、これらのESPフィールドの2つが含まれています。それらはとesp0ですesp。ただし、これらは構造内の4つのフィールド、つまり、、、およびに関連しています。tss_segment_32esp0esp1esp2esp

これらは実際にはTSSに存在するため、Linus et alからのものではなく、Intelからのものです。

TSSにそれらが含まれている理由については、保護モデルがx86でどのように機能するかを知っていれば、数値は論理的です。esp実際には、これらはリングレベルです(実際には呼び出されていないにもかかわらず、リングレベル3の場合を除きますesp3)。

つまり、実行しているリングで使用されるスタックポインタが含まれています。Linuxはリング0(カーネルモード)とリング3(ユーザーモード)のみesp0を使用espするため、保存する必要があるのはこれらだけです。 。


余談ですが、私が今まで見た中で別のリングを使用しているOSは、特定のI/O操作にリング2を使用したOS/2だけだったと思います。これらの操作の実行を許可されたプロセスは特別にマークする必要があり、OSはそれらをリング2で実行して、カーネルを停止することなく、無制限のI/Oアクセスを許可します。

于 2011-01-19T09:13:01.447 に答える