あなたの質問への答えは、正直に言うと非常に簡単です。あなたの主な質問は、「将来のソフトウェア アップデート用のメモリをどこで取得しますか」ということです。答えは、システムの DRAM です。質問の最初の部分で、ベアメタル プログラミングについて話しています。質問の 2 番目の部分は、OS レベルのプログラミングに関するものです。最初の部分では、基本的にプロセッサを isp モードにして、フラッシュまたはその他の nv メモリをプログラムします。2番目の部分では、その仕組みがまったく異なります。
基本的に、(メカニズムを取り除いた)更新は、ブートローダー、カーネル、initramfs、ファームウェア、アプリケーションなどの部分に分割されます。最初に、たとえば ftp などのプロトコルを使用して、コード (バンドルされたパッケージ) をデバイスに転送します。この転送により、実際にコードがシステムの DRAM に配置されます。次に、システム(Linuxを実行している例)で、このコードを解凍して整合性チェック(ファイルのチェックサム)を行うコード(ロジック)があります。次に、システムには、これらすべてのコンポーネントを分析し、既存のコンポーネントのいずれかを更新する必要があるかどうかを判断するための追加のコードがあります (受信コンポーネントの md5 合計を確認し、既存のものと比較します)。たとえば、カーネルの init スクリプトに変更を加えた場合、または init.d に新しいスクリプトが必要な場合は、基本的に initramfs を変更したとします。
また、新しいコードの最終目的地はフラッシュです。フラッシュには書き込みと消去を行うために従う必要がある特定のルールがあるため、基本的にはフラッシュ ファイル システムをフラッシュにマウントします。ただし、jffs2 などのファイルシステムはウェア レベリング メカニズムを使用するため、それを使用してコードを書き込むことはできません。したがって、データは物理フラッシュに分散されます (jffs2 がマウントされています)。ところで、フラッシュ内の連続した場所に完全なブートローダー、カーネル、initramfs などが必要なため、これは受け入れられません。したがって、Linux を実行するサンプル システムには、mtd ドライバーと呼ばれるものがあります。このドライバーを使用して、すべてのコンポーネントでフラッシュをプログラムできます。簡単に言うと、DRAM はソフトウェア更新のための一時的な場所です。1. 十分なメモリがあること 2. ソフトウェア アップデート バンドルが DRAM に収まること。