MC68EZ328 DragonOne SBCでuClinuxを動かす(6) ~initスレッドを追う~

ようやくinitスレッドの起動までできました。これまでたどったソースから、Linuxの起動メッセージの以下の部分まではたどり着いたはずです。

Linux version 2.4.34.5-uc0 (ocha@M715Q-TINY) (gcc version 4.7.2 (GCC) ) #49 Sat May 22 22:05:45 JST 2021
68EZ328 DragonBallEZ support (C) 1999 Rt-Control, Inc
uClinux/MC68EZ328
Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne On node 0 totalpages: 2048 zone(0): 0 pages. zone(1): 2048 pages. zone(2): 0 pages. Kernel command line: Calibrating delay loop... 0.89 BogoMIPS Memory available: 7772k/8064k RAM, 0k/0k ROM (341k kernel code, 186k data) Dentry cache hash table entries: 1024 (order: 1, 8192 bytes) Inode cache hash table entries: 512 (order: 0, 4096 bytes) Mount cache hash table entries: 512 (order: 0, 4096 bytes) Buffer cache hash table entries: 1024 (order: 0, 4096 bytes) Page-cache hash table entries: 2048 (order: 1, 8192 bytes) POSIX conformance testing by UNIFIX

以降はinitスレッドでの処理になります。この中でルートディレクトリのmount処理も行われます。

initスレッド

実はinitスレッドはシンプルです。カーネルの初期化を進め最終的にはinitプロセスを起動します。今回はromfsのルートファイルシステムがmountできていないのが問題なのでそこを中心に追います。

static int init(void * unused)
{
struct files_struct *files;
lock_kernel();
do_basic_setup();
prepare_namespace();
free_initmem();
unlock_kernel();
files = current->files;
if(unshare_files())
panic("unshare");
put_files_struct(files);
if (open("/dev/console", O_RDWR, 0) < 0)
printk("Warning: unable to open an initial console.\n");
(void) dup(0);
(void) dup(0);
if (execute_command)
run_init_process(execute_command);
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
panic("No init found.  Try passing init= option to kernel.");
}

今回問題となっているNo init foundやinitial consoleの文字が見えます。まずはdo_basic_setup()をみておきます。

do_basic_setup

do_basic_setupではソケットの初期化と必要なスレッドの初期化を行います。mountに関するものは無さそうです。

static void __init do_basic_setup(void)
{
child_reaper = current;
/* Networking initialization needs a process context */
sock_init();
start_context_thread();
do_initcalls();
}

すでに何度も確認しているのでわかっているのですが、ルートファイルシステムをmountしているのは、prepare_namespace()です。ここを中心にみていきます。(続く)

タイトルとURLをコピーしました