自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

鴻蒙系統(tǒng)框架層的啟動(dòng)細(xì)節(jié)

系統(tǒng)
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內(nèi)容請(qǐng)前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術(shù)社區(qū)https://harmonyos.51cto.com

[[400943]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

本文可看做是前文《鴻蒙系統(tǒng)的啟動(dòng)流程v2.0》的第四階段的補(bǔ)充和驗(yàn)證。

首先請(qǐng)看我的環(huán)境:

HiSpark AI Camera開發(fā)板(Hi3516dv300) + DevEco的HPM新建工程[Hi3516]編譯的軟件,項(xiàng)目代碼默認(rèn)打印的大部分log被我臨時(shí)關(guān)掉了,按我自己的風(fēng)格在關(guān)鍵點(diǎn)重新打印的log,log基本樣例為:

  1. [system_init] SystemInit[20-18]: system_console_init[full shell] 
  2. :[system_init] //在system_init.c 文件內(nèi) 
  3. : SystemInit[20-18] //在SystemInit()函數(shù)內(nèi),大概有20步主要?jiǎng)幼?,這是第18步 
  4. :system_console_init[full shell] //這一步做了哪些事,或者打印關(guān)鍵信息 

 附件的log,是我在Hi3516開發(fā)板上抓的,大概從內(nèi)核創(chuàng)建 Init 進(jìn)程前一點(diǎn)點(diǎn),到系統(tǒng)啟動(dòng)穩(wěn)定的全過(guò)程,最后一段是點(diǎn)擊相機(jī)應(yīng)用打開攝像頭的log。

我將其分成若干段,下面一步步分析其啟動(dòng)細(xì)節(jié)。

1. 創(chuàng)建 /bin/init 前:Line3~7

  1. [system_init] SystemInit[20-18]: system_console_init[full shell] 
  2. [system_init] system_console_init()->OsShellInit() 
  3. [system_init] SystemInit[20-19]: CatLogShell 
  4. [system_init] SystemInit[20-20]: OsUserInitProcess() Create user init process[run /bin/init] 
  5. [system_init] SystemInit[20-0]: end

 前面的SystemInit()步驟,請(qǐng)自行閱讀代碼理解。

從 system_console_init()進(jìn)去跟蹤,可以確認(rèn)跑的是 Hi3516/kernel/liteos_a/shell/full/ 里面的代碼,而不是 Hi3516/kernel/liteos_a/apps/shell/ 里面的簡(jiǎn)化版的shell。

這個(gè)可以從后面啟動(dòng)shell服務(wù)時(shí)打印的“OHOS # ”可以確認(rèn),full shell會(huì)打印這個(gè),apps的shell不會(huì)打印。

然后就是創(chuàng)建用戶根進(jìn)程 Init,并切換到用戶態(tài)去跑 /bin/init 程序了。

2. /bin/init :Line10~27 + Line180~182

  1. [init_lite] “/bin/init” main: starting OHOS Framework… 
  2. … 
  3. [init_lite] main[4-3] enter: InitReadCfg() 
  4. … 
  5. [init_read_cfg] InitReadCfg[7-6(1/2/3)]: DoJob(pre-init/init/post-init) 

 Line180~182:

  1. [init_cmds] DoChown, failed for 0 99 /dev/hdfwifi, err 2. 
  2. [init_read_cfg] InitReadCfg[7-7]: ReleaseAllJobs() 
  3. [init_lite] main[4-4] enter: while(1)… 

 這是 Hi3516/base/startup/services/init_lite/src/main.c 里的main函數(shù)跑的流程?!局劣趦?nèi)核態(tài)進(jìn)程怎么切換到用戶態(tài)來(lái)跑這個(gè)函數(shù),詳情可閱讀前文《鴻蒙系統(tǒng)的啟動(dòng)流程v2.0》的第三階段的分析】

從這里開始到下面的 Line180~182,中間部分都是 DoJob()三個(gè)階段做的工作,我們先主要關(guān)注init階段的start service部分。

