5

x86 アーキテクチャには、SS、CS、DS、FS、GS などのいくつかのセグメント レジスタがあります。

これらの 16 ビット レジスタは LDT、GDT エントリ (セグメント セレクタとして) を示し、MMU はこれ (GDT、LDT) を参照してセグメント ベース + オフセット値を計算することを知っています。権限などを確認します。

私が興味を持っているのは、誰が何に基づいてセグメント レジスタの内容を記入しているのかということです。カーネルスケジューラ?

また、アプリケーションがセグメント レジスタの値自体を変更するとどうなるでしょうか。CSだけは現行CPUのCPLを持っているので変えられないのは分かっています。ただし、他のレジスタ (SS、DS...) は変更できます。

4

1 に答える 1

5

誰が何に基づいてセグメント レジスタの内容を入力するのですか??(カーネル スケジューラ??)

ブートローダーが行います。ISR と例外ハンドラが行います。システム コール ハンドラが行います。スケジューラが行います。他の部品が必要になる場合があります。レジスタはプライベートであると見なされ、さまざまなコンテキスト スイッチ中に保存および復元する必要があります。そしてもちろん、それらも以前の時点で初期化する必要があります。

それらのレジスタに必要なものに基づいています。それらの値は、OS のさまざまな部分間およびさまざまなプログラム間で普遍的に共有されるわけではありません。

また、アプリケーションがセグメント レジスタの値を変更するとどうなるでしょうか。CSだけは現行CPUのCPLを持っているので変えられないのは分かっています。ただし、他のレジスター (SS、DS...) は変更できます。

何が起こるのですか?正常に変更されるか、例外 (通常は #GP) が発生し、例外ハンドラーの動作が何であれ発生します。または、例外ハンドラーがないかバグがある場合は、トリプル フォールト、CPU リセット、およびおそらくコンピューター全体の再起動が発生します。

現在の特権レベルで他に何をロードできるかを何らかの方法で知っている場合は、任意のセグメント レジスタを変更できます。プログラムがレベル 3 で、OS によって DPL=3 が設定されたコード セグメントが 2 つある場合、プログラムはそれらのいずれかを CS レジスタに使用できます。それがわからない場合は、プログラムをクラッシュさせる可能性が高くなります。

x86セグメントレジスタの詳細を知りたいです。

以下のコピーを入手して読んでください。

Intel® 64 and IA-32 Architectures Software Developer's Manual まとめてボリューム: 1、2A、2B、3A、および 3B。

関連する章 (メモリ管理、割り込み/例外処理、タスク切り替え) を参照するか、特定のレジスタ (CS、SS、DS など) を検索するか、特定の命令の説明と疑似コードを調べることができます。

このあいまいな質問に対して、これ以上正確な回答を得ることはできません。

于 2013-01-24T01:04:37.960 に答える