|
鴻蒙liteos-a如何啟動第一個用戶進程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)達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)進程;
3. 第一個用戶態(tài)進程init_lite
Init_lite的位置:
官方手冊中對init的介紹 (init啟動引導(dǎo)指的就是init_lite)
啟動恢復(fù)負責(zé)在內(nèi)核啟動之后,應(yīng)用啟動之前的操作系統(tǒng)中間層的啟動。涉及以下模塊:
· init啟動引導(dǎo)
支持使用LiteOS-A內(nèi)核的平臺,當(dāng)前包括:Hi3516DV300平臺和Hi3518EV300平臺。
負責(zé)處理從內(nèi)核加載第一個用戶態(tài)進程開始,到第一個應(yīng)用程序啟動之間的系統(tǒng)服務(wù)進程啟動過程。啟動恢復(fù)子系統(tǒng)除負責(zé)加載各系統(tǒng)關(guān)鍵進程之外,還需在啟動的同時設(shè)置其對應(yīng)權(quán)限,并在子進程啟動后對指定進程實行;睿ㄈ暨M程意外退出要重新啟動),對于特殊進程意外退出時,啟動恢復(fù)子系統(tǒng)還要執(zhí)行系統(tǒng)復(fù)位操作。
· appspawn應(yīng)用孵化
支持使用LiteOS-A內(nèi)核的平臺,當(dāng)前包括:Hi3516DV300平臺和Hi3518EV300平臺。
負責(zé)接受應(yīng)用程序框架的命令孵化應(yīng)用進程,設(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平臺。
負責(zé)提供獲取與設(shè)置操作系統(tǒng)相關(guān)的系統(tǒng)屬性。
系統(tǒng)屬性包括:默認系統(tǒng)屬性、OEM廠商系統(tǒng)屬性和自定義系統(tǒng)屬性。OEM廠商部分僅提供默認值,具體值需OEM產(chǎ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進程;
OsUserInitProcess函數(shù)在\kernel\liteos_a\kernel\base\core\los_process.c中定義:
OsUserInitProcess中定義了第一個用戶態(tài)進程的地址是__user_init_entry;
__user_init_entry通過宏定義LITE_USER_SEC_ENTRY進行定義,其所在文件是\kernel\liteos_a\kernel\user\src\los_user_init.c;
這就是Kernel調(diào)用init_lite的入口: |
|