如何优雅的了解OpenHarmony-v4.1-Release的init启动流程

news2024/11/26 22:52:52

一、启动概述

在产品代码成功编译通过后,开始进行下一步的运行调测阶段,而运行调测第一步便需要了解系统的启动过程。对于 OpenHarmony 来说,系统启动流程如下:

---> uboot启动
    ---> uboot启动内核
        ---> 内核挂载根文件系统(此时为ramdisk文件系统)
            ---> 运行ramdisk中的第一个程序
                ---> 根据fstab中内容挂载文件系统
                    ---> 切换root路径为/usr
                        ---> 第一个程序为init则进行系统初始化
                        ---> 第一个程序为init_early则通过execv启动init

关于 uboot 启动到内核挂载根文件系统部分属于 Linux 内容,这里不做介绍,以下我们开始来介绍从 ramdisk 启动的第一个程序,我们以 init_early 模式为例开启我们新的篇章

二、ramdisk 文件系统介绍

2.1 什么是 ramdisk 文件系统

ramdisk 是一种将内存中的的一块区域作为物理磁盘来使用的一种技术,也可以说,ramdisk 是在一块内存区 域中创建的块设备,用于存放文件系统。对于用户来说,可以把 ramdisk 与通常的硬盘分区同等对待来使用。ramdisk 不适合作为长期保存文件的介质,掉电后 ramdisk 的内容会消失。

2.2 ramdisk 文件系统和 ramdisk.img 有什么关系

在 Linux 中,根文件系统是需要挂载到实际的物理磁盘中的,而 ramdisk.img 便是 ramdisk 文件系统挂载的磁盘,即 ramdisk.img 是 ramdisk 文件系统的打包镜像。
可以对比 rootfs,我们通过 busybox 制作出来的是 rootfs 文件系统,但是实际启动使用的时候我们时我们需要将 rootfs 文件系统打包制作成 rootfs.ext4 一样。

三、init_early 程序介绍

3.1 init_early 程序注意事项

init_early 程序作为第一个启动的程序,由于当前挂载的文件系统为 ramdisk 文件系统,该系统的目的仅仅是为了拉起 OpenHarmony 真正的文件系统,可以说仅仅是为了 init_early 程序的运行,因此内部的库很少,仅有以下内容,所以 init_early 程序仅可以依赖以下这些库

wen_fei@rh-Z790-UD:~/OpenHarmony/dayu800-v4.1-release/out/dayu800/packages/phone/ramdisk/lib64
$ tree
.
├── chipset-pub-sdk
│   ├── libpcre2.z.so
│   ├── libsec_shared.z.so
│   └── libselinux.z.so
├── libclang_rt.asan.so
├── libc++.so
├── libc.so
├── libinit_module_engine.so -> libinit_stub_empty.so
├── libinit_stub_empty.so
├── libload_policy.z.so
└── platformsdk
    └── librestorecon.z.so

3.2 为什么要有 init_early 程序

作为第一个基于 ramdisk 文件系统启动的程序,能够依赖的库有限,因此能实现的功能相对也不能复杂,通过使用 init_early 拉起 init 进程可以在尽可能减小 ramdisk.img 大小的同时很好的让 init 程序开发更加丰富的内容。
其次如果 init 程序加载有问题也可以通过 init_early 程序先启动到 shell,然后在 shell 中运行 init 进行调测。
以上内容均为个人猜想。

3.3 init_early 代码路径

该部分代码的编译参考:base/startup/init/services/init/standard/BUILD.gn
其 main 函数位于:base/startup/init/services/init/standard/main_early.c

3.4 init_early 代码介绍

从其 main_early.c 代码中可以看出 init_early 主要完成以下几个功能

  • 忽略终端信号,将 SIGPIPE 交给系统处理

  • 使能 InitLog 的 INIT_INFO 级别(非核心)

  • 初始化 EarlyLog(非核心)

  • 创建常用的文件和设备节点

  • 执行钩子函数,一般钩子链表是通过__attribute__((constructor))构造的函数添加的

  • 确实是否为升级模式

  • 根据 ramdisk 镜像中的 fstab 文件挂载镜像

  • 启动第二阶段 init

    • 关闭 stdio(此时便不能通过 printf 打印 log)
    • 切换 root 路径为/usr(system 文件系统)
    • 让 init 程序代码当前的 init_early 程序进行

注意这里是程序不是进程,因为 init_early 在 ramdisk 中是软链接为 init,因此进程对应的是 init,而不是 init_early

