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库
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库
相关文章推荐
- 在一个服务器上搭建好php环境,在服务器上可以访问,其他机器可以访问服务器但网页无法访问
- phpstorm 9.0最新 注册码
- php中的const和define区别(补充)
- php重定向网页
- php中的die()和exit()区别
- php中的接口和抽象类
- php中的clone对象
- php中static和const
- php实现post和get
- PHP中可以静态调用非静态方法么?(诡异的调用)
- github开源php项目
- empty(), is_null(), isset()(区别)
- php大力力 [019节]php分页类的学习
- php大力力 [018节]如何联系大力力
- YII2中向布局中传参
- php面向对象与面向过程两种方法给图片添加文字水印
- php基础教程
- php-fpm error unable to bind listening socket for
- 天下数据分享服务器FTP安全攻略
- 安装PHP可能会出现的错误