2020征文-开发板鸿蒙liteos-a如何启动第一个用户进程Init_lite
https://harmonyos.51cto.com/#zz
1. 鸿蒙OS编译知识
OpenHarmony源码编译系统使用了google开发的gn工具以及ninjia。这二者结合起来比传统的makefile编译系要高效,尤其适合大系统的并行编译。对开发者而言,如果要参与OpenHarmony的开发,需要对gn的语法有些了解。本文仅做一些最基本的介绍:
1.使用gn工具的话,开发者将编译规则写在名为BUILD.gn文件中。和Makefile一样,gn文件有自己的语法规则,属于领域语言(Domain Specific Language,DSL)。gn语法不难,但编译规则本身有很多内容,所以一下子要掌握全部内容也不容易。
2.gn支持自定义模板函数,可放在名为.gni的文件中。OpenHarmony中最常见到的gn模板文件为./build/lite/config/component/lite_component.gni。.gn文件中通过import可导入gni模板文件。OpenHarmony定义了lite_component、lite_library等模板函数。
3.gn中,可执行文件的编译函数入口为exectuable(“文件名”),共享库的编译规则函数为shared_library(“文件名”)。所以,如果要搜索某个文件对应的编译规则,可以先搜索所有的BUILD.gn文件,然后grep executable。以下是grep所有的executable的结果截图。
![](https://s4.51cto.com/oss/202012/10/07bb326f45e8da06f1a853a90805ae6a.png)
(以上原理引自中科创达OpenHarmony研究组 鸿蒙OS开源代码精要解读之——init)
2. 从编译过程看鸿蒙OS代码结构
Hi3518EV300的编译命令如下:
python build.py ipcamera_hi3518ev300 -b debug
这条编译命令是怎么执行的呢?
![](https://s2.51cto.com/oss/202012/10/4c9a9c5d3cb4bb2a21f091727f0c30e8.png)
编译的主文件是BuildliteBUILD.gn文件,内容截取如下:
先编译kernel,依赖库;最后编译rootfs, rootfs的编译过程uildlitegen_rootfs.py打开看是先编译userfs,再编译rootfs。
使用到的配置文件:
![](https://s4.51cto.com/oss/202012/10/ca4b5d448e0971ab054688dce8ff4b3e.jpg)
打开ipcamera_hi3518ev300.json,其中:
1.配置kernel为liteos_a;
2.指定编译器为clang;
3.列出了所有OS子系统和源码位置,包括了kernel、startup子系统。Startup中的init_lite是kernel调用的第一个用户态进程;
![](https://s4.51cto.com/oss/202012/10/aa39e8498e173da2600c0af221281932.png)
3. 第一个用户态进程init_lite
Init_lite的位置:
![](https://s4.51cto.com/oss/202012/10/f63eefcbb7afdb0f1d56fbc1e763bd7d.jpg)
官方手册中对init的介绍 (init启动引导指的就是init_lite)
启动恢复负责在内核启动之后,应用启动之前的操作系统中间层的启动。涉及以下模块:
· init启动引导
支持使用LiteOS-A内核的平台,当前包括:Hi3516DV300平台和Hi3518EV300平台。
负责处理从内核加载第一个用户态进程开始,到第一个应用程序启动之间的系统服务进程启动过程。启动恢复子系统除负责加载各系统关键进程之外,还需在启动的同时设置其对应权限,并在子进程启动后对指定进程实行保活(若进程意外退出要重新启动),对于特殊进程意外退出时,启动恢复子系统还要执行系统复位操作。
· appspawn应用孵化
支持使用LiteOS-A内核的平台,当前包括:Hi3516DV300平台和Hi3518EV300平台。
负责接受应用程序框架的命令孵化应用进程,设置其对应权限,并调用应用程序框架的入口。
· bootstrap启动服务模块
支持使用LiteOS-M内核的平台,当前包括:Hi3861平台。
提供了各服务和功能的启动入口标识。在SAMGR启动时,会调用boostrap标识的入口函数,并启动系统服务。
· 系统属性
支持使用LiteOS-M内核和LiteOS-A内核的平台,包括:Hi3861平台,Hi3516DV300平台,Hi3518EV300平台。
负责提供获取与设置操作系统相关的系统属性。
系统属性包括:默认系统属性、OEM厂商系统属性和自定义系统属性。OEM厂商部分仅提供默认值,具体值需OEM产品方按需进行调整,详见“使用”部分。
base
├──startup 启动恢复子系统根目录
├──── frameworks
│ └── syspara_lite
│ ├── LICENSE 开源LICENSE文件
│ ├── parameter 系统属性模块源文件目录
│ │ ├── BUILD.gn
│ │ └── src
│ │ ├── BUILD.gn
│ │ ├── param_impl_hal 系统属性模块基于LiteOS-M核实现
│ │ └── param_impl_posix 系统属性模块基于LiteOS-A核实现
│ └── token
│ ├── BUILD.gn
│ └── src
│ ├── token_impl_hal
│ └── token_impl_posix
├──── hals
│ └── syspara_lite 系统属性模块硬件抽象层头文件目录
├──── interfaces
│ └── kits
│ └── syspara_lite 系统属性模块对外接口目录
└──── services
├── appspawn_lite 应用孵化模块
│ ├── BUILD.gn 应用孵化模块编译配置
│ ├── include 应用孵化模块头文件目录
│ ├── LICENSE 开源LICENSE文件
│ ├── moduletest 应用孵化模块自测试代码目录
│ └── src 应用孵化木块源文件目录
├── bootstrap_lite 启动服务模块
│ ├── BUILD.gn 启动服务模块编译配置
│ ├── LICENSE 开源LICENSE文件
│ └── source 启动服务模块源文件目录
└── init_lite 启动引导模块
├── BUILD.gn 启动引导模块编译配置
├── include 启动引导模块头文件目录
├── LICENSE 开源LICENSE文件
├── moduletest 启动引导模块自测试代码目录
└── src 启动引导模块源文件目录
vendor
└──huawei
└──camera
└──init_configs 启动引导模块配置文件目录(json格式,部署于/etc/目录下)
Init_lite使用了配置文件init_configs;
Init_lite 的main.c会读取和执行上面的配置文件命令行,其函数为InitReadCfg;
![](https://s6.51cto.com/oss/202012/10/528645f4519c92e99741a636396912a2.jpg)
Init_lite在编译后,生成”/bin/init”;
bin目录在uildliteBUILD.gn中配置;
![](https://s3.51cto.com/oss/202012/10/d3de359d3eb65587ac6c25eeb42e170d.jpg)
init名称在basestartupservicesinit_liteBUILD.gn中指定;
![](https://s4.51cto.com/oss/202012/10/acf8e7fdb71a0aebc7e1be54a77bae94.jpg)
4. Init_lite是如何被kernel调用的?
liteos-a的启动顺序是:
1)reset_vector_up.s
2)kernelliteos_aplatformmain.c
3)OsMain
4)OsSystemInit
5)OsSystemInitTaskCreate
6)SystemInit
Hi3518 kernel启动过程中会调用SystemInit:
![](https://s2.51cto.com/oss/202012/10/068a6890b8222a2c89de6d7fb7125f58.jpg)
SystemInit函数最后会调用OsUserInitProcess函数,启动init进程;
![](https://s5.51cto.com/oss/202012/10/5980f76769f668b24ec2be1c2eed6633.jpg)
OsUserInitProcess函数在kernelliteos_akernelasecorelos_process.c中定义:
![](https://s3.51cto.com/oss/202012/10/3ea2c90241566b0480f18d653cc4ebf4.jpg)
OsUserInitProcess中定义了第一个用户态进程的地址是__user_init_entry;
__user_init_entry通过宏定义LITE_USER_SEC_ENTRY进行定义,其所在文件是kernelliteos_akernelusersrclos_user_init.c;
这就是Kernel调用init_lite的入口:
![](https://s2.51cto.com/oss/202012/10/826fbb1df3f626c707f1d4620d364d44.jpg)
https://harmonyos.51cto.com/#zz
【编辑推荐】
相关文章
- 崩溃!P6晋升P7,又跪了!!!
- 云徙 x 茶界茅台竹叶青 | 携手共创茶业数字化标杆
- 年终收藏!吴恩达盘点2020年度AI热门事件
- 量子科技中国按下“快进键” 我国85%量子领域相关企业新增于5年内
- Eclipse官宣,干掉VS Code!
- 权威数据来了,中国到底有多少个程序员?
- 2007图灵奖得主离开了:模型检测先驱Edmund Clarke因新冠逝世
- 图灵奖得主Bengio的AI公司,都不得不「2折出售」了
- 阿里开源量子模拟器“太章2.0”,支持量子算法和纠错探索
- 年终总结:2021年四大企业级技术趋势
- 让神经网络给符号AI打工,MIT和IBM联合解决深度学习痛点
- ETR:2021年技术支出将增长4%
- 2021 需求最大的八个 IT 岗位名单出炉
- 是否似曾相识?每个开发人员都犯过的十五个错误
- 国际科技交流盛典 深圳创新创业投资大会颁奖典礼暨大湾区科技大会(GBAS)圆满落幕
- BAT大厂们加码布局工业互联网的这一年
- 互联网老兵不老秘诀:进攻是最好的防守
- 6个良心的国产小众软件,每一个都好用到爆,知乎超10万人推荐
- 这个AI“大师级”简笔画水平,惊艳到了网友:竟然不用GAN
- 调查 | 世界各地关于AI和机器自动化对社会影响的看法