組み込みシステムでメモリマップがどのような目的を果たすのかを理解することを楽しみにしています。ここで、関数スタックは通常の UNIX システムとどのように異なりますか。
組み込みシステムのメモリ関連のクラッシュをいくつかデバッグするのに役立つ洞察は役に立ちます。
組み込みシステム、特にリアルタイムのシステムでは、多くの場合、静的に割り当てられたデータや、メモリ内の特定の場所に配置されたデータを持っています。メモリ マップは、これらがどこにあるかを示します。これは、問題が発生し、システムの状態を調べる必要がある場合に役立ちます。たとえば、すべてのメモリをダンプし、事後に分析することができます。このような場合、メモリ マップは、問題に関連していると思われるオブジェクトを見つけるのに便利です。
コード側では、システムは、例外が検出された命令のアドレスを指すハードウェア例外をログに記録する場合があります。関数の逆アセンブルと組み合わせて、関数のメモリ位置を調べると、このような問題を分析するのに役立ちます。
詳細は、構築している組み込みシステムの種類によって異なります。より詳細な情報を提供すると、より良い回答が得られる可能性があります。
質問が理解できるかわかりません。「メモリマップ」は組み込みシステムに固有のものであるか、具体的なソフトウェアコンポーネントであると示唆しているようです。どちらでもありません。これは、アプリケーションのメモリ使用量のレイアウトの説明にすぎません。
プラットフォームに関係なく、すべてのアプリケーションにメモリマップがあります。違いは、通常、組み込みシステムでは、アプリケーションが単一のモノリシックエンティティとしてリンクされるため、結果として得られるメモリレイアウトは、個々のプロセスではなく、システム全体を参照することです。 GPOSプラットフォーム上のアプリケーション。
メモリマッピングを決定するのはリンカとリンカスクリプトであり、リンカは適用されたレイアウトと割り当てを説明するマップレポートファイルを出力できます。これは、OSやアーキテクチャに関係なく、組み込みアプリケーションとデスクトップアプリケーションに当てはまります。
RTOS のメモリ マップは、コンピュータのメモリ マップとそれほど違いはありません。プロセッサのどのアドレスにどのハードウェアが存在するかを定義します。そのハードウェアは、RAM、ROM、フラッシュ、シリアル ポート、パラレル ポート、タイマー、割り込みベクトル、またはプロセッサによってアドレス可能なその他の任意の数の部分です。
メモリ マップは、システム設計で RAM、ROM、またはフラッシュなどの限られたリソースにどのように予算を割り当てるかについても説明します。
たとえば、複数のタスクが実行されている場合、RAM をマップして、各タスクに固有の RAM 領域が割り当てられるようにすることができます。
次に、RAM の各タスクの部分がマップされ、スタック用の特定の領域、静的変数用の別の領域、およびヒープ用の領域がさらに存在するようになります。
ターゲット上にオペレーティング システムがある場合、オペレーティング システムはこの多くを動的に処理します。ただし、アプリケーションがデバイス上の唯一のソフトウェアである場合、通常はコンパイル/リンク時にこれらの決定を自分で管理する必要があります。「リンク スクリプト」を検索してさらなる手がかりを探し、
メモリ マップは、システムのメモリのレイアウトです。組み込みシステムと通常のアプリケーションの両方に存在します。通常のアプリケーションにも存在しますが、システムの制約により、組み込みシステムでの使用が高く評価されています。
メモリ マップは、リンカ スクリプトまたはリンカ コマンド ファイルによって管理されます。フラッシュ、内部 RAM (L1P、L1D、L2、L3)、外部 RAM (DDR)、ROM、周辺機器 (ポート、シリアル、パラレル、USB など)、特定のデバイス レジスタ、I/O ポートなどのリソースを適切な固定アドレスにマップします。システムのメモリ空間で。
組み込みシステムの場合、メモリ構成またはボードの制約とパフォーマンス要件に基づいて、テキスト セグメント、データ セグメント、BSS などのセグメントを選択した適切なメモリに配置することもできます。
さまざまなバージョンの開発ボードで、メモリと周辺機器の構成が異なる場合があります。その場合、ボードの立ち上げにおける重要なチェックポイントとして、ボードのメモリ構成と周辺機器に応じてリンカー スクリプトを編集する必要がある場合があります。
メモリ マップは、マルチスレッド アプリケーションやマルチコア アプリケーションでも重要な役割を果たすことができる共有メモリの定義にも役立ちます。
クラッシュは、クラッシュのアドレスをバック トレースしてシステムのメモリにマッピングし、問題の原因となっている可能性のあるライブラリまたはオブジェクトの概要を把握することでデバッグできます。