私は Linux のアセンブリを行っていますが、フラット メモリ モデルであることを理解しています。私が混乱しているのは、NEAR JMP と FAR JMP です。
NEAR は同じセグメントにあり、FAR は別のセグメントです。私が理解していることから、Linux仮想メモリにはセグメントがありませんか? また、プログラムのコードが複数のセグメントに配置されているかどうかは、どうすればわかりますか?
それは長い間セグメントではありませんでした。プロテクトモードx86の正しい用語はセレクターです。
そうは言っても、ニアジャンプとファージャンプの違いは、前者は同じコードセレクターcs
を維持し、後者は(通常は)それを変更することです。
フラットメモリモデルでは、ほとんどの場合、前者の場合がその方法です。
フラットメモリモデルが複数のセレクターによって提供されるオペレーティングシステムを使用することもできますが、その有用な使用例はわかりません。少なくともx86ではLinuxの動作方法ではありません。
NEAR は同じセグメントにあり、FAR は別のセグメントです。
ニア ジャンプは、現在のコード セグメント内の場所 ( で示されるcs
) にジャンプします。far jump は通常、別のコード セグメント内の場所にジャンプするために使用されますが、far アドレスのセグメント セレクターが の値と一致する場合は、現在のセグメント内の場所にもジャンプできますcs
。
私が理解していることから、Linux仮想メモリにはセグメントがありませんか?
ある種のセグメント化されたメモリを使用する Linux の CPU への移植を見つけても、私は驚かないでしょう。だから、私はそれが依存していると思います。ただし、Linux が x86 プラットフォームでセグメントを使用することはほとんどありません。しかし、繰り返しになりますが、あなたや他の誰かが、リアル モードで動作し、セグメントを使用する小さな Linux を作成することができます。
また、プログラムのコードが複数のセグメントに配置されているかどうかは、どうすればわかりますか?
CPU と OS を確認します。当然、移植可能な C コードを作成する場合、これは問題になりません。
私が理解していることから、Linux仮想メモリにはセグメントがありませんか?
それは十分に正確です。セグメントbaseが指す位置を持つスレッド固有のデータはありますが、far jump に適したセグメントはありません。%fs
また、プログラムのコードが複数のセグメントに配置されているかどうかは、どうすればわかりますか?
ターゲット プラットフォームが Linux の場合、そうでないことはすでにわかっています。(現代のOSがまだセグメントを意味のある方法で使用しているとしたら、私は驚くでしょう)jump far
.