0

そのため、x86-64 ではメモリ セグメンテーションが廃止されましたが、アセンブリを使用すると、コードで .code および .data セクション/セグメントを指定でき、スタック ポインター レジスタもあります。

また、スタック セグメント、データ セグメント、およびコード セグメント レジスタ。

コード/データ/スタックの分割はどこでどのように行われますか? CPU または OS によって実装されますか?

C プログラムをデバッグして逆アセンブル ビューを表示すると、アドレス空間は分割されずに線形になるためです。

そして、データ セグメントにグローバル、静的、およびヒープの「パーツ」があると彼らが言うとき、これは OS の抽象化ですか?

4

1 に答える 1

2

メモリ使用量を考えるには、別のモデルを使用する必要があります。次のような属性を持つプログラムセクションを使用してメモリを考えてください。

  • コード: 実行可能、読み取り可能、書き込み不可
  • 静的データ: 非実行可能、読み取り可能、書き込み不可
  • 変更可能なデータ: 実行不可、読み取り可能、書き込み可能 (デマンド ゼロ領域を追加することもできます)

これらの属性は、ページ レベルで設定できます。システムでは、ページをインターリーブすることができます

コード データ コード データ コード データ

通常、リンカーは同様のセクションをまとめますが、ページングを使用すると、ほぼすべての方法でメモリをレイアウトできます。通常のメカニズムでは、セクションに名前を付けると、リンカーは同じセクションを持つものを集めてグループ化します。

Ye Olde 8086 のセグメンテーション システムによる制限はありません。

その後、パーツはオペレーティング システムとリンカーによって管理されます。

于 2015-01-18T19:45:47.533 に答える