ブートローダ、カーネル、デバイスツリー、RAMディスクから起動可能なELFを作成する

ブートローダ、カーネル、デバイスツリー、RAMディスクから起動可能なELFを作成する

私はLinuxカーネルプログラミングが初めてで、起動可能なイメージを構築する最後のステップについて非常に混乱しています。

いくつかの背景知識のために、JTAGを介してオペレーティングシステムイメージ全体をVirtex 5 FPGA内の拡張PPC440プロセッサにアップロードしてみました。廃止予定のオペレーティングシステムからザイリンクスのカスタムLinuxカーネルに移行し、継続的なサポートを提供しています。このアップロードに必要なファイルは、ブートローダ、カーネル、デバイスツリー、およびRAMディスクイメージで構成されるオペレーティングシステム全体とそのアプリケーションを含むELFです。

ELDKを使用して構築に成功し、正しいファイルを生成し、プロセッサで実行されます。ただし、ELDKのサポートは限られており、古いライブラリ(libc例:2.6)と老化ユーティリティが含まれています。新しいツールチェーンとプログラムを構築する方がメンテナンスの面でより良いです。

いくつかのステップを経て、私たちはELFのコアコンポーネントと見なされるものを構築することができます。ブートローダ用のu-boot、カーネル、コンパイルされzImageたデバイスツリーブロブ、必要なすべてのライブラリを含むRAMディスクイメージを持っています。

理解するのが難しいのは、ファイルにパッケージする方法です。 u-bootにはmkimage最後の3つのエントリをリンクし、u-bootプロンプトで単一のコマンドでそのエントリをロードするためのユーティリティが含まれていますが、ELDKは次のものを含む単一のファイルを生成するため、明らかに4つのエントリすべてをリンクする可能です。 )すべて1つのファイル内の部分です。

私がここで何を見逃しているのか知っている人はいますか?この一連のステップは単純ですか、それとも私たちは軌道から外れていますか?

ありがとうございます!

答え1

私はこの質問に答えることができました。 Linuxカーネルを作成するときは、次のようにターゲットを指定しますsimpleImage.initrd.[device-tree-name]。これは、MakefileにzImage、RAMディスクイメージ(名前を付けramdisk.image.gzて配置する必要がありますarch/[your-arch]/boot)、およびdts(名前を指定しdevice-tree-nameて配置する必要があるarch/[your-arch]/boot/dts)をラップするように指示します。また、make中にファイルを自動的にコンパイルします.dts.dtc

この出力ELFにはブートローダは含まれていません。これは別々に処理する必要があります。

関連情報