initがみつからない?
起動中のメッセージが表示されるようになったDragonOneのuClinuxですが、次のような画面で止まってしまいました。

最初に起動されるプロセスであるinitが見つからないとのこと。ビルドの結果をみるかぎり、initはromfsに含まれているはずなのですが。おまけにconsoleも見つからないという警告も表示されています。この原因を探ってみます。
エラーが出ている箇所のソースを探す
カーネルの起動時に表示されているメッセージですから、linux-2.4.xのディレクトリ配下のソースを検索してみました。該当の箇所は以下の部分でした。
uClinux-dist/linux-2.4.x/init/main.c の static int init(void * unused)
| |
initプロセスを立ち上げる部分です。romfsには/bin/initと/bin/shは存在するはずなので、起動されても良さそうなものなのですが。
少し上のソースにconsoleのエラーメッセージもありました。
| |
これを見る限り、/dev/consoleや/bin/initが見えていないように思えます。しかし、起動時のメッセージでは、romfsはmountされているように見えます。
| |
romfsをmountしてみる
何らかの原因でromfsが正常に読めないのではと、実際のromfs.imgの中身をのぞいてみることにしました。romfsをmountするには以下のようにループバックを指定します。
| |
ビルドで生成されたromfs.imgをWSL2でmountしようとしましたが、うまく動かなかったのでVMware上のubuntuにコピーして確認しました。

mountできました。lsで/binを見てみます。

initもありますし、shもあります。/devもみてみます。

/dev/consoleも存在します。次は/etcです。

initが参照する/etc/inittabも存在します。ramfs.imgがありますが、これは/varにマウントされるもののようです。

このような状態で環境としては問題無いようにみえます。
カーネルからデバック情報を出力してみる
試しにkernelから情報を表示してみました。uClinux-dist/linux-2.4.x/init/main.cに以下の修正を加えてビルドします。
| |
この修正により、execve()にプログラムのファイル名が渡されているか確認できるはずです。フラッシュメモリに書き込んでリセットしたところ、渡されているパスが確認できました。

動かない原因は何?
以上の結果から、romfsの内容は正しいのですが、正常にmountできておらずkernelからromfsのファイルが読めていない可能性が高そうです。romfsをmountしている箇所を確認してみます。(続く)
