了解更多请访问:与华为共建的鸿蒙科技社区https://harmonyos.51cto.com鸿蒙良客2021.04.11Ver1.0启动流程内容1.第一阶段:U-Boot启动2.第二阶段:汇编代码启动LiteOS-a内核3.第三阶段:内核LiteOS-a的C语言启动阶段4.第四阶段:鸿蒙系统应用层启动5.启动鸿蒙应用(APP)6.#task命令查看进程/线程信息(简写)免责声明:严格来说,本文档并非原创。一些总结。课程时长一个半小时,内容非常丰富。在学习的过程中,发现朱老师ppt上的一些代码/文件在我本地的鸿蒙系统代码上找不到,或者路径不一样,于是做了一些整理。这里我们只将课程中鸿蒙系统在HI3516DV300平台上的启动过程(启动过程从30:00开始讲解)进行抽取整理,进行总结整理。如有错误,请朱老师和同学指正。在后续的学习过程中,本文将继续视为一次修订和升级。我本地的代码是基于最新发布的OpenHarmony1.1.0LTS(2021-04-01)抓取的,代码根目录OHOS1_1_0LTS:$repoinit-uhttps://gitee.com/openharmony/manifest.git-brefs/tags/OpenHarmony_release_v1.1.0--no-repo-verify$reposync在根目录下执行:OHOS1_1_0LTS$hbset[OHOSINFO]Inputcodepath:.OHOSWhichproductdoyouneed?->ipcamera_hispark_taurus@hisiliconOHOS1_1_0LTS$hbbuild即可开始编译hi3516dv300平台代码。输出的过程文件和最终的bin在如下路径:out\hispark_taurus\ipcamera_hispark_taurus因为我还没有开发板,所以无法烧录,抓日志分析做相关操作验证。1、第一阶段:U-Boot启动SystemstartupUncompressOk!U-Boot2016.11(...)hi3516dv300.................................(略)Hitanykeytostopautoboot:0MMCread:dev#0,block#2048,count16384...16384blocksread:OK##Startingapplicationat0x80000000...至此属于U-Boot的启动。uboot不属于鸿蒙系统,这里不做进一步分析。代码在device\hisilicon\third_party\uboot\u-boot-2020.012目录下。第二阶段:汇编代码引导LiteOS-a内核,Uboot引导liteos-a内核启动。有一个入口,打开这个文件在:kernel\liteos_a\tools\build\liteos.ld,可以看到:ENTRY(reset_vector)INCLUDEboard.ldSECTIONS{...}reset_vector是整个鸿蒙内核启动的入口,这是一个符号,定义在:kernel\liteos_a\arch\arm\arm\src\startup\reset_vector_mp.S同目录下还有一个reset_vector_up.S文件,因为HI3516是ARMCortexA7双核处理器,所以需要看mp(多核)这个文件,往上这个是单核的。打开reset_vector_mp.S文件,找到“reset_vector:”符号,从这里开始运行汇编代码,引导liteos-a内核的启动,直到:“blmain_start_hang:b_start_hang”在这里调用一个main函数,然后执行_start_hang进入死循环,至此汇编代码阶段结束。通过main函数进入内核LiteOS-a启动的C语言阶段。3、第三阶段:内核LiteOS-a的C语言启动阶段汇编阶段调用的main函数位于:kernel\liteos_a\platform\main.cmain函数通过OsSystemInfo()打印如下信息;功能*******************欢迎******************处理器:Cortex-A7*2RunMode:SMPGICRev:GICv2buildtime:.......Kernel:HuaweiLiteOS2.0.0.xxx*************************************************maincorebootingup.......从这一步的main开始,开始阅读liteos-a的C语言源码,直接在kernel\liteos_a中阅读理解即可鸿蒙代码\platform\main.c。不过建议从以下仓库拉取代码阅读,鸿蒙内核源码注释分析:https://gitee.com/weharmony/kernel_liteos_a_note.git这是基于鸿蒙官方开源项目kernel_liteos_a,加入源代码的更多细节中文注释有助于加快理解。main函数截图如下:第173行调用的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号进程的两个子线程ResourceTask和KIdle,具体见代码。可以在shell中执行task命令查看进程和线程信息,见文末表格。注意此时1号进程还没有被创建,它是用户态的root进程,稍后才会被创建。OsSwtmrInit();//软时钟模块初始化创建Swt_Task(softwaretimmer)线程,父进程为2号进程KProcess,OsSystemInit();//系统初始化系统硬件和软件初始化,由2号进程KProcess"system_wq"SystemInit","memshow_Task"等线程创建。"SystemInit"线程:其入口函数由内核外部提供,SystemInit()函数在:device\hisilicon\hispark_taurus\sdk_liteos\mpp\module_init\src\system_init.c:其中:ProcFsInit()创建并挂载/proc文件系统,见代码:kernel\liteos_a\fs\proc\os_adept\proc_init.cSDK_init()//调用SDK_initformHISI_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-tfrootfs.tar查看一些内容。开始寻找/bin/在根文件系统中初始化并创建init进程。OsUserInitProcess()调用OsProcessCreateInit(processCB,OS_USER_MODE,"Init",OS_PROCESS_USERINIT_PRIORITY);//不。此时会创建1号进程init,它是用户态root进程,优先级为28。这个1号进程会被创建并启动其他用户态进程(进程3~9如shell/apphilogcat/.../ai_server)。【下一部分还没看懂】调用OsLoadUserInit()加载init的相关配置,然后使用__user_init_entry参数调用OsUserInitProcessStart()。__user_init_entry是第一个用户态根进程的地址。它由宏LITE_USER_SEC_ENTRY定义。代码在:kernel\liteos_a\kernel\user\src\los_user_init.c/bin/init是内核调用init_lite的入口【见第四阶段对此的解释】,从而进入应用层的启动。运行OsMain()函数后,LiteOS-a内核的启动基本完成,接下来开始鸿蒙系统应用层的启动。4.第四阶段:鸿蒙系统应用层启动这个应用层其实就是鸿蒙的框架,启动init入口在:base\startup\init_lite\services\src\main.cReadFileToBuf()读入/etc当上面的OsMountRootfs()挂载根文件系统时挂载/init.cfg文件。它是vendor\hisilicon\hispark_taurus\init_configs\init_liteos_a_3516dv300.cfg的副本。这个文件包含了“pre-init”和“post-init”的相关操作,就是设置和挂载一些设备,设置路径,启动服务等,后面的“services”包含了一组的定义服务,它们是系统中的关键进程。DoJob("init")是由应用层的“1号进程init”通过启动命令创建并启动的:shell/apphilogcat/.../ai_server等进程3~9,它们都是用户态进程,而父进程是“一号进程init”。init会根据上面cfg中配置的jobs和services执行相应的操作并启动相应的服务程序,并设置它们的uid、gid、进程优先级和权限等,可以在shell中执行task命令查看进程和线程信息,见文末表格。【查看官方文档:base\startup\init_lite\README_zh.md】这个init组件(即base\startup\init_lite)负责处理从内核加载第一个用户态进程(2号进程init)到第一个application程序启动之间的系统服务进程启动过程。init将系统启动分为三个阶段:“pre-init”阶段:系统服务启动前需要进行的操作,如挂载文件系统、创建文件夹、修改权限等“init”阶段:系统服务启动阶段post-init”阶段:系统服务启动后需要执行的操作。上述每个阶段都由配置文件init.cfg中的一个作业表示。每个作业对应一组命令。Init依次执行每个作业。命令完成系统初始化。作业执行顺序:先执行“pre-init”,再执行“init”,最后执行“post-init”。所有作业都集中在init.cfg的作业数组中。除了上面的jobs数组,在init.cfg中还有一个services数组,用来存放所有需要被启动的系统关键服务的服务名、可执行文件路径、权限等属性信息初始化进程。配置文件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进程)的相机应用图标,此时会启动相机应用。com.huawei.camera进程是一个应用进程,它的父进程不是launcher进程,而是appspawn进程。事实上,所有应用程序的父进程都是appspawn进程。鸿蒙App开发的第一个示例程序“helloworld”的启动应该也是类似的。#include
