組み込みシステムリカバリノート

OpenWRTを組み込み機器に移植した経験を集めようとしました。 この記事では、u-bootブートローダーの使用方法と、オペレーティングシステムの起動時に発生する主な問題について説明します。


U-Bootを使用する


組み込みでは別個のBIOSボードがないため、ブートローダー(この場合はu-boot)はUSBフラッシュドライブに直接配置されます。 したがって、フラッシュドライブを使用するときは十分に注意する必要があり、危険なアクションの前にブートローダーをダンプすること忘れないでください! また、NORフラッシュドライブの機能にも注意してください。ドライブセルはRAMの形式で表示されます。 これにより、メモリにコピーせずにプログラムをオンザフライで実行できます。 NANDフラッシュドライブの場合、特別な記録プログラムが使用されます。 したがって、ブートローダー、ストレートアーム、および何をする必要があるかを認識できます。 私たちの生活を大幅に簡素化できるエイリアスを探して、printenvの結論を調べてみましょう。 次のようなものを見つけます。

kimage = $ {download} $ {memtmp_addr} $ {kimagename}; erase_kimageを実行; cp.b $ {memtmp_addr} $ {kernel_addr} $ {filesize}。

ここで何が起こっているのかを詳しく分析します。 run kimageを実行し、downloadを実行すると(デフォルトではdownload = tftp、nfsまたはシリアル行に変更できます)、ファイルはmemtmp_addrに書き込まれたアドレスにアップロードされ、kimagenameはvmlinux.gz.uImageと等しくなり、変数は次のように表示されます。 printenv。 ファイルをRAMにダウンロードすると、USBフラッシュドライブの消去プロセスが開始され、ファイルがメモリからUSBフラッシュドライブにコピーされます。 filesize変数は、最後にダウンロードしたファイルのサイズに等しく、この場合はtftpコマンドで満たされることに注意してください。 また、erase_kimageを実行すると(erase $ {kernel_addr} $ {kernel_size}は非表示になります)、ボリュームは新しいカーネルではなくkernel_size変数で消去されます。 したがって、カーネルがkernel_size(カーネルのデフォルトパーティションに等しい)よりも大きい場合、リセットされていないセクターに書き込みます。 NORメモリの場合、これらのセルでデータ破損が発生します。 警戒してください。

そのため、ネットワーク設定を確認します。printenvには、tftpサーバーのIPアドレスが示されています。 カーネルをtftpディレクトリに置き、run kimageを実行します。 トラブルを回避するには、チェックサムをチェックし、ブートローダーでcrc32 $ {memtmp_addr} $ {filesize}コマンドを実行し、ホストマシン上のcrc32 vmlinux.gz.uImageを介して受信したデータで検証するか、これを行うiminfoユーティリティを使用するとよいでしょう。チェック自体。ただし、mkimageを介してヘッダーがカーネルに挿入された場合のみ。

エイリアスがない場合の一連のアクションの例:

tftp 0x80060000 openwrt-ar71xx-generic-uImage-gzip.bin
0xbf050000を消去+ $ {filesize}
cp.b 0x80060000 0xbf050000 $ {ファイルサイズ}
リセットする

0x80010000-RAM内の場所のアドレス(通常はtftp)は、どこに書き込むかを知っています。
0xbf050000-ダウンロードが開始されるアドレス(フラッシュの宛先の範囲から)。 bootcmd変数を確認できます。

ご注意 この記事のアドレスはすべて架空のものであり、それらを使用するとシステムがレンガに変わる可能性があります!

ブートローダーを介してカーネルにパラメーターを渡すこともできます。

setenv bootargs console = ttyS0,115200 rootfstype = jffs2

一部のフラッシュドライブドライバーは、コマンドラインを介してMTDマークアップをサポートしています。

mtdparts = spi0.0:320k(u-boot)ro、128k(u-boot-env)ro、1024k(kernel)、14848k(rootfs)、64k(art)ro、15872k @ 0x70000(ファームウェア)

MTDは、フラッシュメモリとファイルシステムドライバー間の仲介メカニズムです。 フラッシュドライブを従来のブロックデバイスまたはキャラクターデバイスとして使用できます。 フラッシュドライブ(NOR、NANDなど)のブロックは、記録する前に消去する必要があるため、必要です。
ブートローダーを終了しました。次に、ブート問題の最も一般的な原因をリストします。

失敗の理由


ブートローダーはロードしません:
1.ブートローダーが破損しました。
プロセッサはブートローダーを開始できません。 この問題は、いくつかの方法で解決できます。 可能であれば、JTAGを使用して回復できます。 または、プログラマでフラッシュドライブをプログラムします。通常、フラッシュドライブはSPIを介して接続されます。

2.ハードウェアの問題。
電子技術と優れたはんだ付けステーションがある場合は、問題の原因が見つかるまで、仕様の調査、電圧の測定などを行います。

カーネルはロードしません:
1.予期しないデータ形式。
ブートローダーは、mkimage署名なしでlzmaを待機し、署名付きのgzipを受け取ります。 通常、開発者は不必要なものをすべてブートローダーから捨てるので、彼自身がgzipを使用してカーネルを圧縮する場合、lzmaはブートローダーを理解しない可能性が高くなります。 ローダーがカーネルの前に特定のヘッダーを予期する場合、より高度なケースもあります。 また、ブートローダはelfファイルの署名を見ると予想されるため、完全に削除されたカーネルは好まれない可能性があります。

2.カーネルが誤って書き込まれました。
たとえば、記録されたセクターは以前に消去されていません。 または、台無しにされた画像が記録されました。

FSはマウントされていません:
1.指定されていないルートfs。
カーネルは、ルートとして使用するfsを認識しません。 root =を指定する必要があります。openwrtの場合は、rootfsパーティションをrootとして自動的に使用するようにカーネルにパッチを適用できます。

2.カーネルはこのfsをサポートしていません。
このファイルシステムのカーネルサポートは有効になっていないか、モジュールによって有効になっています(通常、initrdは使用されません)。 または、圧縮などのFS機能はサポートされていません。

3実際にはルートセクションにはデータがありません。
オフセットまたはセクションが正しく指定されていないため、FSレコードにミスがあった可能性があります。

Source: https://habr.com/ru/post/J128045/


All Articles