四、init 启动介绍

4.1 init 运行前准备工作

由于 init_early 的铺垫,此时 init 启动的实际文件系统已经不在 ramdisk 文件系统中了,而是位于 system 文件系统中。因此链接库的路径指定是通过 etc/ld-musl-namespace-riscv64.ini 该文件中设置的路径按照顺序链接的,所以首先必须确定 system 镜像中是否有该文件。
在 init 程序中有很多函数通过 MODULE_CONSTRUCTOR 将其添加到了 Hook 链表中,在 init 实际运行的时候会调用 HOOK 的执行接口,将所有的预处理函数调用执行。

4.2 init 启动失败调测

如果 init_early 加载 init 程序运行直接失败,我们可以在 init_early 最后添加如下代码后让串口进入 shell,然后在 shell 中直接运行 init 跟踪定位

execv("/bin/sh", NULL);

4.3 init 启动的流程

这部分就通过 init 的 main 函数进行阅读理解了,注意 HOOK 链表项都是通过 MODULE_CONSTRUCTOR 接口在 main 函数执行前添加的,详细请了解 gcc 的 __attribute__((constructor)) 属性
init 的 main 函数位于:base/startup/init/services/init/main.c

最后

如果你想成为一名鸿蒙开发者,以下这些资料将是十分优质且有价值,让你的鸿蒙开发之路事半功倍!相对于网上那些碎片化的知识内容,这份学习资料的知识点更加系统化,更容易理解和记忆。

