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

鴻蒙系統(tǒng)的啟動流程

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

[[393153]]

想了解更多內(nèi)容,請訪問:

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

https://harmonyos.51cto.com

鴻蒙系統(tǒng)的啟動流程

Liangkz 2021.04.11 Ver1.0

  • 目錄
  • 1. 第一階段:U-Boot啟動
  • 2. 第二階段:匯編代碼引導(dǎo)LiteOS-a內(nèi)核
  • 3. 第三階段:內(nèi)核LiteOS-a的C語言啟動階段
  • 4. 第四階段:鴻蒙系統(tǒng)應(yīng)用層的啟動
  • 5. 鴻蒙應(yīng)用(APP)的啟動
  • 6. #task命令查看進程/線程信息(簡表)

聲明:

嚴格來說本文檔并非真正原創(chuàng)的,這是上了朱有鵬老師的免費課《想讀懂鴻蒙2.0源碼,也許你需要先懂這些》之后,做的一些總結(jié)。

課程時間一個半小時,內(nèi)容也很多,學(xué)習(xí)過程中我發(fā)現(xiàn)朱老師的ppt上部分代碼/文件,在我本地的鴻蒙系統(tǒng)代碼上找不到,或者路徑不相同,所以我就做了一些整理。

這里僅摘取課程中的鴻蒙系統(tǒng)在HI3516DV300平臺上的啟動流程部分(從30:00開始講解啟動過程)進行匯總和整理,如有錯誤,請朱老師和各位同學(xué)指正。后繼在學(xué)習(xí)過程中會繼續(xù)對本文當(dāng)作修正升級。

我的本地代碼是基于最新發(fā)布的OpenHarmony 1.1.0 LTS(2021-04-01)版本抓取的,代碼根目錄OHOS1_1_0LTS:

  1. $repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony_release_v1.1.0 --no-repo-verify 
  2.  
  3. $repo sync 

 在根目錄下執(zhí)行:

  1. OHOS1_1_0LTS$ hb set 
  2.  
  3. [OHOS INFO] Input code path: . 
  4.  
  5. OHOS Which product do you need?   
  6.  
  7. ->ipcamera_hispark_taurus@hisilicon 
  8.  
  9. OHOS1_1_0LTS$ hb build  

 即可開始編譯 hi3516dv300 平臺代碼。

輸出的過程文件和最終bin,在以下路徑內(nèi):

  1. out\hispark_taurus\ipcamera_hispark_taurus 

因為本人還沒有開發(fā)板,無法燒錄、抓取log分析以及做相關(guān)的操作去驗證。

1. 第一階段:U-Boot啟動

  1. System startup 
  2.  
  3. Uncompress Ok! 
  4.  
  5. U-Boot 2016.11 (......) hi3516dv300 
  6.  
  7. ............ 
  8.  
  9. ............(省略) 
  10.  
  11. Hit any key to stop autoboot: 0 
  12.  
  13. MMC read: dev #0, block # 2048, count 16384  ...  16384 blocks read: OK 
  14.  
  15. ## Starting application at 0x80000000... 

 到此為止屬于U-Boot的啟動。

Uboot不屬于鴻蒙系統(tǒng),這里不做進一步分析,代碼在目錄

  1. device\hisilicon\third_party\uboot\u-boot-2020.01 

2. 第二階段:匯編代碼引導(dǎo)LiteOS-a內(nèi)核

Uboot引導(dǎo)liteos-a內(nèi)核啟動起來,需要有一個入口,在:

  1. kernel\liteos_a\tools\build\liteos.ld 

打開這個文件,可見:

  1. ENTRY(reset_vector) 
  2.  
  3. INCLUDE board.ld 
  4.  
  5. SECTIONS 
  6.  
  7.  
  8. ...... 
  9.  

 reset_vector 就是整個鴻蒙內(nèi)核啟動的入口點,這是一個符號,定義在:

  1. 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:”符號,從這里開始跑匯編代碼,引導(dǎo)liteos-a內(nèi)核的啟動,一直到:

  1. “ 
  2.  
  3.     bl     main 
  4.  
  5.   
  6.  
  7. _start_hang: 
  8.  
  9.     b      _start_hang 
  10.  
  11. ” 

 這里調(diào)用一個 main 函數(shù),然后執(zhí)行 _start_hang 進入死循環(huán),至此匯編代碼階段就結(jié)束了。

