12

組み込み ARM9 開発ボードに取り組んでいます。その中で、nand パーティションを再配置したいと思います。誰もそれを行う方法を教えてもらえますか?

u-boot シェルでコマンド mtdparts を実行すると、次の情報が得られます。

Boardcon> mtdparts      

device nand0 <nandflash0>, # parts = 7

#: name                size            offset          mask_flags
0: bios                0x00040000      0x00000000      0
1: params              0x00020000      0x00040000      0
2: toc                 0x00020000      0x00060000      0
3: eboot               0x00080000      0x00080000      0
4: logo                0x00100000      0x00100000      0
5: kernel              0x00200000      0x00200000      0
6: root                0x03c00000      0x00400000      0

active partition: nand0,0 - (bios) 0x00040000 @ 0x00000000

defaults:
mtdids  : nand0=nandflash0 
mtdparts: mtdparts=nandflash0:256k@0(bios),128k(params),128k(toc),512k(eboot),1024k(logo),2m(kernel),-(root) 

カーネル ブート メッセージは次のように表示されます。

 Creating 3 MTD partitions on "NAND 64MiB 3,3V 8-bit":
 0x000000000000-0x000000040000 : "Boardcon_Board_uboot"
 0x000000200000-0x000000400000 : "Boardcon_Board_kernel"
 0x000000400000-0x000003ff8000 : "Boardcon_Board_yaffs2"

この 2 つのメッセージの関係を説明してください。nand フラッシュにパーティションを作成するのは、カーネルと u-boot のどちらですか? 私が知っているように、カーネルは起動ごとにパーティションを作成していませんが、なぜ「3つのMTDパーティションを作成しています」というメッセージが表示されるのですか?

4

2 に答える 2

29

NAND または NOR のフラッシュ デバイスの場合、デバイス自体にパーティション テーブルはありません。つまり、フラッシュ リーダーでデバイスを読み取って、デバイス上にあるパーティションの数と、各パーティションの開始位置と終了位置を示すテーブルを見つけることはできません。ブロックの未分化シーケンスのみがあります。これは、MTD フラッシュ デバイスと、ディスクなどのデバイスまたは MMC などの FTL デバイスとの基本的な違いです。

したがって、フラッシュ デバイスのパーティショニングはビホルダー (U-Boot またはカーネル) の目にあり、ビホルダーの実行時にパーティションが「作成」されます。そのため、メッセージが表示されますCreating 3 MTD partitions。これは、フラッシュ パーティションが実際には実行中のカーネルの MTD システムにのみ存在し、フラッシュ デバイス自体には存在しないという事実を反映しています。

これにより、U-Boot とカーネルでフラッシュ パーティションの定義が異なる可能性があります。これは明らかに OP の場合に発生したことです。

U-Boot では、mtdparts環境変数でフラッシュ パーティションを定義します。Linux カーネルでは、フラッシュ パーティションは次の場所で定義されます。

  1. 古いカーネル (i.MX28 の場合は 2.6.35 など) では、フラッシュのパーティショニングが、gpmi-nfc-mil.cまたは他のドライバー ソース コードにハードコードされている可能性があります。(なんて残念!)。
  2. デバイス ツリーをサポートする新しいメインライン カーネルでは、デバイス ツリーで MTD パーティションを定義できます。
  3. 新しいカーネルでは、通常、次のようなコマンド ラインを使用したカーネル コマンド ライン パーティション定義がサポートされています。root=/dev/mmcblk0p2 rootwait console=ttyS2,115200 mtdparts=nand:6656k(all),1m(squash),-(jffs2)

したがって、カーネルでサポートされているパーティショニングのタイプは、使用しているフラッシュのタイプ、ドライバーがカーネル コマンド ライン解析をサポートしているかどうか、およびカーネルがデバイス ツリーをサポートしているかどうかによって異なります。

いずれにせよ、U-Boot とフラッシュのカーネル パーティショニングの間に競合の固有のリスクがあります。したがって、カーネルがこのオプションをサポートしていると仮定して、U-Boot 変数でフラッシュ パーティションを定義し、mtdpartsこれを U-Boot カーネル コマンド ラインでカーネルに渡すことをお勧めします。

于 2014-01-15T08:17:20.557 に答える
0

mtdparts 環境変数を設定して、uboot でこれを行うことができます。カーネルは、カーネル ブート コマンドラインでこれを渡す場合にのみこれを使用します。そうしないと、プラットフォームのカーネル ソース コードの nand パーティション構造がデフォルトになります。この場合、3 MTD パーティションのデフォルトです。

于 2011-12-22T08:48:20.327 に答える