构建根文件系统启动(1)
a、挂接根文件系统
内核怎样启动第一个应用程序 {
b、启动应用程序
1、打开设备
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");
(void) sys_dup(0); 复制
(void) sys_dup(0); 复制
"/dev/console" 里面为标准输入输出错误,printf 、scanf、err() 终端 现在为串口0
if (execute_command) {run_init_process(execute_command);printk(KERN_WARNING "Failed to execute %s. Attempting ""defaults...\n", execute_command);}run_init_process("/sbin/init");run_init_process("/etc/init");run_init_process("/bin/init");run_init_process("/bin/sh");
2、通过run_init_process启动应用程序具体哪一个依次优先考虑(执行后一去不复返):
a、命令行init = xxxxxxxxxxxxxxx(u-boot传过来的参数)
b、/sbin/init
c、............
d、.............
f、.............
构建根文件系统
busybox ls cp cd ........
lrwxrwxrwx 1 1000 1000 7 Jan 6 2010 /bin/ls -> busybox
lrwxrwxrwx 1 1000 1000 7 Jan 6 2010 /bin/cp -> busybox
执行ls cp其实就是执行 busybox应用程序
lrwxrwxrwx 1 1000 1000 14 Jan 6 2010 /sbin/init -> ../bin/busybox
u-boot:启动内核
内核:启动应用程序 --》先启动 /abin/init -->启动客户程序
1、配置文件
init程序 { 2、解析配置文件
3、执行应用程序
busybox --》 init_main
parse_inittab
file = fopen(INITTAB, "r"); //打开配置文件/etc/inittab
new_init_action //1、创建一个init_action结构,填充
//2、把这个结构放入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子进程
waitpid(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_actions(RESPAWN);
if (a->pid == 0) {
a->pid = run(a);
}
run_actions(ASKFIRST);
if (a->pid == 0) {
a->pid = run(a);
打印\nPlease press Enter to activate this console.
等待回车
创建子进程
}
wpid = wait(NULL); //等待子进程退出
while (wpid > 0) {
a->pid = 0; //退出后,就设置pid=0
}
}
配置文件:
a、指定程序
b、何时执行
从默认的new_init_action反推出默认的配置文件
#inittab格式:
#<id>:<runlevels>:<action>:<process>
#id =》 /dev/id 用作终端: stdin ,stdout,stderr:printf,scanf,err
#runlevels:忽略
#action:执行时机
# <action>: Valid actions include: sysinit, respawn, askfirst, wait, once,
# restart, ctrlaltdel, and shutdown.
#process:脚本或应用程序
::CTRLALTDEL:reboot::SHUTDOWN:umount -a -r::RESTART:init::ASKFIRST;-/bin/shtty2::ASKFIRST;-/bin/shtty3::ASKFIRST;-/bin/shtty4::ASKFIRST;-/bin/sh::SYSINIT:/etc/init.d/rcS /* Reboot on Ctrl-Alt-Del */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, "");
new_init_action(ASKFIRST, bb_default_login_shell, VC_2);#define LIBBB_DEFAULT_LOGIN_SHELL "-/bin/sh"# define VC_2 "/dev/tty2"
new_init_action(ASKFIRST, -/bin/sh, /dev/tty2);
struct init_action {struct init_action *next;int action; pid_t pid; char command[INIT_BUFFS_SIZE]; char terminal[CONSOLE_NAME_SIZE]; };
static void new_init_action(int action, const char *command, const char *cons) {struct init_action *new_action, *a, *last;if (strcmp(cons, bb_dev_null) == 0 && (action & ASKFIRST))return;/* Append to the end of the list */for (a = last = init_action_list; a; a = a->next) {/* don't enter action if it's already in the list,* but do overwrite existing actions 已存在则覆盖,否者新建*/if ((strcmp(a->command, command) == 0)&& (strcmp(a->terminal, cons) == 0)) {a->action = action;return; }last = a;}new_action = xzalloc(sizeof(struct init_action));if (last) {last->next = new_action;} else {init_action_list = new_action;}strcpy(new_action->command, command);new_action->action = action;strcpy(new_action->terminal, cons);messageD(L_LOG | L_CONSOLE, "command='%s' action=%d tty='%s'\n",new_action->command, new_action->action, new_action->terminal);
new_init_action(int action, const char *command, const char *cons)
最小根文件系统需要
1、/dev/console /dev/null //如果没有设置标准输出则定位到这
2、init本身即busybox
3、/ect/inittab
4、配置文件里指定的应用程序
5、库
转载于:https://www.cnblogs.com/CZM-/p/5078011.html
构建根文件系统启动(1)相关推荐
- 从ramdisk根文件系统启动Linux
今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下. 其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆). 开发环境:Fed ...
- Ubuntu环境搭建支持设备树,内核和根文件系统启动
Ubuntu环境搭建支持设备树,内核和根文件系统启动 使用tftp获取设备树和内核文件 1.搭建TFTP服务器 sudo apt-get install tftp-hpa tftpd-hpa sudo ...
- 菜鸟笔记--debian根文件系统启动时[FAILED] Failed to start Create Volatile Files and Directories.
今天移植debian的根文件系统到开发板上,根文件系统启动时一堆红色报警,很扎眼. [FAILED] Failed to start Create Volatile Files and Directo ...
- TQ2416通过nfs挂载根文件系统启动
1.Ubuntu12.04搭建nfs服务器: 简要流程如下: 1). sudo /etc/init.d/portmap restart sudo /etc/init.d/nfs-kernel-serv ...
- Linux内核3.0移植并基于Initramfs根文件系统启动
Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先, ...
- linux 内核 ramdisk,Ramdisk根文件系统启动Linux(单独的ramdisk镜像)
[size=13.63636302947998px]具体步骤如下: 1.解压内核源码树 解压kernel.tar.gz2到自己的工作目录,其他的开发板就自己找相应的kernel,或者自已移植. [si ...
- linux根文件系统配置,嵌入式Linux的Cramfs根文件系统配置的解决方案
1 引言 随着电子产业的不断发展,基于 ARM 技术的系统设计和开发平台越来越多地在控制 类.消费类.通信类等电子产品中广泛应用.从软件角度上看,构建基于ARM 技术的linux 系统要涉及到引导加载 ...
- 嵌入式Linux 的Cramfs 根文件系统配置成可读可写
嵌入式Linux 的Cramfs 根文件系统配置成可读可写 1.概述 从软件角度上看,构建基于ARM技术的linux系统要涉及到引导加载程序.Linux内核.文件系统.用户应用程序几部分的设计.文件 ...
- linux 文件系统 启动,linux kernel文件系统启动部分
现在的kernel里,有个叫做ramfs的文件系统,会把initrd(或者ramdisk,为惯性叫法)里的东西挂载到early-rootfs里(即rootfs,是ramfs的一个特殊实例),执行一些在 ...
最新文章
- 图论 ---- C. Graph Transpositions(数据分阶段分层图最短路(二维) + 贪心)
- Java开发中Websocket的技术选型参考
- Android Git 客户端
- iOS基础知识点总结
- SQL SERVER2000存储过程调试
- php 注册自动登录,php – 创建第二个自动登录用户的登录页面
- Python中abs()和fabs()方法之间的区别
- dubbo-admin管理平台搭建
- go语言学习初探(二)基础语法
- 将pdf书籍变成横排的方法
- STM32H7---高速缓存Cache(一)
- idea 填充变量类型_填充IntelliJ IDEA项目
- 为什么使用交叉熵代替二次代价函数_Softmax回归与交叉熵损失的理解
- laravel 5连接MySQL_Laravel 手记(连接mysql)
- Replace Record with Data Class
- MacBook安装telnet工具和使用
- 地产公司新建商业中心调研-调研内容
- cad里面f命令用不了_cad命令_CAD命令中 F 命令是什么作用?
- SiamRPN++理解
- 服务器配置ipv6网站,服务器配置ipv6地址
热门文章
- HDU 2660 Accepted Necklace
- 在VMware ESX Server使用华为存储
- 中国汽车涂料发展的初期
- html json 访问工程,SpringBoot:Web项目中如何优雅的同时处理Json和Html请求的异常...
- redis集合数据过期_如何从Redis中的集合中自动删除过期的密钥?
- Python爬虫框架Scrapy学习笔记
- Java开发四年的程序员想再学习一门语言,该选着C还是Python呢?
- android 中自定义安装,AndroidStudio 自定义配置
- 语言准备客票问题_菲律宾出国留学需要准备什么?
- python中类的定义方法_python中类的定义方法