質問

ROMに保存されている実行可能ファイルについては基本的な疑問があります。

私の知っているように、テキストと RO 属性を持つ実行可能ファイルは ROM に保存されています。質問は、ROM は読み取り専用メモリのことですが、コードをメモリに書き込む必要がある状況が発生した場合はどうなりますか?

ここで引用する例は思いつきませんが (おそらく私はそのような状況を知らないか、基本的なことを見逃しているのでしょう ;)、このトピックについて少しでも光があれば、理解するのに大いに役立ちます。:)

最後-1。そのような状況はありますか?2.このような場合、ROM から RAM にコードをコピーするのが解決策でしょうか?

いくつかの例を挙げて回答すると、非常に役立ちます。

よろしくお願いします!

/MS

役に立ちましたか?

解決

読み取り専用メモリは、ハードウェアの制限のためだけに読み取られます。プログラムはanにあるかもしれません Eeprom, 、書き込み、CD-ROM、またはハードウェアが物理的に執筆を許可するものから保護されているフラッシュメモリ。ソフトウェアがROMに書き込む場合、ハードウェアは保存されたデータを変更することができないため、何も起こりません。

したがって、ソフトウェアプログラムの場合 ROM メモリに書き込みたい、と書いています . 。それが唯一のオプションです。プログラムがROMから実行されていて、 それ自体を変えます, 、それはROMに書くことができないのでできません。しかし、はい、プログラムはRAMから実行できます。

実際、ROMからの実行は、最小の埋め込みシステムを除き、まれです。オペレーティングシステムは、実行する前に実行可能なコードをROMからRAMにコピーします。時々 コードが圧縮されています ROMで、実行する前にRAMに減圧する必要があります。 RAMがいっぱいの場合、オペレーティングシステムは使用します ページング それを管理するために。 ROMから実行される理由はまれであるため、ROMがRAMよりも遅く、場合によってはコードを変更する必要があるためです。 ローダ 実行する前に。

それ自体を変更するコードを持っている場合、あなたは本当にあなたのシステムを知る必要があることに注意してください。多くのシステムが使用しています データ実行防止 (DEP)。実行可能コードは、RAMの領域を読み取り+実行します。データは読み取り+書き込み領域に入ります。したがって、これらのシステムでは、コードはRAMでそれ自体を変えることはできません。

他のヒント

通常、プログラムコード、定数、および初期化データのみがROMに保存されます。 RAMの個別のメモリ領域は、スタック、ヒープなどに使用されます。

実行時にコード セクションを変更する正当な理由はほとんどありません。コンパイラ自体は、それを必要とするコードを生成しません。

リンカーには、MAP ファイルを生成するオプションがあります。これで場所がわかります 全て メモリオブジェクトが見つかりました。

リンカーは、リンカー スクリプト (必要に応じてメモリを整理するようにカスタマイズできます) に基づいて配置場所を選択します。通常、FLASH ベースのマイクロコントローラー コードと定数データは ROM に配置されます。ゼロ以外の初期化静的データの初期化データも ROM に配置され、これは main() が呼び出される前に RAM にコピーされます。ゼロ初期化された静的データは、main() の前に単純にゼロにクリアされます。

リンカが ROM 内のコードの一部またはすべてを見つけて、それをゼロ以外の静的データと同じ方法で実行時のスタートアップ コードで RAM にコピーするように設定することは可能ですが、コードは次のいずれかである必要があります。再配置可能であるか、最初のインスタンスで RAM に配置されている場合、実行することを目的としたコードを ROM から RAM にコピーするだけで実行を期待することはできません。コードには絶対アドレス参照が含まれている可能性があるためです (ターゲットに MMU があり、ターゲットを再マップできる場合を除く)。アドレス空間)。マイクロコントローラー上の RAM への配置は、通常、実行速度を上げるために行われます。これは、高いクロック速度が使用される場合、RAM は一般にフラッシュよりも高速であり、生成される待機状態が少ないかゼロになるためです。コードが ROM に保存されるのではなく、ファイルシステムから実行時にロードされる場合にも使用される場合があります。RAM にロードされた場合でも、プロセッサに MMU が搭載されている場合は、RAM セクションのコード セクションが読み取り専用としてマークされる可能性があります。

