Openwrt linux 启动流程

OpenWRT 启动流程

内核启动过程:【/init/mian.c】

Uboot --> start_kernel() --> rest_init() --> kernel_thread(kernel_init) --> kernel_init_freeable()

初始化过程:

Linux Kernel(kernel_init) --> /etc/preinit  --> /sbin/init --> /etc/preinit, /sbin/procd --> /sbin/procd。

/etc/preinit脚本是系统其它脚本的入口,在/etc/preinit脚本中,第一条命令为:

[ -z “$PREINIT” ] && exec /sbin/init

由于一开始PREINIT没有被设置,所以为空,执行/sbin/init

其中/sbin/init 由procd/init.c编译产生的(它先执行一些ulog_open、early、cmdline等函数。最后执行preinit()函数。)

init.c部分代码如下:

当procd退出后会调用execvp函数执行/sbin/procd,替换当前的init进程,这就是系统启动完成后,进程号为1最终为/sbin/procd的由来,中间改变了几次。

preinit函数配置了环境变量PREINIT,然后再去fork进程来执行/etc/preinit,执行完毕后,再调用回调函数spawn_procd,在回调函数spawn_procd中调用了execvp函数来启动/sbin/procd,/procd最后执行/etc/init.d/目录下的文件,从而启动系统各个服务。

第二次开始执行 /etc/preinit的过程

当PREINIT被设置好了,preinit就会执行上面的代码。

可以看到三个脚本被启动:

. /lib/functions.sh

. /lib/functions/preinit.sh

. /lib/functions/system.sh

这几个脚本主要定义了shell函数,在preinit.sh中,定义了一些函数挂到hook上,当运行时,这些hook会按函数加入的顺序来启动函数。如boot_hook_init()等函数,之后使用boot_hook_init定义了五个hook节点:

boot_hook_init preinit_essential

boot_hook_init preinit_main

boot_hook_init failsafe

boot_hook_init initramfs

boot_hook_init preinit_mount_root

后面就是当前shell下依次在执行/lib/preinit/目录下的脚本:

定义那些要添加到hook结点的函数,然后通过boot_hook_add将该函数添加到对应的hook结点。

最后,/etc/preinit就会执行boot_run_hook函数执行对应hook结点上的函数。在当前环境下只执行了preinit_essential和preinit_main结点上的函数,如下:

boot_run_hook preinit_essential

boot_run_hook preinit_main

到此,/etc/preinit执行完毕并退出。

当/etc/preinit执行完毕并退出,进程消失了,但此时已经调用了回调函数spawn_procd(),而回调函数spawn_procd()里面execvp(“procd”),所以最终procd会重新被执行,从而启动系统其它各个配置!

lib/preinit/

在/etc/preinit脚本中有如下代码:
. /lib/functions.sh
. /lib/functions/preinit.sh
. /lib/functions/system.sh
查看. /lib/functions/preinit.sh脚本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/234853.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM搭建系统

原理 SSM集成 SpringSpringMvcMybatis集成 框架集成核心,如果你的项目中,用到了Spring框架,那么其他框架主要就是和Spring集成; 和Spring集成的核心思路: 把当前框架的核心类,交给Spring管理&#xff08…

GPU逻辑管线

文章目录 前言一、渲染流水线二、英伟达显卡简化概念图(GPU)1、我们的Shader会调用英伟达提供的 API2、调用API后,把Shader用到的指令存储在Pushbuffer中3、然后图元分配器,会把 模型数据 和 Shader 指令传入GPU中4、这个SM是每个…

设计模式之装饰模式(2)--有意思的想法

目录 背景概述概念角色 基本代码分析❀❀花样重难点聚合关系认贼作父和认孙做父客户端的优化及好处继承到设计模式的演变过程 总结 背景 这是我第二次写装饰模式,这一次是在上一次的基础上进一步探究装饰模式,这一次有了很多新的感受和想法,也…

C++——AVL树

作者:几冬雪来 时间:2023年11月30日 内容:C板块AVL树讲解 目录 前言: AVL树与搜索二叉树之间的关系: AVL树概念: 插入结点: 平衡因子: 旋转: 双旋: …

RabbitMQ登录控制台显示--你与此网站的连接不是私密连接

一、RabbitMQ默认账号 Note: The default administrator username and password are guest and guest. 注:默认管理员用户名和密码为guest和guest 二、自己修改过或者注册的情况 由于本人之前用过,注册过账号密码,在登录时,用户名账号有异常出现以下问题 解决方案: 因为我的rab…

高端制造业中的通用性超精密3D光学测量仪器

超精密光学3D测量仪器具有高精度、自动化程度高、实时反馈和范围广等优势。它能够实现微米级别的精确测量,能够精确测量产品的尺寸、形状和表面粗糙度等,具有广泛的应用价值和重要意义。 超精密光学3D测量仪器配备多种传感器、控制器和计算机系统&#…

虚拟数据生成_以Python为工具

生成虚拟数据_以Python为工具 生成虚拟数据技术在现实生活中具有多个重要的应用领域。它为数据隐私保护、机器学习算法开发、数据处理和可视化等方面提供了实用且有价值的解决方案。尤其是能满足定制化需求的虚拟数据,在预期的方向上让数据定向随机。 &#x1f339…

ODBC一般操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…

sublime Text使用

1、增加install 命令面板 工具(tool)->控制面板(command palette) -> 输入install ->安装第一个install package controller,以下安装过了,所以没展示 2、安装json格式化工具 点击install package,等几秒会进入控制面板&#xff0…

六:Day01_Spring Boot01

一、Spring Boot简介 1. 概念简介 Spring Boot是Spring公司的一个顶级项目,和Spring Framework是一个级别的。 Spring Boot实际上是利用Spring Framework 4 自动配置特性完成。编写项目时不需要编写xml文件。 2. 启动器介绍 Spring Boot的启动器实际上就是一个依赖…

keepalive路由缓存实现前进刷新后退缓存

1.在app.vue中配置全局的keepalive并用includes指定要缓存的组件路由name名字数组 <keep-alive :include"keepCachedViews"><router-view /></keep-alive>computed: {keepCachedViews() {console.log(this.$store.getters.keepCachedViews, this.…

网工内推 | 云计算运维,云相关认证优先,最高30K,带薪年假

01 安畅网络 招聘岗位&#xff1a;云计算运维工程师 职责描述&#xff1a; 1、负责对公有云平台的计算、存储、网络资源等IAAS/SAAS/PAAS层产品组件日常交付部署运维工作&#xff0c;包括调试、配置、维护、监控、优化等工作&#xff1b; 2、负责对操作系统及应用日常运行维护…