鸿蒙系统的启动流程

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$ hbset

[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 anykeytostop autoboot: 0

MMC read: dev #0, block # 2048,count16384  ...  16384 blocksread: OK

## Starting application at0x80000000...

到此为止属于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.c

SDK_init() //calling SDK_init form HISI_SDK

初始化3516DV300特有的SDK,用内部的DSP硬件来做视频编解码,只提供相关库文件,不开源。

代码在:

device\hisilicon\hispark_taurus\sdk_liteos\mpp\module_init\src\sdk_init.c

OsMountRootfs()

挂载根文件系统:

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);

关于SYS_RUN()如何运作,以便让HelloWorld运行起来,其他老师有非常详细的解释,这里不再复述。

6. #task命令查看进程/线程信息(简表)

【编辑推荐】

【责任编辑:jianghua TEL:(010)68476606】

点赞 0

鸿蒙操作系统详细流程,鸿蒙系统的启动流程相关推荐

  1. 鸿蒙系统分享,鸿蒙系统的启动流程学习分享

    鸿蒙系统的启动流程 Liangkz 2021.04.11 Ver1.0 目录 1. 第一阶段:U-Boot启动 2. 第二阶段:汇编代码引导LiteOS-a内核 3. 第三阶段:内核LiteOS-a的 ...

  2. 结合源码探讨Android系统的启动流程

    结合源码探讨Android系统的启动流程 由于本人能力有限,所考虑或者疏忽错漏的地方或多或少应该存在.同时,Android从启动过程开始,实际上就涉及多个技术难点和多种通信机制的知识点. 基于上面两个 ...

  3. 鸿蒙操作系统连接汽车,鸿蒙操作系统发布!万物互联的超级终端 华为上车令人无限遐想...

    6月2日,华为正式发布了鸿蒙操作系统(HarmonyOS),该系统可实现多设备之间融合为一个终端,形成万物互联.此外,汽车作为超级终端,也将搭载全新的鸿蒙操作系统.据悉,BEIJING汽车的某款SUV ...

  4. Android系统的启动流程简要分析

    这是我结合网上的资料以及自己分析android4.4的源码整理的笔记,对整个安卓系统的流程启动进行了梳理,很多细节并未展开,只是简要的进行了介绍. 一.Android系统的架构介绍 Android的整 ...

  5. Android系统 lk启动流程简析

    本篇文章是对初步学习Android系统lk启动流程的一个大致简介.方便掌握lk启动流程的大致框架,具体细节后续再进行更新 1. 前言 需要了解的文件类型: 1)编译LK的链接文件(.ld) 2)汇编文 ...

  6. Linux系统的启动流程以及做个小小的Linux

    内核的作用     进程管理:进程间切换     内存管理:内存空间分割为内核空间和用户空间     IO管理:对底层硬件的使用必须由内来实现,不能由用户空间进程来实现     文件系统管理     ...

  7. Android系统开机启动流程及init进程浅析

    Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动 Linux内核启动 Android系统启动,Launcher/app ...

  8. Linux系统开机启动流程介绍

    一.linux系统进程启动流程图: 二.简单概括描述linux系统从开机到登陆界面的启动过程 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核 5.启动init进程 6.读取i ...

  9. 安卓系统应用启动流程分析

    随着移动开发的兴起,安卓系统的重要性愈加突显.本文简要介绍安卓系统上应用启动流程,对于应用开发.系统定制以及性能优化人员来说,熟悉应用启动流程会使得在今后的工作中更加得心应手,做到知其然,知其所以然. ...

最新文章

  1. 学Java需要用到的软件快收藏!
  2. python处理数据的优势-python处理excel的优势是什么
  3. 修改审查元素怎么保存_手机qq性别怎么改成空白
  4. Executors创建的4种线程池的使用
  5. javaweb关于用户是否登录全局判断,没有登录跳转到登录界面
  6. HoloLens开发手记 - Unity之Spatial Sounds 空间声音
  7. VTK:PolyData之CellPointNeighbors
  8. Deepin系统安装后相关设置与环境搭建
  9. 大数据系统架构包含哪些内容
  10. 187.重复的DNA序列
  11. excel中添加图片的代码
  12. python_PDF合成软件_ZHOU125disorder_
  13. 如何制作纺织产品标签
  14. 新手学python笔记--3--爬取天天基金数据
  15. TP框架中S函数使用方法
  16. 网络常见状态码大全。收藏这一篇就够了(HTTP Status Code)
  17. (十)搭建springboot商城--商品热销排行
  18. 计算机道德导论,道德哲学导论.PDF
  19. YII2使用时出现The file or directory to be published does not exist
  20. python批量整理地籍项目的文件夹

热门文章

  1. 周训练计划之(新手健身:胸部+肱三、背部+肱二、肩、臀腿)
  2. java软电话_软电话使用呼叫中心的方法与流程
  3. Xcode build解密
  4. 实时视频通信技术调研
  5. Django第三方登录
  6. 小米其实已在悄悄涨价了,用户反应不一
  7. java网络编程--URLEncode和URLDecoder
  8. 全媒体时代的速度与激情:香港凤凰卫视云端转型实践
  9. linux下调试域格CLM920 NC5 pppd拨号
  10. LOGO设计的五大原则