3

OSDev wiki で、x86 アーキテクチャの保護モードを使用すると、コードとデータ用に個別のセグメントを作成できますが、コード セクションに書き込むことはできません。その Windows (はい、これはプラットフォームです) が新しいコードをコード セグメントに読み込み、データがデータ セグメントに作成されます。しかし、この場合、プログラムはセグメントをデータ セグメントに切り替える必要があることをどのように認識しますか? 私が正しく理解していれば、すべてのアドレス命令は、記述子を切り替えない限り、コードを実行するセグメントを指しているからです。しかし、私はまた、非常に収集されたフラットメモリモデルにより、コードとデータを1つのセグメント内で実行できることも読みました。しかし、私はこれをアセンブラに関連してのみ読みました。では、Windows で C でコンパイルされたコードはどうなるのでしょうか? ありがとう。

4

2 に答える 2

3

説明中のセグメントには 2 つの意味があります。

  • 8086 メモリ アドレス セグメント
  • オブジェクト モジュール プログラム セクション セグメント

1 つ目は、80386+ セグメント レジスタにロードされる内容に関連しています。物理メモリの開始アドレス、メモリ割り当ての長さ、許可された読み取り/書き込み/実行アクセス、および低から高へ、またはその逆に成長するかどうかが含まれます(さらに、「参照時のコピー」などのいくつかのあいまいなフラグ)。

2 番目の意味は、オブジェクト モジュール言語の一部です。基本的に、 という名前codeのセグメント、data(初期化されたデータを含む) という名前のセグメント、および(シンボルで始まるブロックをbss意味する 1960 年代のアセンブラーの疑似命令にちなんで名付けられた) という名前の初期化されていないデータのセグメントがあります。)。リンカがオブジェクト モジュールを結合すると、すべてのコード セグメントが一緒に配置され、すべてのデータ セグメントが別の場所で一緒に配置され、bss も一緒に配置されます。ローダーがメモリ アドレスをマップするとき、コード スペースの合計を調べて、少なくともそのサイズの CPU メモリ割り当てを割り当て、(仮想メモリの状況で) セグメントをコードにマップするか、割り当てられたメモリにコードを読み込みます。メモリを一時的にデータ書き込み可能に設定する必要があります。書き込み保護は、CPU のページング メカニズムとセグメント レジスタによって行われます。これは、たとえば、誤ったデータ アドレスによるコード書き込みの試行を保護するためです。ローダーは、2 つのデータ セグメント グループに対しても同様の設定を行います。(他に、スタックセグメントの設定と割り当て、共有イメージのマッピングがあります。)

x86 実行命令に関する限り、各オペランドには関連付けられたセグメント レジスタがあります。これらは明示的な場合もあれば、暗黙的な場合もあります。コードは、またはレジスタが関係するときはいつでも暗示されるCSスタック を介して暗黙的にアクセスされ、他のほとんどのオペランドについても暗示されます。 、、およびは、 およびのような一部の文字列命令を除いて、他のすべての場合にオーバーライドとして指定する必要があります。フラット モデルでは、すべてのセグメント レジスタが同じアドレス空間にマップされますが、CS では書き込みが許可されません。SSESPEBPDSESFSGSmovscmps

最後の質問に答えると、CPU には、プロセスのフラットな仮想メモリ空​​間にアクセスするために、一度に 4 つ (またはそれ以上) のセグメント レジスタが設定されます。各オペランド アクセスは、その命令に適しているかどうか (CSアドレスをインクリメントしないなど) がチェックされ、ページング保護ユニットによって許可されているかどうかもチェックされます。

于 2010-05-02T18:14:25.837 に答える
3

あなたが読んだ情報は古くなっています。~1993 以降の Windows バージョンでは、フラットな 32 ビットの仮想メモリ空​​間が使用されています。CS および DS セグメント レジスタの値はもはや問題ではなく、変更できません。コードとデータの概念はまだあり、現在はメモリ ページ属性によって実装されています。VirtualProtectEx() API 関数の flNewProtect 引数で渡される許容値を確認してください。

この API を自分で使用することはほとんどありません。属性は実行可能イメージ ローダーとヒープ マネージャーによって設定されます。

于 2010-05-02T19:03:41.303 に答える