3

私はx86asmプログラム(ブートローダー)をリアルモードでプログラミングしてきましたが、セグメントやレジスターなどの使い方を知っています。

OllyDbgなどのデバッガーから、DSレジスター、SSなどが明らかに使用されていることがわかります。しかし、通常の「Windowsのような」プロセスはそれらをどのように使用しますか?セグメンテーションが部分的に使用され(ring0をring3から分離するためだけに)、それらのエントリがGDTにあること、ページングが含まれていること、およびアドレスがPDEとPTEで完全に混乱することを知っていますが、完全に「リンク」することはできません。 「すべてをまとめて、追加のセグメントがどのようなデータスタックであるかを理解します。各プロセスには異なるDS / SS / ESがありますか?

4

2 に答える 2

2

通常、x86プロテクトモードとx86-64ロングモードの両方で、セグメンテーションは実質的に使用されません(フラットメモリモデル)。4つの主要なセグメント記述子があり、それぞれがアドレス空間全体へのアクセスを許可します:ring0コード、ring0データ、ring3コード、ring3データ。メモリ保護は、ページングを使用して実施されます。したがって、一般に、すべてのプロセスには同じCS、DS、SS、ES値が与えられます。

一部のオペレーティングシステムは、ローカルデータのアドレス指定にFSおよびGSセグメントを使用することに注意してください。たとえば、WindowsのTIBです。

x86保護モードでは、このような動作はオプションであり、カーネルはメモリ保護のために複数のセグメントを自由に使用できますが、x86-64では、ロングモードのセグメンテーションは一般に無効になり、オペレーティングシステムはフラットメモリモデルを使用する必要があります(ただし、ローカルデータとオペレーティングシステム構造のアドレス指定にFSとGSを引き続き使用できます)。

また、x86およびx86-64アーキテクチャに関するこの貴重な情報源を確認することもできます。Intelマニュアル3A(セクション3.2で、セグメンテーションに関するすべての疑問を明確にする必要があります)

于 2012-10-06T18:41:35.513 に答える
2

INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986から:

Figure 5-1.  Address Translation Overview

             15           0      31                           0
    LOGICAL ╔═══════════════╗   ╔══════════════════════════════╗
    ADDRESS ║    SELECTOR   ║   ║            OFFSET            ║
            ╚═══════════╤═══╝   ╚═══╤══════════════════════════╝
                        v           v
                     ╔══════════════════════════════╗
                     ║     SEGMENT TRANSLATION      ║
                     ╚══════════════╤═══════════════╝
                                 ╔══╧═╗       PAGING ENABLED
                                 ║PG ?╟────────────────────┐
                                 ╚══╤═╝                    │
                   31        PAGING v DISABLED       0     │
          LINEAR  ╔═══════════╦═══════════╦═══════════╗    │
          ADDRESS ║    DIR    ║   PAGE    ║  OFFSET   ║    │
                  ╚═══════════╩═════╤═════╩═══════════╝    │
                                    v                      │
                     ╔══════════════════════════════╗      │
                     ║       PAGE TRANSLATION       ║      │
                     ╚══════════════╤═══════════════╝      │
                                    │<─────────────────────┘
                      31            v              0
            PHYSICAL ╔══════════════════════════════╗
            ADDRESS  ║                              ║
                     ╚══════════════════════════════╝


Figure 5-2.  Segment Translation

           15              0    31                                   0
  LOGICAL ╔════════════════╗   ╔═════════════════════════════════════╗
  ADDRESS ║    SELECTOR    ║   ║                OFFSET               ║
          ╚═══╤═════════╤══╝   ╚═══════════════════╤═════════════════╝
       ┌──────┘         v                          │
       │ DESCRIPTOR TABLE                          │
       │  ╔════════════╗                           │
       │  ║            ║                           │
       │  ║            ║                           │
       │  ║            ║                           │
       │  ║            ║                           │
       │  ╠════════════╣                           │
       │  ║  SEGMENT   ║ BASE          ╔═══╗       │
       └─>║ DESCRIPTOR ╟──────────────>║ + ║<──────┘
          ╠════════════╣ ADDRESS       ╚═╤═╝
          ║            ║                 │
          ╚════════════╝                 │
                                         v
              LINEAR  ╔════════════╦═══════════╦══════════════╗
              ADDRESS ║    DIR     ║   PAGE    ║    OFFSET    ║
                      ╚════════════╩═══════════╩══════════════╝

Windowsでは、ほとんどの場合、ほとんどのプロセスでDS = ES = SSであり、CSとDSの値はすべてのプロセスで共有されます。プロセスはセグメントレジスタを変更する場合がありますが、必要になることはめったにないため、ほとんどの場合、同じCS値とDS / ES/SS値のセットが表示されます。カーネルは独自のCSとDSを使用します。

于 2012-10-06T18:43:28.670 に答える