init プログラム起動までの過程

電源を入れた後、コンピュータは簡単な自己診断プログラムを実行します。異常がないことを確認すると BIOS 上での設定に基づき、マスタブートプログラムを実行します。ここでの設定とは マスタブートプログラムをどのデバイスから読み込むかを指定するものです。一般的にはフロッピーディスクから走査します。最もよく利用されているマスタブートプログラムには DOS 付属のものや、LILO、GNU GRUB などがあります。但し、DOS 付属のマスタブートプログラムを利用する場合には、セカンドブートプログラムとして LILO または GNU GRUB などを用意する必要があります。なぜなら、DOS 付属のブートプログラムは Linux カーネルを実行することができないからです。

Slackware Linux では LILO が標準のブートプログラムですので、LILO を例として説明します。マスタブートプログラムから実行された LILO または、マスタブートプログラムとして実行された LILO は次に Linux カーネルを実行します。Slackware Linux では /boot/vmlinuz が Linux カーネルです。

ブートプログラムはその役目を終え、制御は Linux カーネルに移ります。そして、Linux カーネルはハードウェアの自動認識を試みます。ほとんどのハードウェアはここで認識されることになります。

最後に Linux カーネルは init プログラムを実行します。Slackware Linux では /sbin/init が実行されます。

ここで少しカーネルソースを読んでみます。

/usr/src/linux/init/main.c
805 static int init(void * unused)
806 {
807         lock_kernel();
808         do_basic_setup();
809
810         prepare_namespace();
811
812         /*
813          * Ok, we have completed the initial bootup, and
814          * we're essentially up and running. Get rid of the
815          * initmem segments and start the user-mode stuff..
816          */
817         free_initmem();
818         unlock_kernel();
819
820         if (open("/dev/console", O_RDWR, 0) < 0)
821                 printk("Warning: unable to open an initial console.¥n");
822
823         (void) dup(0);
824         (void) dup(0);
825
826         /*
827          * We try each of these until one succeeds.
828          *
829          * The Bourne shell can be used instead of init if we are
830          * trying to recover a really broken machine.
831          */
832
833         if (execute_command)
834                 execve(execute_command,argv_init,envp_init);
835         execve("/sbin/init",argv_init,envp_init);
836         execve("/etc/init",argv_init,envp_init);
837         execve("/bin/init",argv_init,envp_init);
838         execve("/bin/sh",argv_init,envp_init);
839         panic("No init found.  Try passing init= option to kernel.");
840 }

835 行目で /sbin/init を実行しようとしているのが分かります。/sbin/init を実行することができなかった場合にのみ /etc/init の実行を試みます。以下その繰り返しです。但し、Slackware Linux で使われるいくつかのプログラムは /sbin/init 以外は認識しません。よって、init プログラムは /sbin/init とするべきです。

参考文献


前へ 起動プロセス入門 次へ