2

組み込みシステムでは、ボードの初期化とイメージのロードに使用されるブートローダー。通常、ブートローダは第 1 段階で noflash で実行され、自身 (.txte+.date コード) をフラッシュから RAM にコピーしてから、RAM 実行コードにジャンプする必要があります。

私の質問は: フラッシュから RAM にコードをコピーしてキャッシュを有効にする場合、データ キャッシュをフラッシュして命令キャッシュを無効にする必要がありますか? uboot と他のブートローダーがこの操作を実行することがわかりましたが、そうしなくてもシステムは正常に起動できます。コードをフラッシュから RAM にコピーした後にデータ キャッシュをフラッシュしなければならない理由は何ですか?

4

2 に答える 2

3

単純な組み込み MCU には、通常、バスを「スヌープ」して、キャッシュされたメモリ アドレスへの書き込みでキャッシュの内容を無効にする人 (自分自身でさえも) をチェックする手段がありません。

MCU に個別のデータ キャッシュと命令キャッシュがあり (最近のほとんどの MCU にはあります)、コードをデータとしてフラッシュから RAM にコピーする場合は、データ キャッシュをフラッシュして (コピーしたすべてのものが物理的に RAM に書き込まれるようにするため)、命令を無効にする必要があります。キャッシュ(コピー前の「古い」情報が含まれている可能性があります)を使用して、以前に存在し、まだ命令キャッシュに存在するものを実行する代わりに、コピーしたばかりのコードを実際に実行します。

コピーする前にMCUがメモリ領域を「見た」ことがないと確信できる場合は、後者を行わなくても済むかもしれません(何もキャッシュされておらず、RAMを物理的に読み取る必要があるため)。安全のために、データ キャッシュのフラッシュと命令キャッシュの無効化を行います。

フラッシュから RAM にコードをコピーすること、自己変更コードの特殊なケースであり、プログラマーはそれが損傷を与えていないことを確認する必要があります。

于 2015-04-20T05:48:53.747 に答える
0

主な理由は「複数コア」の CPU にあると思います。非対称コアの場合、非常に重要です。i.MX6SoloX (シングル チップ上の Cortex A9 および Cortex M4)。

たとえば、i.MX6SoloX では、スレーブ コア(M5)がRAM (DDR)で実行される場合、メイン コア (A9)はメイン CPU であり、RAMの正しい位置にロードされたM4 コアコードを提供する必要があります。これらのコアには、互いに認識しない異なる D キャッシュがあります。FLASH から RAM へのコピー後に A9 コアが D キャッシュをフラッシュしない場合、コードの一部は実際には RAM にコピーされません。これは、D キャッシュ メモリがまだ残っているためです。U-Boot からこのコピーを実行すると、(U-Boot を実行している) A9 は正しくコピーされたすべてのデータを参照しますが、M4 はすべてのコードを参照しますが、A9 コアの D キャッシュに残っているコードは参照しません。

あなたの場合(あなたのような単一のコアだと思います)、Dキャッシュの所有者はコア自体であるため、U-BootがDキャッシュをフラッシュすることは必須ではありません(私が推測するカーネルコピーの後):それは見ることができますすべてのメモリ内のコード。

最後の理由は、実行されたデータ コピーが特定のアドレスにデータを完全に書き込んだことを許可するには、D キャッシュをフラッシュする必要があるためです。そうしないと、一部のデータがキャッシュ内に残る可能性があります。

于 2015-04-20T10:35:25.017 に答える