ハーバードアーキテクチャマイクロコントローラー

多くの小さなマイクロコントローラー(Microchip PIC、Atmel AVR、Intel 8051、Cypress PSOCなど)にはハーバード建築があります。プログラムメモリ(フラッシュまたはROM)からのみコードを実行できます。プログラムメモリからRAMにバイトをコピーすることができます。でも、 (2) ROMからRAMへの実行可能な手順をコピーすることは答えではありません。これらの小さなマイクロコントローラーでは、プログラムカウンターは常にプログラムメモリの一部のアドレスを指します。 RAMでコードを実行することはできません。

コピー データ ROMからRAMまではかなり一般的です。 Powerが最初に適用されると、典型的なファームウェアアプリケーションがすべてのRAMをゼロし、Main()が開始する直前にROMからROMからROMから静的変数の初期値をコピーします。アプリケーションが固定文字列をシリアルポートから押し出す必要があるときはいつでも、ROMからその文字列を読み取ります。

これらのマイクロコントローラーの初期バージョンでは、マイクロコントローラーに接続された外部の「デバイスプログラマ」がプログラムを変更する唯一の方法です。通常の操作では、デバイスは「デバイスプログラマー」の近くにありませんでした。マイクロコントローラーで実行されているソフトウェアがプログラムメモリROMに書き込む必要がある場合 - 申し訳ありませんが、残念ですが、不可能でした。多くの組み込みシステムには、コードが書き込むことができる不揮発性EEPROMがありましたが、これはデータ値を保存するためだけでした。マイクロコントローラーは、EEPROMまたはRAMではなく、プログラムROMでコードのみを実行できました。人々は、基本的な通訳やbytecode forth通訳など、これらのマイクロコントローラーで素晴らしいことをしました。どうやら (1) コードは、プログラムメモリに書き込む必要はありません。

最近の「セルフプログラミング」マイクロコントローラー(Atmel、Microchip、Cypressなどから)を使用すると、Microcontrollerで実行されているソフトウェアが独自のプログラムメモリフラッシュのブロックを消去および再プログラムできるようにする特別なハードウェアがチップにあります。この「セルフプログラミング」機能を使用して、データを「追加」フラッシュブロックに読み書きするためにいくつかのアプリケーションが使用されます。あなたはより大きなEepromでできませんでした。これまでのところ、Harvard-Architecture Microcontrollersで実行されている2種類のソフトウェアしか見ていません。これは、新しい実行可能ソフトウェアを独自のプログラムFlash、BootloadersとForth Compilerに書き込みます。

Arduino Bootloader(Bootstrap Loader)が実行され、新しいアプリケーションファームウェアイメージが利用可能であることを検出すると、新しいアプリケーションファームウェア(RAMに)をダウンロードし、Flashに書き込みます。次回システムをオンにすると、Crunky Oldバージョン16.97アプリケーションファームウェアではなく、Shiny Newバージョン16.98アプリケーションファームウェアを実行しています。 (もちろん、ブートローダー自体を含むフラッシュブロックは変更されていません)。これは、プログラムメモリに書き込む「セルフプログラミング」機能がなければ不可能です。

いくつかのフォース実装は、小さなマイクロコントローラーで実行され、新しい実行可能コードをコンパイルし、「セルフプログラミング」機能を使用してプログラムフラッシュに保存します。これは、JVMの「ジャストインタイム」コンパイルに多少類似したプロセスです。 (他のすべての言語は、小さなマイクロコントローラーで実行するには非常に大きすぎて複雑なコンパイラを必要とするように思われるため、壁の時計の時間をはるかに長くする編集コンパイルダウンロードランサイクルがあります)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top