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库
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
- jz2440 根文件系统 移植(yaffs2、busybox部分)
- busybox移植yaffs2根文件系统
- 利用Busybox移植Yaffs2根文件系统
- JZ2440:busybox构建根文件系统
- JZ2440:yaffs2 格式根文件系统制作
- JZ2440 制作yaffs2文件系统
- Yaffs2根文件系统移植
- Yaffs2根文件系统移植
- 使用busybox构建yaffs2根文件系统(前言)
- Busybox - Yaffs2文件系统
- 让移植的busybox文件系统(yaffs2)可读写
- mini2440中busybox和yaffs2文件系统的移植
- initramfs文件系统的制作及yaffs2根文件系统制作(busybox-1.20.2)
- 根文件系统制作 busybox移植
- 制作新的根文件系统---busybox-1.20.0---(JZ2440-S3C2440)
- 利用busybox制作yaffs2文件系统
- 利用busybox制作yaffs2文件系统
- 用busybox制作yaffs2文件系统
- 共享库C/C++
- EPASWMM界面部分编译
- 全新64位CentOS6.X上LAMP架构搭建备忘-apache的安装问题解决
- .pop
- instanceof用法
- jz2440 根文件系统 移植(yaffs2、busybox部分)
- hibernate3第四章之一对多cascade、fetch
- std::regex在VS2013中的一个坑
- HDU - 4276(转树形dp)
- handlebars的使用
- Sprite3D在UI层的绘制和遮挡
- 新手程序员必读:推进编程工作的七条箴言
- Spring的事务配置
- linux下db2常用的命令