下面要依次啟動(dòng)的服務(wù),見 /Hi3516/vendor/huawei/camera/init_configs/init_liteos_a_3516dv300.cfg 文件:

  1.     "name" : "init"
  2.     "cmds" : [ 
  3.         "start shell"
  4.         "start apphilogcat"
  5.         "start foundation"
  6.         "start bundle_daemon"
  7.         "start appspawn"
  8.         "start media_server"
  9.         "start wms_server" 
  10.         ] 

 3. start shell :Line29~31

  1. [init_service_manager] StartServiceByName:idx[7-1]:[[shell]]. 
  2. [init_service] ServiceStart [[shell]] succeed, pid = 3. 
  3. OHOS # 

 如上所述,代碼在 Hi3516/kernel/liteos_a/shell/full/ 具體入口函數(shù)是哪個(gè),我沒(méi)去找,感興趣的朋友自行找一下。

在開發(fā)板跑起來(lái)之后就已經(jīng)開啟shell服務(wù)了,在DevEco的monitor下敲個(gè)回車鍵就可以一看到“OHOS #”,敲個(gè) task 命令看一下。

需要注意的是,debug版本才會(huì)提供shell功能,release版本不提供,會(huì) start service fail。

4.start apphilogcat :Line33~35

  1. [init_service_manager] StartServiceByName:idx[7-3]:[[apphilogcat]]. 
  2. [init_service] ServiceStart [[apphilogcat]] succeed, pid = 4. 
  3. [hiview_applogcat] main entering while(1)… 

 這是DFX子系統(tǒng)的logcat服務(wù),入口見:Hi3516/base/hiviewdfx/services/hilogcat_lite/apphilogcat/hiview_applogcat.c 文件內(nèi)的 main()。

函數(shù)一開始就:

  1. if (argc == 1)  
  2.  { 
  3.      #ifdef OHOS_RELEASE 
  4.      return 0; 
  5.      #endif 
  6.  } 

 也就是debug版本才會(huì)提供logcat功能,release版本不提供。

服務(wù)會(huì)進(jìn)入while(1)循環(huán),等待條件出現(xiàn),將log打印到終端和文件內(nèi)。

  1. ret = read(fd, buf, HILOG_LOGBUFFER); 
  2.     if (ret < sizeof(struct HiLogEntry)) { 
  3.         continue
  4.     } 

 這就是條件,意味著幾乎每條log都會(huì)打印到終端,也會(huì)打印到文件里去,頻繁的文件讀寫操作,不可避免會(huì)影響系統(tǒng)性能(流暢性/穩(wěn)定性),這就是為什么不建議普通用戶升級(jí)開發(fā)版的鴻蒙系統(tǒng)作為日常使用的原因之一。

另外,DFX子系統(tǒng),還有一個(gè)logcat服務(wù),不過(guò)看起來(lái)并沒(méi)有啟動(dòng)起來(lái):

  1. Hi3516/base/hiviewdfx/services/hilogcat_lite/hilogcat/hiview_logcat.c 

這個(gè)服務(wù)只提供log打印到終端功能,而上面的apphilogcat則是log除了打印到終端外,同時(shí)還會(huì)保存到磁盤文件中。

5.start foundation: Line38~86

這個(gè)服務(wù)的啟動(dòng)要重點(diǎn)講一下。

入口在:

  1. Hi3516/foundation/distributedschedule/services/safwk_lite/src/main.c 

在真正的 foundation 服務(wù)啟動(dòng)

  1. [safwk_lite:main] Foundation server begin

