鸿蒙系统分享,鸿蒙系统的启动流程学习分享
鸿蒙系统的启动流程
Liangkz 2021.04.11 Ver1.0
目录
1. 第一阶段:U-Boot启动
2. 第二阶段:汇编代码引导LiteOS-a内核
3. 第三阶段:内核LiteOS-a的C语言启动阶段
4. 第四阶段:鸿蒙系统应用层的启动
5. 鸿蒙应用(APP)的启动
6. #task命令查看进程/线程信息(简表)
声明:
严格来说本文档并非真正原创的,这是上了朱有鹏老师的免费课《想读懂鸿蒙2.0源码,也许你需要先懂这些》之后,做的一些总结。
课程时间一个半小时,内容也很多,学习过程中我发现朱老师的ppt上部分代码/文件,在我本地的鸿蒙系统代码上找不到,或者路径不相同,所以我就做了一些整理。
这里仅摘取课程中的鸿蒙系统在HI3516DV300平台上的启动流程部分(从30:00开始讲解启动过程)进行汇总和整理,如有错误,请朱老师和各位同学指正。后继在学习过程中会继续对本文当作修正升级。
我的本地代码是基于最新发布的OpenHarmony 1.1.0 LTS(2021-04-01)版本抓取的,代码根目录OHOS1_1_0LTS:
$repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony_release_v1.1.0 --no-repo-verify
$repo sync
在根目录下执行
OHOS1_1_0LTS$ hb set
[OHOS INFO] Input code path: .
OHOS Which product do you need?
->ipcamera_hispark_taurus@hisilicon
OHOS1_1_0LTS$ hb build
即可开始编译 hi3516dv300 平台代码。
输出的过程文件和最终bin,在以下路径内:
out\hispark_taurus\ipcamera_hispark_taurus
因为本人还没有开发板,无法烧录、抓取log分析以及做相关的操作去验证。
1. 第一阶段:U-Boot启动
System startup
Uncompress Ok!
U-Boot 2016.11 (......) hi3516dv300
............
............(省略)
Hit any key to stop autoboot: 0
MMC read: dev #0, block # 2048, count 16384 ... 16384 blocks read: OK
## Starting application at 0x80000000...
到此为止属于U-Boot的启动。
Uboot不属于鸿蒙系统,这里不做进一步分析,代码在目录
device\hisilicon\third_party\uboot\u-boot-2020.01
2. 第二阶段:汇编代码引导LiteOS-a内核
Uboot引导liteos-a内核启动起来,需要有一个入口,在:
kernel\liteos_a\tools\build\liteos.ld
打开这个文件,可见:
ENTRY(reset_vector)
INCLUDE board.ld
SECTIONS
{
......
}
reset_vector 就是整个鸿蒙内核启动的入口点,这是一个符号,定义在:
kernel\liteos_a\arch\arm\arm\src\startup\reset_vector_mp.S
同目录下还有一个reset_vector_up.S文件,因为HI3516是ARM Cortex A7双核处理器,所以需要看mp(多核)这个文件,up这个是单核的。
打开reset_vector_mp.S文件,找到“reset_vector:”符号,从这里开始跑汇编代码,引导liteos-a内核的启动,一直到:
“
bl main
_start_hang:
b _start_hang
”
这里调用一个 main 函数,然后执行 _start_hang 进入死循环,至此汇编代码阶段就结束了。
通过main函数进入内核LiteOS-a启动的C语言阶段。
3. 第三阶段:内核LiteOS-a的C语言启动阶段
上面汇编阶段调用的main函数,位于:
kernel\liteos_a\platform\main.c
main函数通过OsSystemInfo();函数里打印下面这些信息
******************Welcome******************
Processor : Cortex-A7*2
Run Mode : SMP
GIC Rev : GICv2
build time : ......
Kernel : Huawei LiteOS 2.0.0.xxx
********************************************
main core booting up...
...
...
从这一步的main开始读liteos-a的C语言源码,可以直接在鸿蒙代码的
kernel\liteos_a\platform\main.c
进行阅读理解。不过,推荐从下面仓库拉代码下来读,
鸿蒙内核源码注解分析:
https://gitee.com/weharmony/kernel_liteos_a_note.git
这是在鸿蒙官方开源项目 kernel_liteos_a 基础上,给源代码加上了给常详细的中文注解,有利于加快理解。
main函数截图如下:
Line173行调用的OsMain()函数,位于:
kenerl\liteos_a\kernel\common\los_config.c
主要做了:
其中的:OsTickInit(......); // tick初始化,包含注册中断事件
硬件时钟初始化,启动节拍,注册硬中断OsKernelInitProcess(); // 完成内核进程的初始化
调用OsProcessCreateInit(processCB, OS_KERNEL_MODE, "KProcess", 0);
首先创建2号进程 KProcess,最高优先级0,这是一个内核态进程。
鸿蒙进程一共有32个优先级(0-31),其中0-9级为内核进程,用户进程可配置的优先级有22个(10-31)。
然后创建2号进程的2个子线程 ResourceTask 和KIdle,详见代码。
可以在shell内执行task命令查看进程和线程信息,表格见文末。
注意,此时1号进程还没有创建,它是用户态根进程,要到稍微后面才创建。OsSwtmrInit(); //软时钟模块初始化
创建Swt_Task(software timmer)线程,父进程是2号进程KProcess,OsSystemInit(); //系统初始化
系统软硬件的初始化,由2号进程 KProcess创建“system_wq”“SystemInit”“memshow_Task”等线程。
“SystemInit”线程:
其入口函数则由内核外部提供,在:
device\hisilicon\hispark_taurus\sdk_liteos\mpp\module_init\src\system_init.c
里的SystemInit()函数:
其中的:ProcFsInit()
创建和挂载/proc文件系统,代码见:
kernel\liteos_a\fs\proc\os_adept\proc_init.cSDK_init() //calling SDK_init form HISI_SDK
初始化3516DV300特有的SDK,用内部的DSP硬件来做视频编解码,只提供相关库文件,不开源。
代码在:device\hisilicon\hispark_taurus\sdk_liteos\mpp\module_init\src\sdk_init.cOsMountRootfs()
挂载根文件系统:
out\hispark_taurus\ipcamera_hispark_taurus\rootfs.tar
可以通过tar -tf rootfs.tar 命令查看里面都有些什么内容。
开始查找根文件系统里的/bin/init并创建init进程。
OsUserInitProcess()
调用OsProcessCreateInit(processCB, OS_USER_MODE, "Init", OS_PROCESS_USERINIT_PRIORITY); //28
这时候才创建1号进程init,这是用户态根进程,优先级别为28,这个1号进程接下来会创建和启动其他的用户态进程(shell/apphilogcat/.../ai_server等3~9号进程)。
【接下来这一小部分还没理解透】
调用OsLoadUserInit() load init 的相关配置
再使用 __user_init_entry 参数,调用OsUserInitProcessStart()。
__user_init_entry就是第一个用户态根进程的地址,它通过宏LITE_USER_SEC_ENTRY进行定义,
代码在:
kernel\liteos_a\kernel\user\src\los_user_init.c
/bin/init就是kernel调用init_lite的入口【见第四阶段对这个的解释】,由此进入应用层的启动。
跑完OsMain()函数,LiteOS-a内核的启动工作就基本上完成了,接下来就开始了鸿蒙系统应用层的启动。
4. 第四阶段:鸿蒙系统应用层的启动
这个应用层实际上就是鸿蒙的framework,启动init入口在:
base\startup\init_lite\services\src\main.c
ReadFileToBuf()
这一步读取的 /etc/init.cfg文件,在上面OsMountRootfs()挂载根文件系统的时候就挂载上了,它是
vendor\hisilicon\hispark_taurus\init_configs\init_liteos_a_3516dv300.cfg
的副本,这个文件就包含了“pre-init”“init”“post-init”的相关操作,分别是设置挂载一些设备、设置好路径,启动服务等工作。
而后面的"services"则包含一组服务的定义,它们是系统里的关键进程。
DoJob("init")
由“1号进程init”,在应用层通过start指令创建和启动:shell/apphilogcat/.../ai_server等3~9号进程,它们都是用户态进程,父进程都是“1号进程init”。
init将根据上面cfg配置的job和services来做对应的操作和启动对应的服务程序,并设置它们的uid、gid、进程优先级和权限等。
可以在shell内执行task命令查看进程和线程信息,表格见文末。【见官方文档:base\startup\init_lite\README_zh.md】
这个init组件(即base\startup\init_lite)负责处理从内核加载第一个用户态进程(2号进程init)开始,到第一个应用程序启动之间的系统服务进程启动过程。
init将系统启动分为三个阶段:“pre-init”阶段:启动系统服务之前需要先执行的操作,例如挂载文件系统、创建文件夹、修改权限等
“init”阶段:系统服务启动阶段
“post-init”阶段:系统服务启动完后还需要执行的操作
上述每个阶段在配置文件init.cfg中都用一个job表示,每个job都对应一个命令集合,init通过依次执行每个job中的命令来完成系统初始化。job执行顺序:先执行“pre-init”,再执行“init”,最后执行“post-init”,所有job都集中放在init.cfg的jobs数组中。
除上述jobs数组之外,init.cfg中还有一个services数组,用于存放所有需要由init进程启动的系统关键服务的服务名、可执行文件路径、权限和其他属性信息。
配置文件init.cfg位于代码仓库/vendor/hisilicon/hispark_aries/init_configs/目录,部署在/etc/下,采用json格式,文件大小目前限制在100KB以内。
init组件会编译成out\hispark_taurus\ipcamera_hispark_taurus目录下的bin/init,同时打包在根文件系统rootfs.tar内,上面挂载根文件系统时,会挂载成/bin/init,由第三阶段的最后一步OsUserInit()调用和执行。
【见官方文档:base\startup\init_lite\README_zh.md】
至此,鸿蒙系统的关键系统进程和相关服务都已经启动起来了,至于shell/apphilogcat/.../ai_server等3~9号进程的具体启动过程和调用的相关代码入口,还需待后面进一步学习分析。
5. 鸿蒙应用(APP)的启动
在hi3516dv300平台(带屏幕)的桌面(也就是launcher进程)上点击camera应用图标,这时候会启动camera应用程序,实际上会通过“7号进程appspawn”创建子进程“com.huawei.camera”,这是一个应用程序进程,其父进程并不是launcher进程,而是appspawn进程。
实际上所有的应用程序的父进程都是appspawn进程。
鸿蒙应用开发的第一个示例程序“helloworld”的启动也应该类似。#include #include "ohos_init.h"#include "ohos_types.h"void HelloWorld(void){
printf("[Init] Hello World!\n");}SYS_RUN(HelloWorld);1.2.3.4.5.6.7.8.
关于SYS_RUN()如何运作,以便让HelloWorld运行起来,其他老师有非常详细的解释,这里不再复述。
6. #task命令查看进程/线程信息(简表)
文章相关附件可以点击下面的原文链接前往学习
鸿蒙系统分享,鸿蒙系统的启动流程学习分享相关推荐
- 【鸿蒙OS开发入门】13 - 启动流程代码分析之第一个用户态进程:init 进程 之 init 任务详解
[鸿蒙OS开发入门]13 - 启动流程代码分析之第一个用户态进程:init 进程 之 init 任务详解 一. /etc/init.cfg 系统默认cfg:启动lo回环网卡 1.1 init.Hi35 ...
- 【鸿蒙OS开发入门】06 - 启动流程代码分析之KernelOS:之启动Linux-4.19 Kernel内核 启动init进程
[鸿蒙OS开发入门]06 - 启动流程代码分析之KernelOS:之启动Linux-4.19 Kernel内核 一.head.S 启动start_kernel() 1.1 start_kernel() ...
- Netty实战 IM即时通讯系统(五)客户端启动流程
## Netty实战 IM即时通讯系统(五)客户端启动流程 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 实战: 客户端和服务端双向通信 数据传输载体ByteBuf ...
- Linux 启动流程学习
Linux 启动流程学习 开机自检(加载BIOS) 无论什么机器,在开机后都要进行通电自检(硬件),如果硬件有问题,则无法继续下去. (例如当内存条松动时或者损坏,就会发出嘀嘀嘀警报声).接着开始加载 ...
- Linux SMP启动流程学习(三)
Linux SMP启动流程学习(三) 4 构建CPU拓扑关系 4.1 创建调度域拓扑关系-sched_init_domains() 在系统启动开始的时候就开始构建CPU的拓扑关系,具体流程如下: [s ...
- Linux SMP启动流程学习(二)
Linux SMP启动流程学习(二) 3 SMP系统启动流程 3.1 SMP启动判断 源码:/arch/arm/kernel/setup.c 调用:start_kernel() -> smp_s ...
- Android系统的心脏-Zygote进程启动流程分析
简介: Android中,Zygote是整个Android系统的核心进程,是Android系统的心脏.所有的Android应用程序,包括Android框架层所在的进程system_server,都是由 ...
- Linux系统从uboot到内核启动流程
1. BROM引导: ARM CPU刚上电时,它的PC寄存器指针指向IC内嵌的一片ROM的起始位置处,这片ROM称之为BROM(boot rom),系统就是通过这片BROM引导起来的.BROM的空间比 ...
- skynet源码解析(三)——启动流程
对于你不了解的框架或者引擎,介绍再多的逻辑结构都好像有点茫然的感觉.所以小编认为,最有效的方式就是搞清楚框架启动流程的步骤,让自己心中有一条线可以牵引着. 当你在终端输入./skeynet examp ...
最新文章
- ThreadPoolExecutor使用介绍
- Step1帐户登录系统(6.使用OpenID登录网站)
- python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05...
- 全球及中国新式茶饮行业销售价值与经营布局渠道研究报告2022版
- jsp项目手动导出成war包
- 关于COMMIT WORK and COMMIT WORK AND WAIT在SAT中的讨论
- 8、java中的内部类
- 一个人成为废材的9大原因
- C++:new[]和delete[]一定要配对使用吗?
- TNFBA治疗极早期中轴型nrSpA随机双盲试验后长达6年的放射学随访
- nginx出现 500 Internal Server Error的解决办法
- linux内核可装载模块(lkm)传参机制 module_param()/module_param_string()
- 【Elasticsearch】elasticsearch 索引 详解 index
- 微信语音麦克风静音_智能语音专题(二):语音信号处理
- 三菱Q系列PLC QJ71C24-R2模块的串口232通信
- 【统计学】相关性和因果关系
- java中将Fri Feb 19 17:32:34 CST 2021时间格式转为yyyy-MM-dd HH:mm:ss时间格式
- 职场002:什么是可迁移能力
- 骑马与砍杀2从原神抓取武器模型到导入进游戏使用
- docker部署项目通过127.0.0.1访问数据库:Connection refused
热门文章
- Autosar MCAL-ADC详解(二)-基于Tc27x的cfg软件
- ICME2021:基于机器学习的VVC帧内编码码率控制
- 今日头条适配方案_ 今日头条大改版,小程序强势登场
- 计算机等级考网络课程答案,《计算机应用基础》课程考试试卷
- 小程序验证:人的男女偏见对出生性别比例平衡的影响
- iOS小技能:安全措施
- Shell语言-16-Shell脚本调试 -n -v -x -c
- 已解决selenium.common.exceptions.WebDriverException: Messag: ‘geckodriver‘ executable needs to be in PA
- 苹果笔记本开机问号白色问号?
- 【历史上的今天】5 月 12 日:第一台可编程机电子计算机诞生;硅谷先驱出生;饭否上线