OpenHarmony开源社区
直播中

ss

6年用户 8762经验值
擅长:电源/新能源 制造/封装 RF/无线
私信 关注
[经验]

标准系统的几种进程拉起方式介绍

标准系统启动到进入用户态拉起init进程后,由init进程拉起一组系统服务进程,再由这组系统服务进程拉起与之相关联的子进程,或者应用进程。
下面我们简单看一下标准系统的几种进程拉起方式。
1.init直接拉起系统服务进程
init进程启动到InitReadCfg()时,去读取和分析/system/etc/init.cfg和/system/etc/init/*.cfg。
其中init.cfg与小型系统的有较大差别,其主要工作是配置各个启动阶段所需要的环境,比如创建文件节点、修改相关节点的权限等,而不是直接去start全部的系统进程。各个系统进程的start和相关配置,基本上是由/system/etc/init/目录下的各进程自己的cfg文件进行配置的。
init进程将各进程的配置读取和分析后,在启动到具体的阶段时,会去触发和按顺序执行各个系统进程的start命令:
10:04static const struct CmdTable CMD_TABLE[] = {
    { "start ",   1, DoStart },
    ......
}
DoStart -> StartServiceByName -> ServiceStart -> fork()+execve(),直接就去运行进程自己的cfg文件中"path" 指定的可执行程序,切换到进程的上下文环境去运行了,这就完成了init的第一代子进程的启动,典型的例子可以看appspawn进程的启动。
2.借sa_main启动的系统进程
有部分系统进程,自己的代码并不直接编译生成可执行程序,而是编译生成一个动态链接库,如softbus_server进程,直接编译生成libsoftbus_server.z.so,该进程的cfg中是这样配置的:
{
    "jobs" : [{
            "name" : "post-fs-data",
            "cmds" : [
                "start softbus_server"
            ]
        }
    ],
    "services" : [{
            "name" : "softbus_server",
            "path" : ["/system/bin/sa_main", "/system/profile/softbus_server.xml"],
            "uid" : "system",
            "gid" : ["system", "shell"]
        }
    ]
}
它的"path"字段配置的是去运行"/system/bin/sa_main"可执行程序,再通过sa_main里的DoStartSAProcess()根据/system/profile/softbus_server.xml的描述,去加载libsoftbus_server.z.so,以此来切换到softbus_server进程的上下文中运行。
标准系统中借sa_main可执行程序来启动的进程非常多,在/system/etc/init/目录下的cfg中有详细描述。
3.借其它可执行程序启动的系统进程
这种类似于第2种,但借用的可执行程序,不像sa_main那样具有系统级别的通用性,而是只具有子系统级别的局部通用性。典型的例子是标准系统部署在用户态的驱动框架的各进程。 先按第1种方式拉起hdf_devmgr进程,待启动到具体阶段时,hdf_devmgr进程会通过fork()+execve()去运行hdf_devhost可执行程序。这个hdf_devhost就是只适用于驱动框架的通用进程入口,它会根据execve()送进来的参数去加载各个具体host的动态库,如libsample_driver.z.so,由此进入sample_host进程的的上下文环境中去运行。这样就完成了一组host进程的拉起,这组host进程都是hdf_devmgr进程的子进程。

更多回帖

发帖
×
20
完善资料,
赚取积分