1. ホーム
  2. assembly

[解決済み] FS"/"GS "レジスタは何のためにあるのですか?

2022-08-22 02:26:21

質問

以下のレジスタとその用途がわかるのですが。

  • CS = コードセグメント (IPに使用)

  • DS = データセグメント (MOVに使用)

  • ES = デスティネーションセグメント(MOVSなどに使用)

  • SS = スタックセグメント(SPに使用)

しかし、以下のレジスタは何のために使われるのでしょうか?

  • FS = "File Segment"?

  • GS = ?

注:私は ではない 特定のオペレーティング システムについて尋ねているのではなく、CPU が何のために使用することを意図しているかについて尋ねているのです。

どのように解決するのですか?

WindowsやLinuxで使用されているもので、意図していたものがあります。

セグメント レジスタの背後にある本来の意図は、独立した永続的な仮想ストアの一部であることを意図したメモリの多くの異なる (大きな) セグメントに、プログラムがアクセスすることを可能にすることでした。 このアイデアは 1966 Multics オペレーティング システム このアイデアは、ファイルを単にアドレス指定可能なメモリ セグメントとして扱った から採用されました。 BS の「ファイルを開く、レコードを書き込む、ファイルを閉じる」機能はなく、ただ「この値をその仮想データ セグメントに保存する」だけです。

現在の 2010 年のオペレーティング システムは、大きく後退しており、それが「宦官」と呼ばれる理由です。 アドレス指定できるのは あなたの プロセス空間の単一セグメントしかアドレス指定できないため、いわゆるフラットな (IMHO の鈍い) アドレス空間となります。 x86-32 マシンのセグメント レジスタはまだ本当のセグメント レジスタとして使用できますが、誰も気にしていません (前インテル社長のアンディ・グローブは、前世紀にインテルのエンジニアたちがエネルギーと資金を使ってこの機能を実装したのに、誰もそれを使おうとしないことに気づいて、かなり有名な公開発作を起こしています。 頑張れ、アンディ!)

AMD は 64 ビット化に際して、Multics を選択肢から排除してもかまわないと考え (これは慈善的な解釈です。慈善的でない解釈は、彼らは Multics について無知だったということです)、64 ビット モードでのセグメント レジスタの一般機能を無効化しました。 スレッドがスレッドローカルストアにアクセスする必要性はまだあり、各スレッドはスレッドローカルストアへのポインタ、つまりすぐにアクセスできるスレッド状態(たとえばレジスタ)のどこかを必要としていました。 Windows と Linux は 32 ビット版でこの目的のために FS と GS(明確にしてくれたニックに感謝)を使っていたので、AMD は 64 ビットのセグメントレジスタ(GS と FS)を基本的にこの目的だけに使うことにした(プロセス空間のどこでもポイントできるようにできると思うが、アプリケーションコードがそれらをロードできるかどうかは分からない)。 Intel は、64 ビットで AMD にシェアを奪われたくないというパニックと、Andy が引退したことにより、AMD のスキームをそのままコピーすることにしたのです。

各スレッドのメモリ マップに、そのスレッドのローカル ストレージである絶対仮想アドレス (たとえば、0-FFF など) を持たせる方がアーキテクチャ的にきれいだったと思います (「セグメント」レジスタ ポインタは必要ありません!)。

つまり、セグメント レジスタは、現在では付録のようなものです。

つまり、セグメント レジスタは、今では盲腸のようなもので、名残の目的を果たしているのです。 私たちの集団的損失です。

歴史を知らないものは、それを繰り返す運命にあるのではなく、より愚かなことをする運命にあるのです。