之前,會(huì)先打印一大段 SERVICE_INIT 和 FEATURE_INIT 的log:

  1. ???????????????????????????????????????????????????????????????????? 
  2. [samgr_server]     SYS_SERVICE_INIT(InitializeRegistry)# **samgr**: g_server 
  3. [samgr_lite] SAMGR_GetInstance(mutex=NULL): NO SAMGR instance, Init() to create ONE 
  4. [samgr_lite] Init. mutex[664156832]. sharedPool[0-8] reset to 0. status=0[BOOT_SYS] 
  5. [samgr_lite] SAMGR_GetInstance(mutex=664156832) 
  6. [permission_service]           APP_SERVICE_INIT(Init)  # permissionms 
  7. [ipc_auth_lite]                APP_FEATURE_INIT(Init)  : ipc_auth 
  8. [pms_inner]                    APP_FEATURE_INIT(Init)  : PmsInner 
  9. [pms_server]                   APP_FEATURE_INIT(Init)  : PmsFeature 
  10. [ability_mgr_service]          SYSEX_SERVICE_INIT(Init)# abilityms 
  11. [ability_mgr_feature]          SYSEX_FEATURE_INIT(Init): AmsFeature 
  12. [ability_inner_feature]        SYSEX_FEATURE_INIT(Init): AmsInnerFeature 
  13. [bundle_ms_host]               APP_SERVICE_INIT(Init)  # bundlems 
  14. [bundle_inner_feature]         APP_FEATURE_INIT(Init)  : BmsInnerFeature 
  15. [bundle_ms_feature]            APP_FEATURE_INIT(Init)  : BmsFeature 
  16. [distributed_schedule_service] SYS_SERVICE_INIT(Init)  # dtbschedsrv 
  17. [dmslite]                      SYS_FEATURE_INIT(Init)  : dmslite 
  18. ???????????????????????????????????????????????????????????????????? 

 為什么呢?

一開始我也是很多問(wèn)號(hào),Hi3861平臺(tái)上,會(huì)跑 HOS_SystemInit()

  1. void HOS_SystemInit(void) 
  2.     MODULE_INIT(bsp); 
  3.     MODULE_INIT(device); 
  4.     MODULE_INIT(core); 
  5.     SYS_INIT(service); 
  6.     SYS_INIT(feature); 
  7.     MODULE_INIT(run); 
  8.     SAMGR_Bootstrap();   

 以此來(lái)啟動(dòng)相關(guān)的service/feature以及app上標(biāo)記為 SYS_RUN()的應(yīng)用,但是Hi3516上并沒(méi)有跑上面這個(gè)函數(shù),而是跑弱引用的OHOS_SystemInit():

  1. void __attribute__((weak)) OHOS_SystemInit(void) 
  2.     SAMGR_Bootstrap(); 
  3. }  

 我就到 Hi3516/foundation/distributedschedule/services/safwk_lite/ 目錄下去看 foundation 進(jìn)程相關(guān)的 README.md,內(nèi)容很豐富,但貌似沒(méi)有合理的解釋。

那就再到 OHOS1_1_0LTS/foundation/distributedschedule/safwk_lite/ 目錄下去看 README_zh.md,這回有點(diǎn)意思了。

  • safwklite模塊負(fù)責(zé)提供基礎(chǔ)服務(wù)運(yùn)行的空進(jìn)程。
  • safwklite是foundation進(jìn)程的實(shí)現(xiàn)。
  • 在foundation進(jìn)程中添加服務(wù),按照服務(wù)的模板寫完服務(wù)后在BUILD.gn中添加依賴即可。

雖然只有簡(jiǎn)短的幾句話,但意思很明確了:

  • a.foundation是一個(gè)空進(jìn)程,但是它“負(fù)責(zé)提供基礎(chǔ)服務(wù)運(yùn)行”
  • b.服務(wù)(基礎(chǔ)服務(wù)或者開發(fā)者新增的服務(wù))要運(yùn)行起來(lái),需要按模板添加在safwklite的BUILD.gn依賴中

