電源を入れた後、コンピュータは簡単な自己診断プログラムを実行します。異常がないことを確認すると 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 が実行されます。
ここで少しカーネルソースを読んでみます。
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 とするべきです。
参考文献
前へ | 起動プロセス入門 | 次へ |