電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 628|回復(fù): 0
收起左側(cè)

鴻蒙liteos-a如何啟動第一個用戶進(jìn)程init_lite

[復(fù)制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-12-10 15:56:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
鴻蒙liteos-a如何啟動第一個用戶進(jìn)程init_lite, 1. 鴻蒙OS編譯知識

OpenHARMony源碼編譯系統(tǒng)使用了google開發(fā)的gn工具以及ninjia。這二者結(jié)合起來比傳統(tǒng)的makefile編譯系要高效,尤其適合大系統(tǒng)的并行編譯。對開發(fā)者而言,如果要參與OpenHarmony的開發(fā),需要對gn的語法有些了解。本文僅做一些最基本的介紹:

1.使用gn工具的話,開發(fā)者將編譯規(guī)則寫在名為BUILD.gn文件中。和Makefile一樣,gn文件有自己的語法規(guī)則,屬于領(lǐng)域語言(Domain SpecIFic Language,DSL)。gn語法不難,但編譯規(guī)則本身有很多內(nèi)容,所以一下子要掌握全部內(nèi)容也不容易。

2.gn支持自定義模板函數(shù),可放在名為.gni的文件中。OpenHarmony中最常見到的gn模板文件為./build/lite/config/component/lite_component.gni。.gn文件中通過import可導(dǎo)入gni模板文件。OpenHarmony定義了lite_component、lite_library等模板函數(shù)。

3.gn中,可執(zhí)行文件的編譯函數(shù)入口為exectuable(“文件名”),共享庫的編譯規(guī)則函數(shù)為shared_library(“文件名”)。所以,如果要搜索某個文件對應(yīng)的編譯規(guī)則,可以先搜索所有的BUILD.gn文件,然后grep executable。以下是grep所有的executable的結(jié)果截圖。



(以上原理引自中科創(chuàng)達(dá)OpenHarmony研究組 鴻蒙OS開源代碼精要解讀之——init)



2. 從編譯過程看鴻蒙OS代碼結(jié)構(gòu)

Hi3518EV300的編譯命令如下:

python build.py ipcamera_hi3518ev300 -b debug

這條編譯命令是怎么執(zhí)行的呢?



編譯的主文件是Build\lite\BUILD.gn文件,內(nèi)容截取如下:



先編譯kernel,依賴庫;最后編譯rootfs, rootfs的編譯過程\build\lite\gen_rootfs.py打開看是先編譯useRFs,再編譯rootfs。

使用到的配置文件:



打開ipcamera_hi3518ev300.json,其中:

1.配置kernel為liteos_a;

2.指定編譯器為clang;

3.列出了所有OS子系統(tǒng)和源碼位置,包括了kernel、startup子系統(tǒng)。Startup中的init_lite是kernel調(diào)用的第一個用戶態(tài)進(jìn)程;



3. 第一個用戶態(tài)進(jìn)程init_lite

Init_lite的位置:



官方手冊中對init的介紹 (init啟動引導(dǎo)指的就是init_lite)

啟動恢復(fù)負(fù)責(zé)在內(nèi)核啟動之后,應(yīng)用啟動之前的操作系統(tǒng)中間層的啟動。涉及以下模塊:

·         init啟動引導(dǎo)

支持使用LiteOS-A內(nèi)核的平臺,當(dāng)前包括:Hi3516DV300平臺和Hi3518EV300平臺。

負(fù)責(zé)處理從內(nèi)核加載第一個用戶態(tài)進(jìn)程開始,到第一個應(yīng)用程序啟動之間的系統(tǒng)服務(wù)進(jìn)程啟動過程。啟動恢復(fù)子系統(tǒng)除負(fù)責(zé)加載各系統(tǒng)關(guān)鍵進(jìn)程之外,還需在啟動的同時設(shè)置其對應(yīng)權(quán)限,并在子進(jìn)程啟動后對指定進(jìn)程實行;睿ㄈ暨M(jìn)程意外退出要重新啟動),對于特殊進(jìn)程意外退出時,啟動恢復(fù)子系統(tǒng)還要執(zhí)行系統(tǒng)復(fù)位操作。

·         appspawn應(yīng)用孵化