所以,打開safwklite的BUILD.gn看一下依賴關(guān)系:

  1. deps = [ 
  2.        "//foundation/distributedschedule/services/samgr_lite/samgr_server:server"
  3.        "//base/hiviewdfx/frameworks/hilog_lite/featured:hilog_shared"
  4.        "//base/security/services/iam_lite/ipc_auth:ipc_auth_target"
  5.    ] 
  6.    if (ohos_kernel_type == "liteos_a") { 
  7.        deps += [ 
  8.            "//base/security/services/iam_lite/pms:pms_target"
  9.            "//foundation/aafwk/services/abilitymgr_lite:abilityms"
  10.            "//foundation/appexecfwk/services/bundlemgr_lite:bundlems"
  11.            "//foundation/distributedschedule/services/dtbschedmgr_lite:dtbschedmgr"
  12.        ] 
  13.    } 

 所以上面那一大段 SERVICE_INIT 和 FEATURE_INIT 的log中,會(huì)先分別按順序啟動(dòng)幾個(gè)service(用’#‘標(biāo)記):samgr/permissionms/abilityms/bundlems/dtbschedsrv,這是服務(wù)的名字,真正的組件名字就分別是:samgr_lite/iam_lite/abilitymgr_lite/bundlemgr_lite/dtbschedmgr_lite。

samgr_lite 組件提供了分布式任務(wù)管理和調(diào)度能力,其他所有的系統(tǒng)能力都由它管理和調(diào)度【簡(jiǎn)單的分析見前文《理解啟動(dòng)恢復(fù)子系統(tǒng)》 的5.3小節(jié),未來(lái)會(huì)單獨(dú)寫文章對(duì)SAMGR進(jìn)行詳細(xì)分析,敬請(qǐng)期待】。

另外四個(gè)組件,又包含各自的feature,會(huì)在這里一并進(jìn)行init/注冊(cè)和提供服務(wù)(用’:'標(biāo)記)【進(jìn)一步的細(xì)節(jié),請(qǐng)自行去分析相關(guān)的BUILD.gn文件】。

如README.md所說(shuō),以后開發(fā)者要是開發(fā)了新的服務(wù)或者feature,都可以添加在foundation的依賴關(guān)系中。

所以,這里的foundation,實(shí)際上做的就是上面Hi3861平臺(tái)中的SYS_INIT(service) 和 SYS_INIT(feature) 兩步所做的工作。

Line60~86:

這就是調(diào)用SAMGR_Bootstrap()來(lái)注冊(cè)上面的幾個(gè)服務(wù)的具體流程了,這里先略過(guò),詳情請(qǐng)自行閱讀代碼進(jìn)行跟蹤和分析。

Line88~100:

這里是 dmslite 這個(gè) feature 開始向軟總線發(fā)布dms服務(wù)了:

  1. [dmslite] OnInitialize(): PublishService(dms)–>>softbus 
  2.  
  3. … 
  4.  
  5. [dmslite_session] CreateSessionServer(moduleName[dms], sessionName[dms]) 
  6.  
  7. [dmslite] OnPublishSuccess(publishId[1]), CreateSessionServer() 

 這就開始涉及到分布式軟總線子系統(tǒng)了。

剛好上周我在Hi3861平臺(tái)上對(duì)軟總線做了一番研究和調(diào)試,對(duì)此有了一點(diǎn)了解,為了避免軟總線的log對(duì)本文分析的流程的影響,我也暫時(shí)把軟總線的log關(guān)閉了,Hi3516和Hi3861工程都可以在foundation/communication/services/softbus_lite/os_adapter/include/os_adapter.h 找到 SOFTBUS_DEBUG 這個(gè)宏,def 或者 undef就可以打開/關(guān)閉軟總線的log了。

對(duì)于軟總線子系統(tǒng)的理解,我會(huì)另文專門分析總結(jié),敬請(qǐng)期待。

6.start bundle_daemon: Line108~128

包管理服務(wù)的啟動(dòng),暫未進(jìn)一步分析。

入口在:

  1. Hi3516/foundation/appexecfwk/services/bundlemgr_lite/bundle_daemon/src/bundle_daemon.cpp 

7.start appspawn: Line132~157

啟動(dòng)appspawn應(yīng)用孵化器服務(wù),入口在:

  1. /Hi3516/base/startup/services/appspawn_lite/src/appspawn_service.c 

這是所有應(yīng)用程序進(jìn)程的父進(jìn)程,appspawn通過(guò)接收應(yīng)用程序框架的命令來(lái)孵化應(yīng)用進(jìn)程,具體流程這里也不做進(jìn)一步深入了,請(qǐng)自行閱讀代碼進(jìn)行分析。

8.start media_server: Line161~165

啟動(dòng)媒體服務(wù),入口在:

  1. Hi3516/foundation/multimedia/services/media_lite/media_main.cpp 

提供播放、錄制、解析、解碼等接口能力,并提供媒體播放錄制引擎服務(wù)化能力。

  1. [/third_party/iniparser/src/iniparser.c] iniparser_load(/storage/data/cameradev.ini) 

這里會(huì)調(diào)用三方庫(kù)來(lái)分析cameradev.ini文件(Hi3516/applications/sample/camera/media/cameradev_imx335.ini 的副本),獲取攝像頭sensor的配置信息。

9.start wms_server: Line169~223

啟動(dòng)圖形WMS組件服務(wù),暫未進(jìn)一步分析。入口在:

  1. Hi3516/foundation/graphic/lite/services/wms/src/server/samgr_wms.cpp 

圖形服務(wù)采用C/S架構(gòu),內(nèi)部分為窗口管理(WMS: Window Manager Service)和輸入事件管理(IMS: Input Manger Service)兩個(gè)子服務(wù)。

10.[appspawn_service] Invoke(): Line226~

這里就是 appspawn 開始孵化第一個(gè)應(yīng)用launcher,也就是我們看到的桌面。

  1. [appspawn_service] Invoke() 
  2. [appspawn_service] Invoke: msg:: bundleName[com.huawei.launcher],sharedLibPaths[],identityID[73014444033],uID[101],gID[101] 

 再接下來(lái)的我點(diǎn)擊相機(jī)應(yīng)用圖標(biāo),啟動(dòng)攝像頭,也有一段log

  1. [appspawn_service] Invoke() 
  2. [appspawn_service] Invoke: msg:: bundleName[com.huawei.camera],sharedLibPaths[],identityID[661424963587],uID[100],gID[100] 

 想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來(lái)源: 鴻蒙社區(qū)
相關(guān)推薦

2021-04-16 08:54:03

CMS系統(tǒng)redisnode服務(wù)器

2021-04-14 15:23:34

鴻蒙HarmonyOS應(yīng)用

2020-11-11 11:56:05

HarmonyOS

2010-03-31 16:00:51

CentOS系統(tǒng)

2009-09-29 10:37:29

Hibernate持久

2021-07-05 09:35:36

鴻蒙HarmonyOS應(yīng)用

2020-10-23 09:47:19

HarmonyOSJS開發(fā)框架

2017-12-13 17:39:37

ERP信息化企業(yè)

2024-11-27 13:01:22

應(yīng)用層領(lǐng)域?qū)?/a>對(duì)接層

2021-05-06 16:21:55

鴻蒙HarmonyOS應(yīng)用開發(fā)

2009-10-22 14:46:09

網(wǎng)絡(luò)綜合布線系統(tǒng)

2012-02-03 09:44:33

.NET

2021-04-19 15:37:43

鴻蒙HarmonyOS應(yīng)用

2013-10-28 19:23:21

OA信息化

2010-03-02 10:01:37

Android SDK

2018-11-25 22:16:30

超算芯片計(jì)算機(jī)

2010-03-03 13:43:46

Android手機(jī)系統(tǒng)

2009-06-23 14:01:27

StrutsTapestryJSF

2012-08-15 11:03:18

框架項(xiàng)目

2020-03-04 17:37:09

存儲(chǔ)系統(tǒng)硬件層
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)