カスタムハードウェア上の Linux ルートファイルシステム

カスタムハードウェア上の Linux ルートファイルシステム

私は、ARM プロセッサ クローンに基づいて FPGA 上に実装されたカスタム設計の SoC を持っており、そこで Linux (カーネル 3.10) を起動しようとしています。

カスタム周辺機器 (USART、割り込みコントローラ、タイマー) へのサポートを正常に追加し、ルート ファイルシステムをマウントしようとする時点までカーネルによって表示される printk メッセージを確認できるようになりました。

2GB のカスタム不揮発性メモリがあり、ランダム アクセス、読み取り書き込みが可能で、アドレス 0 から 0x7FFFFFFF にマッピングされています。このメモリからブートローダが実行され、カーネルとファイル システム パーティションが含まれています。ブートローダはカーネルを RAM (256Mb、0x80000000 から 0x8FFFFFFF) にコピーし、制御を Linux に渡しますが、次の時点で失敗します: "カーネル パニック - 同期していません: VFS: ルート ファイル システム (0,0) を不明ブロックにマウントできません"。

デバッグとインターネット検索から、カーネルが不揮発性メモリを認識できないため、ファイルシステムをマウントできないようです。

カーネルにそのメモリから起動するように指示するにはどうすればよいでしょうか。また、カーネルにどのコードを追加する必要がありますか。たとえば、カーネルにメモリが NAND であると認識させ、NAND ドライバーを変更してメモリに正しくアクセスできるようにすることは可能でしょうか。

ご協力とご提案をよろしくお願いいたします。

答え1

「ファイルシステム パーティション」に対して現在何をしているのかはわかりません。ただし、RAM のように見える/動作する initrd を不揮発性ストレージに配置し、ブートローダに Linux に initrd を使用するように指示させることができます。

ほとんどの initrd は、いくつかのセットアップを行ってから、ブロック デバイスにルート ファイル システムを再マウントしようとします。この場合、initrd が実際のルート ファイル システムとなり、シェルなどのユーティリティを initrd に配置する必要があります。

U-Boot を使用して ARM 上でブートする場合、基本的にブート コマンドはカーネルと initrd をストレージ デバイスから固定 RAM の場所にロードし、次に initrd のアドレスがアドレスを指定するコマンド ライン パラメーターとしてカーネルに渡されます。


そうですね、MTD ドライバーは RAM のセクション ( の MTD ドライバーには「物理システム RAM」オプションがありますmake menuconfig) を取得して、それをブロック デバイスに変換できます (読み取り/書き込み可能なブロック デバイスが本当に必要な場合)。たとえば、グラフィック カード RAM を小さなスワップ パーティションとしてマウントするために使用できます。 これを見て

modprobe phram phram=0x00100000;256MiBメモリ位置 0x00100000 に 256MByte のファイルシステムがある場合、それを実行するコマンドは になると思います。次にmodprobe mtdblockを実行して を作成します/dev/mtdblock0。その後、 などの操作を実行できます。したがって、initrd に上記を実行し、 を実行してから、プロセス 1 を起動するmount /dev/mtdblock0小さなスクリプトが必要になります。fsck /dev/mtdblock0init

カーネルのコマンドラインですべてを指定できるかもしれませんが、それがサポートされているかどうかはわかりません。とにかく、柔軟性を持たせるために、小さな initrd を使用することをお勧めします。

関連情報