jz2440 根文件系统 移植(yaffs2、busybox部分)

来源:互联网 发布:天房网络客服电话 编辑:程序博客网 时间:2024/05/16 13:54
后续内核执行流程:
start_kernel 
        setup_arch      //解析u-boot传入的启动参数
setup_command_line  //解析u-boot传入的命令参数
rest_init
kernel_init
prepare_namespace
   mount_root    //挂接根文件系统
init_post 
   //执行应用程序
(1)重要知识点承接:
内核执行的第一个程序,是挂载根文件系统下程序,所以第一个程序是/sbin/init程序,即去解析由busyx配置好的文件,然后再去执行重要用户程序。


(2)重要的init配置格式:
inittab格式:
<id>:<runlevels>:<action>:<process>


id =>/dev/id,用作终端:stdin,stdout,stderr: print,scanf,err
<runlevels>:可以忽略
action:指定时机
process:应用程序或脚本


例如:init:ASKFIRST:


ls/cp --> busybox
那么busybox的初始化程序要完成如下工作:
init程序 :1、读取配置文件
  2、解析配置文件
  3、执行(应用程序)
其中配置文件要做的事情:1、指定程序  
2、何时执行
(3)
busybox->init_main
...
parse_inittab(busybox中文件可能缺省)
fopen = (INITTAB,"r");//打开配置文件/etc/initab
new_init_action(..)
  init_action_list //链表 
struct init_action {    
struct init_action *next;
int action;
pid_t pid;
char command[INIT_BUFFS_SIZE];
char terminal[CONSOLE_NAME_SIZE];
};
new_init_action(ASKFIRST,"-/bin/sh","/dev/tty2");
static void new_init_action(int action,const char *command,const char *cons)
执行时机          执行程序            id用作终端
1、创建一个init_action结构,填充
2、把这个结构放入链表init_action_list




源码分析:
从默认new_init_action反推出默认的配置文件:
    new_init_action(CTRLALTDEL, "reboot", "");
/* Umount all filesystems on halt/reboot */
new_init_action(SHUTDOWN, "umount -a -r", "");
/* Swapoff on halt/reboot */
if (ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, "swapoff -a", "");
/* Prepare to restart init when a HUP is received */
new_init_action(RESTART, "init", "");
/* Askfirst shell on tty1-4 */
new_init_action(ASKFIRST, bb_default_login_shell, "");
new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
/* sysinit */
new_init_action(SYSINIT, INIT_SCRIPT, "");
解析结果:(如果没有配置文件!!!)
<id>:<runlevels>:<action>:<process>
::CTRLALTDEL:reboot
::SHUTDOWN:umount -a -r
::RESTART::init
::askfirst:~/bin/sh
tty2::askfirst:~/bin/sh
tty3::askfirst:~/bin/sh
tty4::askfirst:~/bin/sh
::SYSINIT:INIT_SCRIPT
1、创建一个init_action结构,填充
2、把这个结构放入链表init_action_list
busybox->init_main
...
parse_inittab(busybox中文件可能缺省)
fopen = (INITTAB,"r");//打开配置文件/etc/initab
new_init_action(..)             //创建一个init_action结构,填充
  init_action_list //链表 //把这个结构放入init_action_list链表
run_actions(SYSINIT)
waitfor(a,0);       //执行应用程序,等待它执行完毕
run(a);        //创建process子进程
waitpid(runpid,&status,0)      //等待结束
delete_init_action(a); //在init_action_list链表里删除
run_actions(WAIT)
waitfor(a,0);       //执行应用程序,等待它执行完毕
run(a);        //创建process子进程
waitfor(runpid,&status,0)      //等待结束
delete_init_action(a); //在init_action_list链表里删除
run_actions(ONCE)
run(a);        //创建process子进程
delete_init_action(a); //在init_action_list链表里删除
while(1){
run_action(RESPAWN);
if(a->pid==0){
a->pid = run(a);
}
run_action(ASKFIRST);
if(a->pid==0){
a->pid = run(a)
}
wpid = wait(NULL);//等待子进程退出
while(wpid > 0)
{
a->pid = 0;//退出后,就设置pid=0
}
}
init_main只是busybox其中的一个应用程序,还有ls_main


总结最小的根文件系统所必须的:
|-1、/dev/console  /dev/null 
| 2、init => busybox
| 3、/etc/inittab
| 4、配置文件指定的程序
|-5、C库

0 0