通過main函數(shù)進入內(nèi)核LiteOS-a啟動的C語言階段。

3. 第三階段:內(nèi)核LiteOS-a的C語言啟動階段

上面匯編階段調(diào)用的main函數(shù),位于:

  1. kernel\liteos_a\platform\main.c 

main函數(shù)通過OsSystemInfo();函數(shù)里打印下面這些信息

  1.   
  2.  
  3. ******************Welcome****************** 
  4.  
  5. Processor  : Cortex-A7*2 
  6.  
  7. Run Mode : SMP 
  8.  
  9. GIC Rev  : GICv2 
  10.  
  11. build time : ...... 
  12.  
  13. Kernel  : Huawei LiteOS 2.0.0.xxx 
  14.  
  15. ******************************************** 
  16.  
  17.   
  18.  
  19. main core booting up... 
  20.  
  21. ... 
  22.  
  23. ... 

 從這一步的main開始讀liteos-a的C語言源碼,可以直接在鴻蒙代碼的

  1. kernel\liteos_a\platform\main.c 

進行閱讀理解。

  • 不過,推薦從下面?zhèn)}庫拉代碼下來讀,
  • 鴻蒙內(nèi)核源碼注解分析:
  • https://gitee.com/weharmony/kernel_liteos_a_note.git
  • 這是在鴻蒙官方開源項目 kernel_liteos_a 基礎(chǔ)上,給源代碼加上了給常詳細的中文注解,有利于加快理解。

main函數(shù)截圖如下:

Line173行調(diào)用的OsMain()函數(shù),位于:

  1. kenerl\liteos_a\kernel\common\los_config.c 

 主要做了:

其中的:

  • OsTickInit(......); // tick初始化,包含注冊中斷事件

硬件時鐘初始化,啟動節(jié)拍,注冊硬中斷

  • OsKernelInitProcess(); // 完成內(nèi)核進程的初始化

調(diào)用OsProcessCreateInit(processCB, OS_KERNEL_MODE, "KProcess", 0);

首先創(chuàng)建2號進程 KProcess,最高優(yōu)先級0,這是一個內(nèi)核態(tài)進程。

鴻蒙進程一共有32個優(yōu)先級(0-31),其中0-9級為內(nèi)核進程,用戶進程可配置的優(yōu)先級有22個(10-31)。

然后創(chuàng)建2號進程的2個子線程 ResourceTask 和 KIdle,詳見代碼。

可以在shell內(nèi)執(zhí)行task命令查看進程和線程信息,表格見文末。

注意,此時1號進程還沒有創(chuàng)建,它是用戶態(tài)根進程,要到稍微后面才創(chuàng)建。

  • OsSwtmrInit(); //軟時鐘模塊初始化

創(chuàng)建Swt_Task(software timmer)線程,父進程是2號進程KProcess,

  • OsSystemInit(); //系統(tǒng)初始化

系統(tǒng)軟硬件的初始化,由2號進程 KProcess創(chuàng)建“system_wq”“SystemInit”“memshow_Task”等線程。

“SystemInit”線程:

其入口函數(shù)則由內(nèi)核外部提供,在:

  1. device\hisilicon\hispark_taurus\sdk_liteos\mpp\module_init\src\system_init.c 

 里的SystemInit()函數(shù):

其中的:

  • ProcFsInit()

創(chuàng)建和掛載/proc文件系統(tǒng),代碼見:

  1. kernel\liteos_a\fs\proc\os_adept\proc_init.c 
  • SDK_init() //calling SDK_init form HISI_SDK

初始化3516DV300特有的SDK,用內(nèi)部的DSP硬件來做視頻編解碼,只提供相關(guān)庫文件,不開源。

