您的位置:首页 > 编程语言 > PHP开发

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

2015-08-26 09:15 696 查看
后续内核执行流程:

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库
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: