多くの組み込みシステムでは、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によって保護されるため、アプリケーションがこの領域に書き込むときに例外が生成されます。
用語の使用には注意してください。 ROMは、データまたはプログラムコードを記憶することができるが書き込むことができない物理メモリである。読取り専用セグメントは、MMUが書込みを防止するように構成されているメモリのチャンクです。 – ConcernedOfTunbridgeWells