2020征文-開(kāi)發(fā)板鴻蒙liteos-a如何啟動(dòng)第一個(gè)用戶(hù)進(jìn)程Init_lite
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
1. 鴻蒙OS編譯知識(shí)
OpenHarmony源碼編譯系統(tǒng)使用了google開(kāi)發(fā)的gn工具以及ninjia。這二者結(jié)合起來(lái)比傳統(tǒng)的makefile編譯系要高效,尤其適合大系統(tǒng)的并行編譯。對(duì)開(kāi)發(fā)者而言,如果要參與OpenHarmony的開(kāi)發(fā),需要對(duì)gn的語(yǔ)法有些了解。本文僅做一些最基本的介紹:
1.使用gn工具的話(huà),開(kāi)發(fā)者將編譯規(guī)則寫(xiě)在名為BUILD.gn文件中。和Makefile一樣,gn文件有自己的語(yǔ)法規(guī)則,屬于領(lǐng)域語(yǔ)言(Domain Specific Language,DSL)。gn語(yǔ)法不難,但編譯規(guī)則本身有很多內(nèi)容,所以一下子要掌握全部?jī)?nèi)容也不容易。
2.gn支持自定義模板函數(shù),可放在名為.gni的文件中。OpenHarmony中最常見(jiàn)到的gn模板文件為./build/lite/config/component/lite_component.gni。.gn文件中通過(guò)import可導(dǎo)入gni模板文件。OpenHarmony定義了lite_component、lite_library等模板函數(shù)。
3.gn中,可執(zhí)行文件的編譯函數(shù)入口為exectuable(“文件名”),共享庫(kù)的編譯規(guī)則函數(shù)為shared_library(“文件名”)。所以,如果要搜索某個(gè)文件對(duì)應(yīng)的編譯規(guī)則,可以先搜索所有的BUILD.gn文件,然后grep executable。以下是grep所有的executable的結(jié)果截圖。

(以上原理引自中科創(chuàng)達(dá)OpenHarmony研究組 鴻蒙OS開(kāi)源代碼精要解讀之——init)
2. 從編譯過(guò)程看鴻蒙OS代碼結(jié)構(gòu)
Hi3518EV300的編譯命令如下:
python build.py ipcamera_hi3518ev300 -b debug
這條編譯命令是怎么執(zhí)行的呢?

編譯的主文件是Build\lite\BUILD.gn文件,內(nèi)容截取如下:
先編譯kernel,依賴(lài)庫(kù);最后編譯rootfs, rootfs的編譯過(guò)程\build\lite\gen_rootfs.py打開(kāi)看是先編譯userfs,再編譯rootfs。
使用到的配置文件:

打開(kāi)ipcamera_hi3518ev300.json,其中:
1.配置kernel為liteos_a;
2.指定編譯器為clang;
3.列出了所有OS子系統(tǒng)和源碼位置,包括了kernel、startup子系統(tǒng)。Startup中的init_lite是kernel調(diào)用的第一個(gè)用戶(hù)態(tài)進(jìn)程;

3. 第一個(gè)用戶(hù)態(tài)進(jìn)程init_lite
Init_lite的位置:

