バイナリ/ヘックスダンプでU-Boot環境の場所を把握するプロセス

バイナリ/ヘックスダンプでU-Boot環境の場所を把握するプロセス

簡単に言うと:

u-bootが有効なボード(バージョン1.6.1)があり、ddを使用して環境変数を含むパーティションをバイナリファイルにダンプしました。今、見つかったパーティションの場所を変換する方法を見つけるのが難しいです。 ASCII値をOFFSETおよびfw_envとして.configのSIZEパラメーターとして指定します。 (数字を検索しようとする他の方法も失敗します。)

私はここですべてのタイプのシステムでこれを行い、最初のASCIIパラメータアドレスを単にコピーして貼り付けるのはうまくいきません。

完全な記録(TLDRで最も関連性の高い情報拡張、「最も関連性の高い」タイトルの後に長い序文が「以前の努力の評価」であり、完全です):


私は難しい問題に直面しており、週末を通して検索しようとしましたが、まだ解決策が見つかりませんでした。

U-boot-1.6.1の修正版を実行するSamsung ARMベースのLinux組み込みシステムを「継承」しました。私はいくつかのバグを修正する任務を引き受けましたが、その1つは環境変数をu-bootに更新する必要があります。

問題のシステムはEmbedSkyボード、特にTQ2440です。これはよく知られているタイプではなく、中国/香港から来たようで、あまり役に立ちません。

fw_printenv/fw_setenvを正常にコンパイルしました。これらのガイドを使用してくださいそして、使用されたu-bootのソースファイルを入手しました。

具体的には、後で参照できるようにいくつかのトリミングと促した後、PCベースのビルド環境でツールを完全に呼び出した結果は次のとおりです(u-bootルートフォルダ内)。
make env ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- HOSTCC=arm-none-linux-gnueabi-gcc
最後のトークンはバグのようです。 2012年にはまだ少し議論の余地がありますが、makefileはenvツールのHOSTCC用にコンパイルされるため必要です。 EmbedSkyの2015年バージョンを修正しようとする試みが非常に間違っている(すべての種類の欠落しているアイテム)、あきらめたので、これが2014/2015バージョンでもまだ当てはまるかどうかはわかりません。

私の問題は、EmbedSky.hに次の定義が表示されることです(CONFIG_は見つからずCFG_のみが見つかりました)。

#define CFG_ENV_SIZE    0x020000
#define CFG_ENV_OFFSET  0x1F0000

/proc/mtd では、mtd0 の名前が「uboot」、mtd1 の名前が「kernel」、mtd2 の名前が「root」であることを示していますが、他の mtd セクタは存在しません。
ここで「uboot」を含む mtd0 は0x40000長く、ブロックサイズは で0x20000、削除サイズはなのでオフセット0x20000に合わない。0x1F0000

一致する1つは、mtd0 "uboot"デバイスがNANDフラッシュにあり、EmbedSky.hファイルのすべての設定パラメータがNANDフラッシュに適用されることです。

もちろん頑固な小さな労働者としてfw_env.configファイルを設定してみました。3つのmtdパーティションすべてに知られている数字のすべての組み合わせ。オフセットで fw_printenv を呼び出すと、0x1F0000「無効なコマンド」などのエラーが発生し、以下で試みるすべての操作に「CRC エラー:デフォルト環境の使用」と表示されます。
(上記のリンクにまだHOSTCC =ディレクティブが含まれていることがわかりました:-))

ここで、各組み合わせは以下を意味する。 OFFSET=0x00000;オフセット中間、オフセット1セクタの内側、オフセット2セクタ、サイズはそれぞれ0x04000および0x20000、範囲は1です. 2または3部門。だから本当ではないすべてしかし、特にサイズの場合、これは私が見つけたチュートリアルとヘッダーファイルで見たすべての数値です。

この時点で、私が持っているリソースはプロジェクトの残りの部分に適しているので、実際にはボード上のリソースではないかもしれないと思います。だから別の方法を見つけました。

今夜3時頃、「u-boot環境を含むmtdをダンプしてから、基本ブロックと重複ブロックを調べる」のブログ記事を見ました。混乱している真夜中の状態で Google を再度検索しました。ブックマークする前にページにアクセスしたが、再びブログを見つけることができないようです。

最も関連性の高いもの:

だから私は希望を持って走ってsudo dd if=/dev/mtd0 of=/home/ActiveMtd0.bin bs=128k count=2情報を私の/proc/mtdリストに入れました。結果:256kbyteがコピーされました。

これは私にバイナリファイルを提供し、見て、これには純粋なASCII形式のu-boot環境変数が含まれています。歓声!しかし残念ながら、このすべての「明白さ」が私を失望させるようです。まず、このダンプには重複ブロックではなく1つのブロックしか含まれていないため、トリックは消えます。第二に、ブロックの始まり0x367F8(おそらくCRCの4バイトの後に最初のASCIIパラメータが来る部分)が私が想像できるすべてのアーキテクチャの便利なセル境界から離れているようです。 0パディングで488バイト以上実行されます。ここで env の後のゼロ以外の最初のバイトは であり0x369B8、これも良い位置ではありません。両方のポイントは8バイトに整列するので、少なくともそれはすべてです。これが関係しているかどうかにかかわらず、推測することしかできません。

0x367F8楽観的に私はサイズ(= 488の10進数)の設定ファイルでmtd0にOFFSET =を試しましたが、0x01C0ブロックサイズ、mtd0の境界を越えるなどの理由で誤った指示も提供しましたが、これははるかに詳細です。内部u-boot fw_printenvプロセスについて私が知っているより。その後、OFFSET =0x367FCとSIZE =を試して0x01BC最初の変数の最初の文字に設定し、CRCと思った部分をスキップしましたが、それも失敗しました。 envのascii値は488バイトよりはるかに小さく、後半はゼロパディングであることに注意してください。これがプロセスに関連しているかどうかはわかりません。

私は今完全にパニックになりました。

誰かがバイナリmtd0ダンプのこの時点で、「これから12バイトを減算する」または「4で割る」について教えてもらえますか?私は、スクリプトファイルから直接NANDフラッシュを妨げるよりも、現場で何百ものデバイスを自動化する方が安全なので、fw_printenvとfw_setenvを使用するのが大好きです。

「あなたが試したアドレスの1つが正しいアドレスでなければなりません。」ほとんどの数字の後ろには何らかの理由があるにもかかわらずです。

関連情報