フラッシュとRAM:コード実行


13

私は最近、アセンブリの学習を開始し、リンカスクリプトおよびハードウェアプログラミングのその他の低レベルの詳細について知るようになりました。また、コンピューターアーキテクチャーについても学んでおり、その過程のどこかで、メモリモデルの私の写真がずっと間違っているのではないかと恐れるようになりました。

私が現在理解していることによると、すべてのコードとデータは、バイナリをプロセッサに「焼き付け」た直後に不揮発性メモリに存在します。揮発性のRAMにはリセット時に何も含まれません。プログラムが「実行」を開始すると、ほとんどの場合(AFAIK)Flashの最下位アドレスであるアドレス0x0000から実行されます。そのため、命令はフラッシュをCPUコアに接続するバスにラッチされ、実際の実行が行われます。ただし、CPUがメモリからデータを取得または保存することについて話すとき、通常はRAMについて話します-プログラムメモリからもデータを読み書きできることを認識しています(これはAVRで行われました)しかし、それはそれほど一般的ではありませんか?RAMがROMよりも高速であるため、そこにデータを保存することを好みますか?

この質問に対する受け入れられた答えは、ほとんどのコードがRAMから実行されることを示しています。

これは、スタートアップランタイムコード(それ自体がFlashから実行される)がすべてのプログラムオペコードをFlashからRAMにコピーし、何らかの方法でFlashのアドレスをRAMにマップしてCPUがそこからオペコードをフェッチする必要があることを意味しますか?起動時に.dataセクションをROMからRAMに移動するプロセスに似ていますか?

これは、プログラムとデータメモリがバスを共有するフォンノイマンアーキテクチャではより単純であると想像できますが、ハーバードアーキテクチャでは、すべてのコードとデータが最初にCPUレジスタを通過する必要があるということではありませんか?

おそらく推測できるように、私はこのビジネス全体に少し混乱しすぎています。常により高い抽象化レベルでプログラミングしてきたので、私はそのような詳細に簡単に困っています。どんな助けも大歓迎です。


2
単純なマイクロコントローラでは、実行するためにプログラムメモリ(最近では多くの場合フラッシュ)からRAMにコピーする必要はありません。
デビッド

これはすべて、RAMはフラッシュよりも高速であるためですが、電力が失われるとデータが失われるため、不揮発性メモリフラッシュが使用されます。電源がオンになると、データがフラッシュからRAMにロードされ、CPUが動作を開始します。それがすべて繰り返されます。
ラザー

回答:


13

これはデバイスによって異なります。

RAMはFlashよりも高速に構築できます。これは約100MHzの範囲で重要になり始めます。

シンプルなマイクロコントローラー

小型で低速のマイクロコントローラーは、フラッシュから直接実行されます。これらのシステムには通常、SRAMよりも多くのフラッシュが搭載されています。

ミッドレンジシステム

デバイスが高速になると、状況は少し異なります。ミッドレンジのARMシステムでも同様に行うことができます。または、USBまたは外部EEPROMから内部SRAMにコードをダウンロードするなど、よりスマートな処理を行うマスクROMブートローダーを使用することもできます。

大規模システム

大規模で高速なシステムには、外部DRAMと外部フラッシュがあります。これは携帯電話アーキテクチャの典型です。この時点で、十分なRAMが使用可能であり、フラッシュよりも高速であるため、ブートローダーはそれをコピーして実行します。これには、CPUレジスタを介してシャベルを使用するか、DMAユニットが使用可能な場合にDMA転送を使用することがあります。

ハーバードアーキテクチャは通常小さいので、コピーフェーズに煩わされないでください。「ハイブリッドハーバード」を備えたARMを見てきました。これは、さまざまなメモリを含む2つの異なるフェッチユニットを含む単一のアドレス空間です。コードとデータは、同じメモリからではない限り、並行してフェッチできます。したがって、フラッシュからコードとSRAMからデータをフェッチしたり、SRAMからコードとDRAMなどからデータをフェッチしたりできます。


1

RAMは一般にフラッシュよりも高速ですが、80-100MHz程度を超えるクロック速度に達するまではそれほど重要ではありません-フラッシュのアクセス時間が命令の実行にかかる時間よりも速い限り、関係ありません。