鸿蒙Next全套VIP学习资料←点击领取!(安全链接,放心点击

包含了:【OpenHarmony多媒体技术、Stage模型、ArkUI多端部署、分布式应用开发、音频、视频、WebGL、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战】等技术知识点。

1.鸿蒙(HarmonyOS NEXT)最新学习路线

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。获取以上完整

版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

2.大厂面试必问面试题

3.鸿蒙南向开发技术

 4.鸿蒙APP开发必备

 5.HarmonyOS Next 最新全套视频教程

 6.鸿蒙生态应用开发白皮书V2.0PDF

获取以上完整鸿蒙HarmonyOS学习资料,请点击→

纯血版全套鸿蒙HarmonyOS学习资料

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解@EnableAspectJAutoProxy的力量

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

怎么用AI绘画完成设计创作?

AI绘画工具为设计师提供了强大的功能和便利性,用AI绘画进行艺术创作能够使设计师能够更快地迭代和优化设计方案,提高设计效率。那么怎么用AI绘画完成设计创作? 要使用AI绘画完成设计创作,首先需要选择一个合适的工具。目前市场上有很多优秀的…

大话设计模式解读03-装饰模式

本篇文章,来解读《大话设计模式》的第6章——装饰模式。并通过C代码实现实例代码的功能。 注:第3~6章讲的是设计模式中的一些原则(第3章:单一职责原则;第4章:开放-封闭原则;第5章:依…

吴恩达2022机器学习专项课程C2W3:2.26 机器学习发展历程

目录 开发机器学习系统的过程开发机器学习案例1.问题描述2.创建监督学习算法3.解决问题4.小结 误差分析1.概述2.误差分析解决之前的问题3.小结 增加数据1.简述2.增加数据案例一3.增加数据案例二4.添加数据的技巧5.空白创建数据6.小结 迁移学习1.简述2.为什么迁移学习有作用3.小…

考勤机如何选购

考勤机如何选购 选购目的:为强化管理,保证公司考勤工作顺利开展,拟在我司采用指纹识别技术进行员工考勤,如此可有效提升工作效率,而指纹识别考勤技术又是最为便捷、可靠且非侵入性的考勤方式。 指纹考勤…

Python Django 实现教师、学生双端登录管理系统

文章目录 Python Django 实现教师、学生双端登录管理系统引言Django框架简介环境准备模型设计用户认证视图和模板URL路由前端设计测试和部署获取开源项目参考 Python Django 实现教师、学生双端登录管理系统 引言 在当今的教育环境中,数字化管理系统已成为必不可少…

Hi3861 OpenHarmony嵌入式应用入门--点灯

本篇实现对gpio的控制,通过控制输出进行gpio的点灯操作。 硬件 我们来操作IO2,控制绿色的灯。 软件 GPIO API API名称 说明 hi_u32 hi_gpio_deinit(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO…

一文教你使用sql快速查询1对多数据关系,生成一个多维数据!

本篇文章主要讲解:利用mysql的sql特性,实现对多表查询下,一个用户对应多条记录数据查询为一条数据并以列表形式显示的教程。 日期:2024年6月17日 作者:任聪聪 一、创建数据库表 创建test_a表,内容如下&…

Python 全栈系列250 数据流实践

说明 之前好几个企业都提过飞机在飞的时候换发动机的例子,来比喻变革是多么无奈和危险。还有的说法更直接:不变等死,变就是找死,总得选一样。 后来我自己的体会也差不多是这样,总有一些窘境让你抉择:是忽忽…

在Qt编写的exe或者dll中设置版本号

1.背景 在别人编写的exe或者动态库中,通过右键–》属性–》详细信息中,通常都有版本信息: 那我们自己编译出来的Qt程序,如何设置这些版本号呢? 2.解决方案 参考【.pro文件中设置版本等信息】,只要在工…

【完结】无代码网页爬虫软件——八爪鱼采集器入门基础教程

《八爪鱼采集器入门基础教程》大纲如下: 课程所提软件,八爪鱼采集器下载: 1.软件分享[耶]八爪鱼,爬取了几百条网站上的公开数据,不用学代码真的很方便。[得意]2.发现了一个很棒的软件,?不用学python也可…

【UEditorPlus】后端配置项没有正常加载,上传插件不能正常使用

接上文【UEditorPlus】后端配置项没有正常加载,上传插件不能正常使用_ueditor ruoyi vue后端配置项没有正常加载,上传插件不能正常使用!-CSDN博客 成功解决图片、视频上传问题后,当服务部署在公网时,会存在大文件无法正常上传的问题。 出现…

微软修复Wi-Fi驱动高危漏洞 影响Windows所有版本 可通过局域网发起攻击

微软修复 WiFi 驱动程序中的高危安全漏洞,该漏洞影响 Windows 所有版本,可以通过公共 WiFi 等发起攻击。如果攻击者能够接入到目标设备所处的网络中,则可以悄无声息完成攻击,不需要用户进行任何交互。 在本月例行安全更新中微软修…

比特币的共识协议

目录 前言 一、铸币交易 1.铸币权 2.铸币交易(coinbase tx) 3.输入和输出 二、小型的区块链 1.见下图所示 2.哈希指针 3.双花攻击 三、块头块身,全节点轻节点 1.块头(block head) 2.块身 3.全节点full node(fully validating node…

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(六)---- 初窥操作系统启动流程(xv6启动)

系列文章目录 操作系统入门系列-MIT6.S081(操作系统)学习笔记(一)---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二)----课程实验环境搭建&#x…

数据库系统概论(个人笔记)(第四部分)

数据库系统概论(个人笔记) 文章目录 数据库系统概论(个人笔记)4、中间的SQL4.1 连接表达式4.2 视图4.3 事务4.4 完整性约束4.5 SQL数据类型和模式4.6 SQL中的索引定义4.7 授权 4、中间的SQL 4.1 连接表达式 Join Expressions Join…

10.无代码爬虫软件做网页数据抓取流程——工作流程设置与数据预览

首先,多数情况下免费版本的功能,已经可以满足绝大多数采集需求,想了解八爪鱼采集器版本区别的详情,请访问这篇帖子:https://blog.csdn.net/cctv1123/article/details/139581468 八爪鱼采集器免费版和个人版、团队版下…

视频监控平台:通过网络SDK对TCL网络摄像机进行PTZ控制 的源代码介绍及分享

目录 一、视频监控平台介绍 (一)概述 (二)视频接入能力介绍 (三)功能介绍 二、TCL网络摄像机 (一)360度全景自动旋转: (二)高清夜视和全彩…

五、路由协议

目录 一、为何划分子网? 二、静态路由 三、OSPF 3.1、OSPF原理 3.1.1、ospf四步过程 3.2、OSPF区域划分 3.2.1、为什么划区域? 3.2.2、划分规则 3.3、OSPF参数 3.4、五种报文 3.4.1、hello报文 3.4.2、DD报文 3.4.2、LSR、LSU、LSAck报文 3…

黄仁勋:下一波AI的浪潮是物理AI

B站:啥都会一点的研究生公众号:啥都会一点的研究生 最近AI圈又发生了啥? 快手视频生成大模型“可灵”开放邀测,效果对标 Sora 在OpenAl文生视频大模型Sora发布后,国内企业争相入局,快手视频生成大模型可…