嵌入式
linux
文件系统启动脚本及分析
在内核初始化完成后,嵌入式
linux
文件系统的启动过程主要包含一下几个步骤:
1.
执行
/sbin/init
文件
2.
执行
/etc/inittab
文件
3.
执行
/etc/init.d/rcS
文件
4.
执行挂载文件系统脚本
5.
执行内核模块脚本
6.
执行网络初始化脚本
7.
执行应用程序启动等脚本,如
qtopia
的启动
系统启动流程图:
1.
内核启动
init
内核启动的最后一步就是启动
init
进程,
init
进程是由内核启动的第一个(也是唯一一个和)用户进程(进程
ID
为
1
),它根据配置文件决定启动哪些程序,比如某些脚本
,
启动
shell
,运行用户指定的程序等,,那么
init
进程又是怎么启动的呢---是由内核调用
/sbin/init
文件而启动的,那有人就有人想知道内核是如何找到需要执行的
init
文件呢。下面看一下内核代码中
init/main.c
,如下所示:
static
int noinline init_post(void)
{
free_initmem();
/*
释放初始化内存
*/
unlock_kernel();
mark_rodate_ro();
system_state=SYSTEM_RUNNING;
numa_default_policy();
/*
打开控制设备
hanle=0=>stdin*/
if(sys_open((const
char __user*) “/dev/console”, O_RDWR,0)<0)
printk(KERN_WARNING
“Waring :unable to open an initial console./n”);
/*
复制控制台设备到
handle
1,2=>stout,stderr*/
(void)sys_dup(0);
(void)sys_dup(0);
/*
尝试执行
ramdisk_execute_command
指定的程序
*/
if(ramdisk_execute_command)
{
run_init_process(ramdisk_execute_command);
printk(KERN_WARNING “Failed to
execute %s/n”,ramdisk_execute_command);
}
/*
尝试执行
execute_command
指定的程序
*/
if(execute_command)
{
run_init_process(execute_command);
printk(KERN_WARNING “Failed to
execute %s/n”,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.”);
内核启动
init
进程的过程如下:
先打开控制台设备
/dev/console
,并复制了两个
handle,
这样
stdout,stdin,stderr
都指向
/dev/console,
这样就打开了标准设备输入,输出,标准错误设备,然后执行几个外部程序。
这几个程序中任何一个加载成功就进入了用户态,内核启动就宣告结束。
2.
执行
/etc/inittab
文件
当
init
启动成功后,需要做的就是分析
/etc/inittab
文件并执行它。其内容如下:
#
/etc/inittab
::sysinit:/etc/init.d/rcS
#
启动
shell
以
/dev/ttySAC0
作为控制台
ttySAC0::askfirst:-/bin/sh
#
按下
ctrl+alt+del
之后执行的程序,不过在串口控制台中无法输入
ctrl+alt+del
组合键
::ctrlaltdel:/sbin/reboot
#
重启关机前执行的程序
::shutdown:/bin/umount
-a -r
3.
执行
/etc/init.d/rcS
文件
这是一个脚本文件,可以在里面添加想自动运行的命令。内容如下:
#!
/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask
022
export
PATH runlevel prevlevel
#
网络配置脚本
.
/etc/init.d/network.sh
# load
zlg_fs
insmod
/bin/zlg_fs.ko
insmod
/bin/zlg_ffs.ko
mknod
/dev/zlg_fsa b 125 0
mknod
/dev/zlg_fsa1 b 125 1
mknod
/dev/zlg_fsa2 b 125 2
mount
-t vfat /dev/zlg_fsa /usr
mount
-a
4.
执行
/etc/fstab(
挂载文件系统脚本
)
在文件
/etc/init.d/rcS
中执行
mount
–a
时,就会按照文件
/etc/fstab
内容挂载相应的文件系统
.
#device
mount-point type options dump fsck order
none
/proc proc defaults 0 0
none
/dev/pts devpts mode=0622 0 0
tmpfs
/dev/shm tmpfs defaults 0 0
(1)device
:
要挂接的设备,如
/dev/hda2
-
mount-point:
挂接点
-
type:
文件系统类型,如
pro,jffs2,nfs
-
options:
挂接参数,以逗号隔开
-
dump
和
fsck
order
:用来决定控制
dump,fsck
程序的行为。
5.
接着就会执行一些内核模块和网络俄配置脚本,最后执行应用程序启动等脚本,如
qtopia
的启动。