linux kernel启动是从./init/main.c中开始的,其大概流程是: 1. 调用start_kernel()函数; 2. start_kernel()调用rest_init()函数; 3. rest_init()调用kernel_init()函数; 4. kernel_init()调用init_post()函数; 5. init_post()调用run_init_process()函数去创建init进程, 这个函数中的代码如下: run_init_process("/init"); run_init_process("/sbin/init"); run_init_process("/etc/init"); run_init_process("/bin/init"); run_init_process("/bin/sh"); 这时因为run_init_process()函数创建init进程成功后就不会返回了。
init程序会做哪些事呢? 1. 读/etc/inittab,从中读取当前系统预设的run level, sh-# cat /etc/inittab # /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
# The default runlevel. id:4:initdefault: .... sh-# exit exit INIT: Entering runlevel: 4
2. 根据读出的run level的值,选择执行不同的服务,比如: 如果系统预设的run level值为4,那么执行配置在/etc/rc4.d/下的服务; 如果系统预设的run level值为5,那么执行配置在/etc/rc5.d/下的服务。 用户自己的程序都是根据需要,进行相应的配置。
以上,linux kernel就启动起来了。
在shell下验证查看,init进程所执行的程序就是预设的/sbin/init程序。 sh-# ls -l /sbin/init -rwxr-xr-x 1 root root 28323 Oct 10 03:00 /sbin/init sh-# ls -l /proc/1/exe lrwxrwxrwx 1 root root 0 Oct 10 06:19 /proc/1/exe -> /sbin/init sh-#