2012-01-18 12 views
1

あなたがWindows上でプログラムを実行すると、それは次のように整理コンピュータのメモリにロードされています。スタック プログラムはどのようにROMにロードされていますか?

  • コードセグメント
  • データセグメントがあるデータが含まれていてもよい

    • データセグメント
    • 読み取り専用、または読み取りと書き込みのアクセス権があります。

      例えば:

      char *c = "Hello World"; 
      

      ストリングHello Worldは、メモリの読み出し専用セクションに格納されると言われています。それは時々RAMと呼ばれる物理メモリに格納されているのか、それともROMに格納されているのは読み込み専用なのか?読み込み専用の場合は、どのように記述できますか?

    +4

    用語の使用には注意してください。 ROMは、データまたはプログラムコードを記憶することができるが書き込むことができない物理メモリである。読取り専用セグメントは、MMUが書込みを防止するように構成されているメモリのチャンクです。 – ConcernedOfTunbridgeWells

    答えて

    -1

    RAMメモリに格納されます。 ]:>

    +0

    RAMに格納されていますが、それでも読み込み専用ですか? – user1086635

    2

    RAMに保存されます。オペレーティングシステムは、プロセッサ自体と協働して、メモリの領域を保護することができるため、ユーザコードから書き込みを試みると例外が発生します。

    1

    これはRAMに保存されています。

    あなたの例のように、文字列で初期化された文字ポインタは読み取り専用です。 cast a const variable so that you can "write" to itでも可能ですが、プログラムの動作は予測できません。

    RAMの読み取り専用領域は、オペレーティングシステムによって保護されています。

    おそらく、使用しているシステムの種類によって異なります。上記の答えはあなたの標準的なPCのためのものです。組み込みシステムは、実際に定数データをある種の不揮発性メモリに書き込むかもしれません。

    1

    メモリが読み込み専用にできる2つの方法があると考えてください。

    • ハードウェアレベルでは、ROMを参照しています。書かれた/作成されると、それの物理的なプロパティは値を変更することはできません。
    • ソフトウェアレベルでは、OS(またはユーザーのプログラム空間よりも高いレベル)が、RAMに格納された値の変更を防止します。

    プログラム値の読み取り専用メモリについては、一般的に2番目のタイプについて説明しています。値はプログラムの開始時に初期化され、OSは変更を許可しません。

    注:上記は非常に単純な説明ですが、一般的な考え方を示しています。

    2

    PCには、実際にROMと見なされる領域が1つしかないため、BIOSが格納されています。すべてのWindowsおよびWindowsにロードされたプログラムはRAMに格納されます。

    x86プロセッサのメモリ管理では、メモリブロックを読み取り専用としてマークできますが、これを可能にするにはリンカとOSが連携しなければなりません。これは、プログラムがメモリにロードされた後に発生します。

    2

    多くの組み込みシステムでは、RAMといくつかのタイプのRead Only Memory(Flashと呼ばれることもあります)があります(これはPrinted Circuit Boardから取り外されずに複数回プログラムできます)。

    単純な組み込みアプリケーションは、実行可能セクションと読み取り専用データセクションをFlashに置き、Flashから実行します。読み出し/書き込み変数はRAMに配置されます。私たちはあなたの例のコードの一部は、このモデルを考えてみましょう:上記の文で

    char * c = "Hello World!"; 
    

    、変数c生活をRAM内の変数のデフォルト設定は&書き込み読み出しアクセスをしているため。あなたは変数が一定であることを指定した場合、それはROMに住んでいるでしょう{実際には、ROM内の位置を表しているでしょう。}:ここにコードを入力

    char * const c = "Hello World!"; // A constant pointer that lives in ROM. 
    

    コンパイラは、リテラルテキスト"Hello World!"は少し複雑扱います。実際のテキストは、実行可能領域またはデータ領域のいずれかにあるROMに格納されます。翻訳者に依存します。多くのコンパイラはメモリをRAMに割り当て、その文字列をRAMにコピーし、変数cをRAMのコピーを指すようにします。これは定数が定数として指定されていないためです。定数データを指し示す変数を宣言し、RAMにリテラルのコピーを避けるために

    const char * c = "Hello World"; // A pointer to constant data. 
    

    定義上記は、まだポインタが実行中に別のものを指すことができます。あなたがプログラム全体リテラルテキストの1つのインスタンスを参照したい場合は、一定のデータに一定のポインタを宣言します。

    const * char * const c = "Hello World!"; // A constant pointer to constant data 
    

    この手法は、実行可能ファイルが(速く実行するために)RAMにロードし、まだ読み取り専用アクセスすることができますROMからのデータ(真の読出し/書込み変数のためにSRAMを解放する)。

    ほとんどのPCでは、すべてが不揮発性メモリ(ハードドライブ、BIOSなど)またはRAM上に存在します。一般的な方法は、ROM(ハードドライブを含む)からプログラムをロードし、RAMで実行することです。実行可能ファイルをRAMにロードするとき、OSは通常、読み取り専用データをRAMにもロードします。読み取り専用データはOSによって保護されるため、アプリケーションがこの領域に書き込むときに例外が生成されます。