代碼在:

  1. device\hisilicon\hispark_taurus\sdk_liteos\mpp\module_init\src\sdk_init.c 
  • OsMountRootfs()

掛載根文件系統(tǒng):

  1. out\hispark_taurus\ipcamera_hispark_taurus\rootfs.tar 

可以通過tar -tf rootfs.tar 命令查看里面都有些什么內(nèi)容。

開始查找根文件系統(tǒng)里的/bin/init并創(chuàng)建init進程。

  • OsUserInitProcess()

調(diào)用OsProcessCreateInit(processCB, OS_USER_MODE, "Init", OS_PROCESS_USERINIT_PRIORITY); //28

這時候才創(chuàng)建1號進程init,這是用戶態(tài)根進程,優(yōu)先級別為28,這個1號進程接下來會創(chuàng)建和啟動其他的用戶態(tài)進程(shell/apphilogcat/.../ai_server等3~9號進程)。

【接下來這一小部分還沒理解透】

調(diào)用OsLoadUserInit() load init 的相關(guān)配置

再使用 __user_init_entry 參數(shù),調(diào)用OsUserInitProcessStart()。

__user_init_entry就是第一個用戶態(tài)根進程的地址,它通過宏LITE_USER_SEC_ENTRY進行定義,

代碼在:

  1. kernel\liteos_a\kernel\user\src\los_user_init.c 

/bin/init就是kernel調(diào)用init_lite的入口【見第四階段對這個的解釋】,由此進入應(yīng)用層的啟動。

跑完OsMain()函數(shù),LiteOS-a內(nèi)核的啟動工作就基本上完成了,接下來就開始了鴻蒙系統(tǒng)應(yīng)用層的啟動。

4. 第四階段:鴻蒙系統(tǒng)應(yīng)用層的啟動

這個應(yīng)用層實際上就是鴻蒙的framework,啟動init入口在:

  1. base\startup\init_lite\services\src\main.c 

  • ReadFileToBuf()

這一步讀取的 /etc/init.cfg文件,在上面OsMountRootfs()掛載根文件系統(tǒng)的時候就掛載上了,它是

  1. vendor\hisilicon\hispark_taurus\init_configs\init_liteos_a_3516dv300.cfg 

的副本,這個文件就包含了“pre-init”“init”“post-init”的相關(guān)操作,分別是設(shè)置掛載一些設(shè)備、設(shè)置好路徑,啟動服務(wù)等工作。

而后面的"services"則包含一組服務(wù)的定義,它們是系統(tǒng)里的關(guān)鍵進程。

  • DoJob("init")

由“1號進程init”,在應(yīng)用層通過start指令創(chuàng)建和啟動:shell/apphilogcat/.../ai_server等3~9號進程,它們都是用戶態(tài)進程,父進程都是“1號進程init”。

init將根據(jù)上面cfg配置的job和services來做對應(yīng)的操作和啟動對應(yīng)的服務(wù)程序,并設(shè)置它們的uid、gid、進程優(yōu)先級和權(quán)限等。

