根文件系统启动、init分析、配置
一、根文件系统启动一个应用程序
内核:启动应用程序{
1、挂接根文件系统
2、启动第一个应用程序
}
1、挂接根文件系统mount yaffs:内部含有第一应用程序
2、内核启动第一个应用程序:
a:
打开一个设备 open (“/dev/console ”)
sys_dup(0);
sys_dup(0); //“复制”一个打开的文件号,使两个文件号都指向同一个文件
//第一个作为printf 二:scanf 三:err
b:
run_init_process(命令行init =xxx(linuxrc)或者/sbin/init或者..) 只执行一个,内部为死循环
二、init进行分析
ls cp 等指令都是连接到 busybox
init程序{
①:读取配置文件
②:解析配置文件
③:执行(用户程序)
}
busybox->init_main
parse_inittab
file = fopen(INITTAB,"r"); //打开配置文件 /etc/inittab
new_init_action //①、创建一个init_cation结构体,填充
//②、把这个结构体放入init_action_list链表
run_actions(SYSINIT);
waitfor(a,0); //执行应用程序,等待它执行完毕
run(a); //创建process子进程
waitpid(runpid,&status,0); //等待process子进程结束
delete_init_action(); //在init_action_list链表里删除
run_actions(WAIT);
waitfor(a,0); //执行应用程序,等待它执行完毕
run(a); //创建process子进程
waitpid(runpid,&status,0); //等待process子进程结束
delete_init_action(); //在init_action_list链表里删除
run_actions(ONCE);
run(a); //创建process子进程
delete_init_action(); //在init_action_list链表里删除
while(1){
run_actions(RESPAWN);
if(a->pid == 0){
a->pid = run(a);
}
run_actions(ASKFIRST);
if(a->pid == 0){
a->pid = run(a);
打印: Please press Enter to activate this console.
等待回车
创建子进程
}
wpid = wait(NULL); //等待子进程退出
while(wpid > 0){
a->pid = 0; //退出后,就设置pid = 0
}
}
三、配置根文件系统
最小根文件系统需要:
①/dev/console、 /dev/null
②init=>busybox
③ /etc/inittab
④配置文件指定的程序
⑤C库
②:busybox源码生成init 内含sbin、bin、linuxrc、usr
①:再添加 /dev/console /dev/null
③:/etc /inittab
⑤:拷贝工具链里的c库(.so)
再制作成yaffs影响文件,制作工具:mkyaffs2imae (yaffs2 jffs2)
1、额外挂载虚拟文件系统目录
/proc :进程信息使用的挂载虚拟的文件系统
a、手动挂载 :mount -t proc none /proc
b、自动挂载 : 在inittab里加一个配置脚本 ::sysinit:/etc/init.d/rcS
rcS里加上mount -t proc none /proc 或者 mount -a (会去/etc/fstab脚本里去添加挂载)
/etc/fstab文件格式:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
2、udev 自动创建设备节点
添加到fstab
sysfs /sys sysfs
tmpfs /dev tmpfs
…
3、NFS文件系统
每次制作好文件系统不需要烧写,而是通过网络进行挂载
两种方法:
a、从flash上启动根文件系统,再用命令挂接NFS mount -t nfs -o nolock 192.168.服务ip:/目录 /本地目录
前提:是要在服务器上配置NFS服务 /etc/export 添加 /xxx *(rw.sync.no_root_squash)
再重启 /etc/init.d/nfs-kernel-server restart
b、直接从NFS启动,修改uboot命令行参数 bootargs
bootargs = root=/dev/nfs nfsroot=… ip=… init=/linuxrc console=ttySAC0
nfsroot=…
ip=…