当前位置: 首页 > 科技观察

鸿蒙系统框架层启动详解

时间:2023-03-23 01:38:41 科技观察

更多内容请访问:https://harmonyos.51cto.com本文可以看作是上篇文章的第四篇《鸿蒙系统的启动流程v2.0》相位添加和验证。首先请看我的环境:HiSparkAICamera开发板(Hi3516dv300)+DevEco的HPM新项目[Hi3516]编译的软件。点击转载日志,日志基本样例为:[system_init]SystemInit[20-18]:system_console_init[fullshell]:[system_init]//在system_init.c文件中:SystemInit[20-18]//在SystemInit中()函数,大概有20个主要动作,这是第18步:system_console_init[fullshell]//这一步做了什么,或者打印关键信息附件的log,我在Hi3516开发板上抓到的,大概来自内核创建Init进程前一点,到系统启动和稳定的全过程,最后就是点击相机应用打开相机日志。我将它分成几个部分,下面一步步分析它的启动细节。1、创建/bin/init前:Line3~7[system_init]SystemInit[20-18]:system_console_init[fullshell][system_init]system_console_init()->OsShellInit()[system_init]SystemInit[20-19]:CatLogShell[system_init]SystemInit[20-20]:OsUserInitProcess()Createuserinitprocess[run/bin/init][system_init]SystemInit[20-0]:end.请阅读代码以了解前面的SystemInit()步骤。从system_console_init()跟踪,可以确认运行的是Hi3516/kernel/liteos_a/shell/full/中的代码,而不是Hi3516/kernel/liteos_a/apps/shell/中的简化版shell。这个从后面启动shell服务时打印的“OHOS#”就可以确认,fullshell会打印这个,appsshell是不会打印的。然后创建用户根进程Init,并切换到用户态运行/bin/init程序。2./bin/init:Line10~27+Line180~182[init_lite]“/bin/init”main:startingOHOSFramework…[init_lite]main[4-3]enter:InitReadCfg()…[init_read_cfg]InitReadCfg[7-6(1/2/3)]:DoJob(pre-init/init/post-init)Line180~182:[init_cmds]DoChown,failedfor099/dev/hdfwifi,err2.[init_read_cfg]InitReadCfg[7-7]:ReleaseAllJobs()[init_lite]main[4-4]enter:while(1)...这是在Hi3516/base/startup/services/init_lite/src/main.c中运行main函数的过程。【至于内核态进程如何切换到用户态来运行这个函数,详见上文《鸿蒙系统的启动流程v2.0》第三阶段的分析】从这里到下面的Line180~182,中间部分分三步完成DoJob()阶段的工作,我们主要关注init阶段的启动服务部分。以下服务依次启动,见/Hi3516/vendor/huawei/camera/init_configs/init_liteos_a_3516dv300.cfg文件:{"name":"init","cmds":["startshell","startapphilogcat","startfoundation"","startbundle_daemon","startappspawn","startmedia_server","startwms_server"]}3。startshell:Line29~31[init_service_manager]StartServiceByName:idx[7-1]:[[shell]].[init_service]ServiceStart[[shell]]succeed,pid=3.OHOS#如上所说,代码在Hi3516/kernel/liteos_a/shell/full/具体的入口函数我没有找到,有兴趣的朋友可以自行查找。开发板运行后,shell服务已经启动。在DevEco的监控下按回车键可以看到“OHOS#”,输入任务命令可以看到。需要注意的是,debug版本只提供shell功能,release版本不提供,会启动servicefail。4.启动apphilogcat:Line33~35[init_service_manager]StartServiceByName:idx[7-3]:[[apphilogcat]].[init_service]ServiceStart[[apphilogcat]]成功,pid=4.[hiview_applogcat]mainenteringwhile(1)...这它是DFX子系统的logcat服务。入口参见:Hi3516/base/hiviewdfx/services/hilogcat_lite/apphilogcat/hiview_applogcat.c文件中的main()。函数开头:if(argc==1){#ifdefOHOS_RELEASEreturn0;#endif}即debug版本会提供logcat功能,release版本不提供。服务会进入while(1)循环,等待条件出现,将日志打印到终端和文件。ret=read(fd,buf,HILOG_LOGBUFFER);if(ret>softbus...[dmslite_session]CreateSessionServer(moduleName[dms],sessionName[dms])[dmslite]OnPublishSuccess(publishId[1]),CreateSessionServer()这就开始涉及分布式软总线子系统了。就在上周,我在Hi3861平台上对软总线做了一些研究和调试,对它有了一点了解。为了避免softbuslog影响本文的分析过程,我也暂时关闭了softbuslog。,Hi3516和Hi3861项目都可以在foundation/communication/services/softbus_lite/os_adapter/include/os_adapter.h中找到SOFTBUS_DEBUG宏,def或undef可以打开/关闭softbus日志。对于软总线子系统的理解,我会在另一篇文章中进行分析总结,敬请期待。6.startbundle_daemon:Line108~128包管理服务启动,暂不分析。入口在:Hi3516/foundation/appexecfwk/services/bundlemgr_lite/bundle_daemon/src/bundle_daemon.cpp7.startappspawn:Line132~157启动appspawn应用孵化器服务,入口在:/Hi3516/base/startup/services/appspawn_lite/src/appspawn_service.c这是所有应用进程的父进程。appspawn通过接收来自应用程序框架的命令来孵化应用程序进程。具体过程这里不再赘述。请阅读代码进行分析。8.startmedia_server:161~165行启动媒体服务,入口为:Hi3516/foundation/multimedia/services/media_lite/media_main.cpp提供播放、录制、解析、解码等接口能力,提供媒体播放和录制发动机服务能力。[/third_party/iniparser/src/iniparser.c]iniparser_load(/storage/data/cameradev.ini)这里会调用三方库来解析cameradev.ini文件(拷贝一份Hi3516/applications/sample/camera/media/cameradev_imx335.ini),获取camerasensor的配置信息。9.startwms_server:Line169~223启动图形WMS组件服务,暂不分析。入口在:Hi3516/foundation/graphic/lite/services/wms/src/server/samgr_wms.cpp图形服务采用C/S架构,内部分为窗口管理(WMS:WindowManagerService)和输入事件管理(IMS:InputMangerService)两个子服务。10.[appspawn_service]Invoke():Line226~这里是appspawn开始孵化第一个applicationlauncher的地方,也就是我们看到的桌面。[appspawn_service]Invoke()[appspawn_service]Invoke:msg::bundleName[com.huawei.launcher],sharedLibPaths[],identityID[73014444033],uID[101],gID[101]然后我点击相机应用图标,开始相机,还有一个log[appspawn_service]Invoke()[appspawn_service]Invoke:msg::bundleName[com.huawei.camera],sharedLibPaths[],identityID[661424963587],uID[100],gID[100]要了解更多请访问:https://harmonyos.51cto.com,与华为合作搭建的鸿蒙技术社区

最新推荐
猜你喜欢