Fuchsia进程创建


内核提供了底层设施以创建和启动进程。但是,由于包含为可执行文件、共享库和栈进行直接映射内存空间的工作,这些设施难以使用。替代的方法,应当使用如下的较高层机制创建进程。


fuchsia.process.Launcher

Fuchsia提供的进程fuchsia.process.Launcher,实现了创立进程所需的底层工作。你只需为此服务提供创建进程所需的内核对象(例如,将在其中创建进程的job对象;可执行镜像;以及标准输入和输出句柄),服务本身完成解析ELF格式可执行文件的工作,配置进程地址空间,和发送启动消息到进程。


大多数客户不需要直接使用此服务。相反,可使用FDIO库(Zircon IO库)中的简单C语言前端函数fdio_spawn。此函数与更高级别的fdio_spawn_etc和fdio_spawn_vmo函数,连接到fuchsia.process.Launcher服务,发送适当的消息到服务去创建进程。传递到函数fdio_spawn_etc中的fdio_spawn_action_t结构体数组可定制化新建的进程。


不管是直接使用fuchsia.process.Launcher服务,还是通过fdio_spawn前端,此创建进程的方式是在你自身命名空间中最合适的,因为你需要为新进程提供所需的内核对象。


fuchsia.sys.Launcher

为实现在其自身命名空间中创建进程,Fuchsia提供了fuchsia.sys.Launcher服务。不同于为需要创建的新进程提供所有需要的内核对象,你仅需为此服务提供一个高级别的要创建进程的描述,fuchsia.sys.Launcher服务为新进程提供合适的内核对象。例如,提供一个软件包中组件的URL地址,fuchsia.sys.Launcher服务将在合适的命名空间中为此组件创建一个新进程,此命名空间有组件访问其自身包的权限,并且分配其manifest文件中sandbox一节声明的其它资源。


不同于直接返回一个zx::process句柄,fuchsia.sys.Launcher返回一个fuchsia.sys.ComponentController接口。这一级抽象使得fuchsia.sys.Launcher可创建非单进程支持的组件。例如,加载一个使用Dart编写的组件,此组件可能运行与Dart VM实例中,而此实例又根据兼容的安全约束由多个组件共享。


Early boot

在启动过程的早期阶段,系统确实收到创建了一些进程。例如,内核手动创建了第一个用户进程 userboot,其接下来又创建了devmgr进程。这些底层机制使用了liblaunchpad.so共享库,其中包含解析ELF文件的逻辑。在Fuchsia的job树中直接的创建进程是被job策略禁止的。


共享库liblaunchpad.so在Zircon中可用,并且应当仅在早期启动阶段使用,或者作为进程创建的底层测试使用。可能被Fuchsia的job树使用的库和程序应当使用fdio_spawn函数(或者其变种),以遵循安全策略。

 

END

 

你可能感兴趣的:(fuchsia)