RAMの物理構造により、非常に高速なデバイスを構築できます。フラッシュよりもはるかに高速です。この時点で、実行前にコードのブロックをRAMにコピーすることは理にかなっています。また、これは、実行時にコードを変更できるなど、開発者に追加の利点をもたらします。

プログラムとデータのメモリがバスを共有するフォンノイマンアーキテクチャでは、ハーバードアーキテクチャでは、すべてのコードとデータが最初にCPUレジスタを通過する必要があるということではないでしょうか?

必ずしも。これが仮想アドレス指定の出番です。生のハードウェアRAMアドレスを参照するプログラムコードの代わりに、仮想アドレス空間を実際に参照します。仮想アドレス空間のブロックは、RAM、ROM、フラッシュ、またはデバイスバッファなどの物理メモリデバイスにマップされます。

たとえば、マイクロでアドレス0x000f0004を参照すると、フラッシュからアドレス0x0004を読み取っている可能性があります。仮想アドレスは 0x000f0004ですが、物理アドレスはちょうど0x0004はある-全体0x000fxxxxアドレス空間は4キロバイトの物理メモリデバイスにマップされます。もちろんこれは単なる例であり、仮想アドレス空間を管理および編成する方法はアーキテクチャによって大きく異なります。

そのため、「プログラムは、ほとんど常にフラッシュの最下位アドレスであるアドレス0x0000から[...]の実行を開始する」と言った場合、正しいとは限りません。実際、多くのマイクロコントローラーは0x1000から始まります。


3
私が見たほとんどのフラッシュデバイスはその時点で待機状態を要求し始めるので、この区別は100Mhzではなく20-40MHz付近で重要になると言っていただろう。多くの場合、コードフラッシュには回路が含まれるため、各フェッチで複数の命令ワードを取得できるため、多くの種類のコードでフラッシュから実行する場合の「ペナルティ」は約5〜10%になりますが、コード(たとえば、ジャンプが多い)では、ペナルティははるかに厳しい場合があります。
supercat

これは仮想アドレス指定ではなく、メモリマップI / Oです(メモリ領域は周辺機器を使用してI / Oにマップされます。多くのMCUの名前は「静的メモリコントローラ」です)。もちろん、I / Oは別のメモリに到達するため、I / Oとは思わないこともあります。しかし、それは間違いなく仮想メモリのマッピングではありません。
ベンフォークト

1

あなたが言っていることは完全に真実でも偽でもありません。これにはさまざまなシナリオがあります。

それは、生のハードウェアでプログラミングするか、OSがインストールされているハードウェアでプログラミングするかによって異なります。

汎用コンピューターで実行されているオペレーティングシステムは、HDDからコードを取得し、RAMに保存してアクセスを高速化します。プロセッサが継続的にHDDから直接フェッチしようとすると、2つの速度が一致しないため、操作が非常に遅くなります。したがって、RAMは、反復コードの一部が保存され、より高速にアクセスできるようになります。さらに、プロセッサキャッシュメモリで利用できるようになり、さらに高速になります。

さて、あなたがマイクロコントローラで作業しているとき、それは完全にあなたがチップ上のデータを見つける場所に依存します。データが静的な場合は、コードメモリよりもはるかに小さいRAMを保存するコードメモリに配置することをお勧めします。C言語では、静的を使用してデータ型を初期化するとき、または一部のコンパイラではconstプレフィックスデータはコードメモリに格納されるか、RAMに格納されます。また、アセンブリでは、DB(Basic 8051の場合はバイトの定義)を直接使用して、特定の場所のデータを初期化します。PIC ARMなどの一部のコントローラーでも、実行時にROMを書き込むことができますが、データの取得には時間がかかります。

さらに、起動コードをどこから実行するか、それ自体がメモリに実際にセグメント化されている起動コードであるかをコントローラまたはプロセッサに伝える、中レベルおよび高度なコントローラのブートローダーハードウェアがあります。 、私はむしろ、従来のRAM ROMとメモリの概念全体を破壊する業界でのハイブリッドの進歩と言いたいです。したがって、基本的に混乱は有効です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.