官方手冊(cè)中對(duì)init的介紹 (init啟動(dòng)引導(dǎo)指的就是init_lite)
啟動(dòng)恢復(fù)負(fù)責(zé)在內(nèi)核啟動(dòng)之后,應(yīng)用啟動(dòng)之前的操作系統(tǒng)中間層的啟動(dòng)。涉及以下模塊:
· init啟動(dòng)引導(dǎo)
支持使用LiteOS-A內(nèi)核的平臺(tái),當(dāng)前包括:Hi3516DV300平臺(tái)和Hi3518EV300平臺(tái)。
負(fù)責(zé)處理從內(nèi)核加載第一個(gè)用戶(hù)態(tài)進(jìn)程開(kāi)始,到第一個(gè)應(yīng)用程序啟動(dòng)之間的系統(tǒng)服務(wù)進(jìn)程啟動(dòng)過(guò)程。啟動(dòng)恢復(fù)子系統(tǒng)除負(fù)責(zé)加載各系統(tǒng)關(guān)鍵進(jìn)程之外,還需在啟動(dòng)的同時(shí)設(shè)置其對(duì)應(yīng)權(quán)限,并在子進(jìn)程啟動(dòng)后對(duì)指定進(jìn)程實(shí)行?;?若進(jìn)程意外退出要重新啟動(dòng)),對(duì)于特殊進(jìn)程意外退出時(shí),啟動(dòng)恢復(fù)子系統(tǒng)還要執(zhí)行系統(tǒng)復(fù)位操作。
· appspawn應(yīng)用孵化
支持使用LiteOS-A內(nèi)核的平臺(tái),當(dāng)前包括:Hi3516DV300平臺(tái)和Hi3518EV300平臺(tái)。
負(fù)責(zé)接受應(yīng)用程序框架的命令孵化應(yīng)用進(jìn)程,設(shè)置其對(duì)應(yīng)權(quán)限,并調(diào)用應(yīng)用程序框架的入口。
· bootstrap啟動(dòng)服務(wù)模塊
支持使用LiteOS-M內(nèi)核的平臺(tái),當(dāng)前包括:Hi3861平臺(tái)。
提供了各服務(wù)和功能的啟動(dòng)入口標(biāo)識(shí)。在SAMGR啟動(dòng)時(shí),會(huì)調(diào)用boostrap標(biāo)識(shí)的入口函數(shù),并啟動(dòng)系統(tǒng)服務(wù)。
· 系統(tǒng)屬性
支持使用LiteOS-M內(nèi)核和LiteOS-A內(nèi)核的平臺(tái),包括:Hi3861平臺(tái),Hi3516DV300平臺(tái),Hi3518EV300平臺(tái)。
負(fù)責(zé)提供獲取與設(shè)置操作系統(tǒng)相關(guān)的系統(tǒng)屬性。
系統(tǒng)屬性包括:默認(rèn)系統(tǒng)屬性、OEM廠商系統(tǒng)屬性和自定義系統(tǒng)屬性。OEM廠商部分僅提供默認(rèn)值,具體值需OEM產(chǎn)品方按需進(jìn)行調(diào)整,詳見(jiàn)“使用”部分。
base
├──startup 啟動(dòng)恢復(fù)子系統(tǒng)根目錄
├──── frameworks
│ └── syspara_lite
│ ├── LICENSE 開(kāi)源LICENSE文件
│ ├── parameter 系統(tǒng)屬性模塊源文件目錄
│ │ ├── BUILD.gn
│ │ └── src
│ │ ├── BUILD.gn
│ │ ├── param_impl_hal 系統(tǒng)屬性模塊基于LiteOS-M核實(shí)現(xiàn)
│ │ └── param_impl_posix 系統(tǒng)屬性模塊基于LiteOS-A核實(shí)現(xiàn)
│ └── token
│ ├── BUILD.gn
│ └── src
│ ├── token_impl_hal
│ └── token_impl_posix
├──── hals
│ └── syspara_lite 系統(tǒng)屬性模塊硬件抽象層頭文件目錄
├──── interfaces
│ └── kits
│ └── syspara_lite 系統(tǒng)屬性模塊對(duì)外接口目錄
└──── services
├── appspawn_lite 應(yīng)用孵化模塊
│ ├── BUILD.gn 應(yīng)用孵化模塊編譯配置
│ ├── include 應(yīng)用孵化模塊頭文件目錄
│ ├── LICENSE 開(kāi)源LICENSE文件
│ ├── moduletest 應(yīng)用孵化模塊自測(cè)試代碼目錄
│ └── src 應(yīng)用孵化木塊源文件目錄
├── bootstrap_lite 啟動(dòng)服務(wù)模塊
│ ├── BUILD.gn 啟動(dòng)服務(wù)模塊編譯配置
│ ├── LICENSE 開(kāi)源LICENSE文件
│ └── source 啟動(dòng)服務(wù)模塊源文件目錄
└── init_lite 啟動(dòng)引導(dǎo)模塊
├── BUILD.gn 啟動(dòng)引導(dǎo)模塊編譯配置
├── include 啟動(dòng)引導(dǎo)模塊頭文件目錄
├── LICENSE 開(kāi)源LICENSE文件
├── moduletest 啟動(dòng)引導(dǎo)模塊自測(cè)試代碼目錄
└── src 啟動(dòng)引導(dǎo)模塊源文件目錄
vendor
└──huawei
└──camera
└──init_configs 啟動(dòng)引導(dǎo)模塊配置文件目錄(json格式,部署于/etc/目錄下)
Init_lite使用了配置文件init_configs;
Init_lite 的main.c會(huì)讀取和執(zhí)行上面的配置文件命令行,其函數(shù)為InitReadCfg;
 Init_lite在編譯后,生成”/bin/init”;
bin目錄在\build\lite\BUILD.gn中配置;

init名稱(chēng)在base\startup\services\init_lite\BUILD.gn中指定;

4. Init_lite是如何被kernel調(diào)用的?
liteos-a的啟動(dòng)順序是:
1)reset_vector_up.s
2)\kernel\liteos_a\platform\main.c
3)OsMain
4)OsSystemInit
5)OsSystemInitTaskCreate
6)SystemInit
Hi3518 kernel啟動(dòng)過(guò)程中會(huì)調(diào)用SystemInit:

SystemInit函數(shù)最后會(huì)調(diào)用OsUserInitProcess函數(shù),啟動(dòng)init進(jìn)程;

OsUserInitProcess函數(shù)在\kernel\liteos_a\kernel\base\core\los_process.c中定義:

OsUserInitProcess中定義了第一個(gè)用戶(hù)態(tài)進(jìn)程的地址是__user_init_entry;
__user_init_entry通過(guò)宏定義LITE_USER_SEC_ENTRY進(jìn)行定義,其所在文件是\kernel\liteos_a\kernel\user\src\los_user_init.c;
這就是Kernel調(diào)用init_lite的入口:

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
【編輯推薦】






















 
 
 


 
 
 
 