支持使用LiteOS-A內(nèi)核的平臺,當(dāng)前包括:Hi3516DV300平臺和Hi3518EV300平臺。

負(fù)責(zé)接受應(yīng)用程序框架的命令孵化應(yīng)用進(jìn)程,設(shè)置其對應(yīng)權(quán)限,并調(diào)用應(yīng)用程序框架的入口。

·         bootstrap啟動服務(wù)模塊

支持使用LiteOS-M內(nèi)核的平臺,當(dāng)前包括:Hi3861平臺。

提供了各服務(wù)和功能的啟動入口標(biāo)識。在SAMGR啟動時,會調(diào)用boostrap標(biāo)識的入口函數(shù),并啟動系統(tǒng)服務(wù)。

·         系統(tǒng)屬性

支持使用LiteOS-M內(nèi)核和LiteOS-A內(nèi)核的平臺,包括:Hi3861平臺,Hi3516DV300平臺,Hi3518EV300平臺。

負(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)整,詳見“使用”部分。

base

├──startup 啟動恢復(fù)子系統(tǒng)根目錄

├──── frameworks

│ └── syspara_lite

│ ├── LICENSE 開源LICENSE文件

│ ├── parameter 系統(tǒng)屬性模塊源文件目錄

│ │ ├── BUILD.gn

│ │ └── src

│ │ ├── BUILD.gn

│ │ ├── param_impl_hal 系統(tǒng)屬性模塊基于LiteOS-M核實現(xiàn)

│ │ └── param_impl_posix 系統(tǒng)屬性模塊基于LiteOS-A核實現(xiàn)

│ └── token

│ ├── BUILD.gn

│ └── src

│ ├── token_impl_hal

│ └── token_impl_posix

├──── hals

│ └── syspara_lite 系統(tǒng)屬性模塊硬件抽象層頭文件目錄

├──── interfaces

│ └── kits

│ └── syspara_lite 系統(tǒng)屬性模塊對外接口目錄

└──── services

├── appspawn_lite 應(yīng)用孵化模塊

│ ├── BUILD.gn 應(yīng)用孵化模塊編譯配置

│ ├── include 應(yīng)用孵化模塊頭文件目錄

│ ├── LICENSE 開源LICENSE文件

│ ├── moduletest 應(yīng)用孵化模塊自測試代碼目錄

│ └── src 應(yīng)用孵化木塊源文件目錄

├── bootstrap_lite 啟動服務(wù)模塊

│ ├── BUILD.gn 啟動服務(wù)模塊編譯配置

│ ├── LICENSE 開源LICENSE文件

│ └── source 啟動服務(wù)模塊源文件目錄

└── init_lite 啟動引導(dǎo)模塊

├── BUILD.gn 啟動引導(dǎo)模塊編譯配置

├── include 啟動引導(dǎo)模塊頭文件目錄

├── LICENSE 開源LICENSE文件

├── moduletest 啟動引導(dǎo)模塊自測試代碼目錄

└── src 啟動引導(dǎo)模塊源文件目錄

vendor

└──huawei

└──camera

└──init_configs 啟動引導(dǎo)模塊配置文件目錄(json格式,部署于/etc/目錄下)

Init_lite使用了配置文件init_configs;



Init_lite 的main.c會讀取和執(zhí)行上面的配置文件命令行,其函數(shù)為InitReadCfg;



Init_lite在編譯后,生成”/bin/init”;

bin目錄在\build\lite\BUILD.gn中配置;



init名稱在base\startup\services\init_lite\BUILD.gn中指定;



4. Init_lite是如何被kernel調(diào)用的?

liteos-a的啟動順序是:

1)reset_vector_up.s

2)\kernel\liteos_a\platform\main.c

3)OsMain

4)OsSystemInit

5)OsSystemInitTaskCreate

6)SystemInit



Hi3518 kernel啟動過程中會調(diào)用SystemInit:



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



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



OsUserInitProcess中定義了第一個用戶態(tài)進(jìn)程的地址是__user_init_entry;

__user_init_entry通過宏定義LITE_USER_SEC_ENTRY進(jìn)行定義,其所在文件是\kernel\liteos_a\kernel\user\src\los_user_init.c;

這就是Kernel調(diào)用init_lite的入口:
回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表