0

at91rm9200 プロセッサとat45db642Dデータフラッシュを使用して変更された 2.6.12.1 を実行しているレガシー ボードのファームウェアを、 at45db641Eデータフラッシュを使用するようにアップグレードする作業を行っています。641E の特徴は次のとおりです。

  • 32768ページ
  • 264バイトのページサイズ
  • ページ (264 バイト)、ブロック (2 KB)、セクター (256 KB)、またはチップ全体 (64 M ビット) を消去する柔軟な消去オプション。

カーネル メモリ マネージャーのページ サイズは標準の 4096 バイトだと思います。

適切な jffs2 イメージをデバイスに配置したいと考えています。私が疑問に思っているmkfs.jffs2オプションは次のとおりです (man ページから):

  • --pagesize: ページ サイズ SIZE を使用します。デフォルトは 4 KiB です。このサイズは、データ ノードの最大サイズです。ターゲット システムのメモリ管理ページ サイズに従って設定します (注: これは NAND ページ サイズとは関係ありません)。
  • --eraseblock: 消去ブロック サイズ SIZE を使用します。デフォルトは 64 KiB です。ターゲット MTD デバイスの消去ブロック サイズとは異なる消去ブロック サイズを使用すると、JFFS2 が最適に実行されない場合があります。指定された SIZE が 4096 未満の場合、単位は KiB と見なされます。

男性は、ページサイズはカーネルメモリ管理ページサイズ(私の場合はデフォルトと同じ4096)に関連しており、デバイスの264バイトのページではないと述べています。--pagesize=4096 を指定する必要がありますが、--pagesize=264 ではありません。これは正しいですか?

--eraseblock は、MTD デバイスの消去ブロックと同じサイズでなければならないとも述べています。私はいくつかのことについて混乱しています。

  1. 641E には、いくつかの異なる消去オプションがあります。mkfs.jffs2 --eraseblock オプションにはどれを選択する必要がありますか?
  2. 正しいオプションが 641E のページ サイズまたはブロック サイズのいずれかである場合、4096 未満の値はバイト単位ではなく KB 単位であると想定されるという事実を考慮して、mkfs.jffs2 にどのように指定できますか?
  3. このリンク(この関連する不十分な SO の質問で参照) は、jffs2 ノードが消去ブロック内に完全に収まる必要があることを示しています。それらのサイズは 4+ KB であり、デバイスの「消去ブロック」サイズよりも大きいため、リンクには「いくつかの erasblock を 64 または 128 KiB の 1 つの仮想消去ブロックに結合して使用する必要があります。これはより最適です」と続きます。 「ドライバーに 128KiB の消去ブロック サイズを報告させ、それをエミュレートする必要があります。そうすれば動作します。そのままでは動作しません。」このような「仮想消去ブロック」を設定するにはどうすればよいですか?
  4. at91 データフラッシュ ドライバー内では、device->erasesize=pagesize. そのため、名前は似ているが異なる概念がいくつかあるようです: ドライバー消去サイズ、デバイス消去ブロック サイズ、および jffs2 消去ブロック サイズ。これらの関係と違いは何ですか?jffs2 で指定された消去ブロックのサイズは、ドライバーによって実行される操作に最終的にどのように影響しますか?

助けてくれてありがとう。

4

1 に答える 1

0

カーネル内のさまざまなソース ファイルを調べて、何が起こっているのかを突き止めました。少なくとも、動作させるには十分です。これは 2.6.12.1 に適用され、必ずしもそれ以降のカーネル バージョンに適用されるわけではないことに注意してください。

名前が似ていて、関連しているが、必ずしも等しいとは限らない 4 つの用語があります。最高レベルから最低レベルまで...

  1. mkfs.jffs2 eraseblock - これにより、結果のファイル システム バイナリ イメージでノードが配置される場所が決まります。
  2. マウントされた jffs2 仮想ブロックサイズ- これは、jffs2 ファイル システムの読み取りおよび書き込み時にノードがどのように配置されるかを決定します。
  3. mtd core erasesize - これは、データフラッシュ ドライバーの実装によって jffs2 ファイル システム コードに報告される消去可能な最小単位です。
  4. デバイス消去ページ/ブロック/セクター- これらは、デバイス ドライバーの実装者がフラッシュからデータを消去するために使用できるハードウェア消去オペコード オプションです。

私が理解している制約は次のとおりです。

  • #4 の一部のオプションは #3 以下でなければなりません。at91_dataflash.c ファイルでは、これらは等しく、どちらも 264 バイトのページ サイズに等しい (つまり、mtd コアの消去サイズ = フラッシュ ページ サイズ = 264 バイト)。一般に、#4 で使用可能なオペコードの組み合わせは、合計すると正確に消去サイズになる必要があり、ドライバーはそれに応じて適切なオペコードを実行して、消去サイズのデータ​​を消去する必要があります。
  • 通常、#2 の jffs2 仮想ブロックサイズは、#3 の mtd コア消去サイズと同じです。ただし、jffs2 コードが仮想ブロック サイズを自動的に変更する場合があります。jffs2 コードは、仮想ブロックごとに 1 つのリスト ノードの存在を必要とする一連のリンク リストを使用して、フラッシュ ディスク上のダーティ エリアとクリーン エリアを追跡します。このようなすべてのリスト ノードの合計サイズには 128KB の制限があります。AT45DB642D と AT45DB641E の両方のケースで仮想ブロック サイズ = mtd コア消去サイズ = フラッシュ デバイス ページ サイズのように、仮想ブロック サイズが非常に小さい場合、多数のノードが作成され、ノードの 128KB 制限を超えます。 . この場合、jffs2 fs コードは、128KB の制約が満たされるまで、自動的に仮想ブロック サイズを増やし、仮想ブロック カウントを 2 分の 1 に減らします。カーネルは、「jffs2: Erase block size too small (0KiB). Using virtual blocks size (4KiB) instead.」というメッセージを出力します。(精度の切り捨てに注意してください)。これを調整済み仮想ブロック サイズと呼びましょう。
  • 調整された仮想ブロック サイズは、フラッシュに格納された jffs2 fs のマウントに使用されます。調整された仮想ブロック サイズは、#1 の jffs2 イメージの eraseblock サイズと等しくなければなりません (ただし、この教科書では、#1 eraseblock は #2' の調整された仮想ブロック サイズを超えてはならないことを示唆していますが、私はテストしていません)。

したがって、私の場合、カーネルによって仮想ブロック サイズが 264 バイトから 4224 バイトに調整されました。私のjffs2ファイルシステムは-e 4224、mkfs.jffs2のオプションを使用して機能しました。ドライバーは、4224 バイト長の各仮想ブロックを一度に 1 ページずつ消去します。

その他の考慮事項:

  • この-s pagesizeオプションは、マニュアル ページによると、カーネル ページ サイズに関連しています。を使用してカーネルページサイズを使用し-s 4096ました。
  • 調整された仮想ブロック サイズが、完全な jffs2 ノードに必要なサイズよりも小さくなること-eはほとんどないため、4096 バイト未満のパラメータを使用する可能性は低く、単位に関する問題は意味がありません。
  • #1 と #2 の上記のバイト数はす​​べて、mtd コアの消去ブロック サイズのきれいな倍数である必要があります。
  • 仮想ブロック サイズの自動調整は、カーネル構成で無効/有効にできます。
于 2016-04-26T02:07:14.430 に答える