可以在shell內(nèi)執(zhí)行task命令查看進程和線程信息,表格見文末。

  • 【見官方文檔:base\startup\init_lite\README_zh.md】
  • 這個init組件(即base\startup\init_lite)負責(zé)處理從內(nèi)核加載第一個用戶態(tài)進程(2號進程init)開始,到第一個應(yīng)用程序啟動之間的系統(tǒng)服務(wù)進程啟動過程。
  • init將系統(tǒng)啟動分為三個階段:
  • “pre-init”階段:啟動系統(tǒng)服務(wù)之前需要先執(zhí)行的操作,例如掛載文件系統(tǒng)、創(chuàng)建文件夾、修改權(quán)限等
  • “init”階段:系統(tǒng)服務(wù)啟動階段
  • “post-init”階段:系統(tǒng)服務(wù)啟動完后還需要執(zhí)行的操作
  • 上述每個階段在配置文件init.cfg中都用一個job表示,每個job都對應(yīng)一個命令集合,init通過依次執(zhí)行每個job中的命令來完成系統(tǒng)初始化。job執(zhí)行順序:先執(zhí)行“pre-init”,再執(zhí)行“init”,最后執(zhí)行“post-init”,所有job都集中放在init.cfg的jobs數(shù)組中。
  • 除上述jobs數(shù)組之外,init.cfg中還有一個services數(shù)組,用于存放所有需要由init進程啟動的系統(tǒng)關(guān)鍵服務(wù)的服務(wù)名、可執(zhí)行文件路徑、權(quán)限和其他屬性信息。
  • 配置文件init.cfg位于代碼倉庫/vendor/hisilicon/hispark_aries/init_configs/目錄,部署在/etc/下,采用json格式,文件大小目前限制在100KB以內(nèi)。
  • init組件會編譯成out\hispark_taurus\ipcamera_hispark_taurus目錄下的bin/init,同時打包在根文件系統(tǒng)rootfs.tar內(nèi),上面掛載根文件系統(tǒng)時,會掛載成/bin/init,由第三階段的最后一步OsUserInit()調(diào)用和執(zhí)行。
  • 【見官方文檔:base\startup\init_lite\README_zh.md】

至此,鴻蒙系統(tǒng)的關(guān)鍵系統(tǒng)進程和相關(guān)服務(wù)都已經(jīng)啟動起來了,至于shell/apphilogcat/.../ai_server等3~9號進程的具體啟動過程和調(diào)用的相關(guān)代碼入口,還需待后面進一步學(xué)習(xí)分析。

5. 鴻蒙應(yīng)用(APP)的啟動

在hi3516dv300平臺(帶屏幕)的桌面(也就是launcher進程)上點擊camera應(yīng)用圖標,這時候會啟動camera應(yīng)用程序,實際上會通過“7號進程appspawn”創(chuàng)建子進程“com.huawei.camera”,這是一個應(yīng)用程序進程,其父進程并不是launcher進程,而是appspawn進程。

實際上所有的應(yīng)用程序的父進程都是appspawn進程。

鴻蒙應(yīng)用開發(fā)的第一個示例程序“helloworld”的啟動也應(yīng)該類似。

  1. #include <stdio.h> 
  2. #include "ohos_init.h" 
  3. #include "ohos_types.h" 
  4. void HelloWorld(void) 
  5.     printf("[Init] Hello World!\n"); 
  6. SYS_RUN(HelloWorld); 

關(guān)于SYS_RUN()如何運作,以便讓HelloWorld運行起來,其他老師有非常詳細的解釋,這里不再復(fù)述。

6. #task命令查看進程/線程信息(簡表)

想了解更多內(nèi)容,請訪問:

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

https://harmonyos.51cto.com

 

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

2021-04-19 15:37:43

鴻蒙HarmonyOS應(yīng)用

2017-03-03 09:10:41

2021-02-09 08:23:02

Linux操作系統(tǒng)

2010-07-08 15:18:06

SSH協(xié)議

2019-06-20 10:56:28

CentOS系統(tǒng)啟動

2021-09-22 08:51:34

Android

2021-05-24 10:32:04

鴻蒙HarmonyOS應(yīng)用

2023-04-28 08:43:46

2024-12-16 08:10:00

Spring開發(fā)

2021-11-05 11:57:07

網(wǎng)絡(luò)流程Window

2021-10-29 16:36:53

AMSAndroidActivityMan

2010-01-06 15:16:58

Ubuntu啟動流程

2022-03-06 12:15:38

NettyReactor線程

2016-12-27 19:10:38

Linux命令啟動流程

2010-01-06 10:08:16

Boot Loader

2014-07-30 10:35:34

Linux系統(tǒng)啟動

2021-09-18 14:26:49

Linux Linux 啟動流程Linux 系統(tǒng)

2012-01-05 11:08:37

CISCO路由器啟動流程

2019-06-25 13:47:50

人臉識別AI人工智能

2020-10-13 18:25:33

技術(shù)流程云計算
點贊
收藏

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