私は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にはブートローダは含まれていません。これは別々に処理する必要があります。