当前位置: 首页 > 科技观察

2020征稿-开发板鸿蒙liteos-a如何启动第一个用户进程Init_lite

时间:2023-03-11 21:21:57 科技观察

详情请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz1。鸿蒙OS编译知识OpenHarmony源码编译系统使用google和ninjia开发的gn工具。两者结合比传统的makefile编译系统效率更高,特别适用于大型系统的并行编译。对于开发者来说,如果想参与OpenHarmony的开发,需要对gn的语法有一定的了解。本文只做一些基本的介绍:1.如果使用gn工具,开发者将编译规则写在一个名为BUILD.gn的文件中。gn文件和Makefile一样,有自己的语法规则,属于领域语言(DomainSpecificLanguage,DSL)。gn语法不难,但是编译规则本身内容很多,一下子掌握所有内容并不容易。2.gn支持自定义模板函数,可以放在名为.gni的文件中。OpenHarmony中最常见的gn模板文件是./build/lite/config/component/lite_component.gni。gni模板文件可以通过.gn文件中的import导入。OpenHarmony定义了lite_component和lite_library等模板函数。3、在gn中,可执行文件的编译函数入口为exectuable("文件名"),共享库的编译规则函数为shared_library("文件名")。因此,如果要查找某个文件对应的编译规则,可以先查找所有的BUILD.gn文件,然后grep可执行文件。以下是所有可执行文件的grep结果截图。(以上原理引用自中科创达OpenHarmony研究组《鸿蒙OS开源代码精要解读——init》)2、从编译过程看鸿蒙OS的代码结构Hi3518EV300的编译命令如下:pythonbuild.pyipcamera_hi3518ev300-bdebug编译命令是如何执行的?编译的主要文件是Build\lite\BUILD.gn文件,截取内容如下:先编译内核,依赖库;最后编译rootfs,rootfs的编译过程打开\build\lite\gen_rootfs.py看到是先编译userfs,再编译rootfs。使用的配置文件:打开ipcamera_hi3518ev300.json,其中:1.配置内核为liteos_a;2、指定编译器为clang;3.列出所有操作系统子系统和源代码位置,包括内核和启动子系统。Startup中的init_lite是内核调用的第一个用户态进程;3.第一个用户态进程init_lite的位置,应用程序启动前操作系统中间层的启动。涉及以下模块:·initboot支持使用LiteOS-A内核的平台,目前包括:Hi3516DV300平台和Hi3518EV300平台。负责处理从内核加载第一个用户态进程到第一个应用程序启动的系统服务进程启动过程。启动恢复子系统除了负责加载各个系统的关键进程外,还需要在启动的同时为其设置相应的权限,并在子进程启动后(如果processexitsedunexpectedly,itneedsrestart),对于特殊进程意外退出时,启动recovery子系统也会进行系统复位。·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文件│├──参数系统属性模块源文件目录││├──BUILD.gn│...──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_litebootstrap_lite服务模块│├──BUILD.gn服务模块编译配置│├──LICENSE开源LICENSE文件│└──source启动服务模块源文件目录└──init_lite启动引导模块├──BUILD.gn启动引导模块编译配置├──include启动引导模块头文件目录├──LICENSE开源LICENSE文件├──moduletest引导模块self-测试代码目录└──src启动模块源文件目录vendor└──huawei└──camera└──init_configs启动模块配置文件目录(json格式,部署在/etc/目录下)init_lite使用配置文件init_configs;Init_lite的main.c会读取并执行上面配置文件的命令行,其功能是Init读取配置;init_lite编译后生成“/bin/init”;bin目录在\build\lite\BUILD.gn中配置;初始化名称在base\startup\services\init_lite\BUILD.gn中指定;4、init_lite是如何被内核调用的?liteos-a的启动顺序为:1)reset_vector_up.s2)\kernel\liteos_a\platform\main.c3)OsMain4)OsSystemInit5)OsSystemInitTaskCreate6)SystemInitHi3518启动时内核会调用SystemInit:SystemInit函数最后会调用OsUserInitProcess函数启动初始化进程;OsUserInitProcess函数定义在\kernel\liteos_a\kernel\base\core\los_process.c中:OsUserInitProcess中定义的第一个用户态进程地址为__user_init_entry;__user_init_entry由宏定义LITE_USER_SEC_ENTRY定义,其中文件为\kernel\liteos_a\kernel\user\src\los_user_init.c;这是Kernel调用init_lite的入口:更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz【小编推荐】学习Python做SEO,分享7个技巧帮你做数据分析。中国最受欢迎的浏览器:市场占有率高达58%,全球超过10亿人使用Windows10必备5款软件,让你的电脑更有用,请低调使用关键方式如何部署一个生产级的Kubernetes应用并发编程Phaser原理及应用