1. 主页
  2. 文档
  3. Fuchsia OS 简体中文文档 (2019年版)
  4. 手册
  5. 沙盒

沙盒

本文档描述了 Fuchsia 中沙盒的工作原理。

空进程没有任何内容

在 Fuchsia 中,新创建的进程没有任何内容。新创建的进程不能访问任何内核对象,不能分配内存,甚至不能执行代码。当然,这样的进程不是很有用,这就是为什么我们通常创建具有一些初始资源和能力的进程。

最常见的情况是,进程开始时执行一些带有初始堆栈、一些命令行参数、环境变量和一组初始句柄 handles 的代码。最重要的初始句柄之一是 PA_VMAR_ROOT,进程可以使用它将额外的内存映射到其地址空间。

命名空间是通向世界的大门

给进程的一些初始句柄是进程挂载到其命名空间 _namespace_ 的目录。这些句柄允许进程发现并与系统上运行的其他进程通信,包括文件系统和其他服务。有关详细信息,请参阅命名空间

给进程的命名空间很大程度上决定了该进程可以支配多少系统资源。因此,运行配置进程的沙盒相当于该配置进程的命名空间。

包命名空间

从包运行的组件可以访问 /pkg,这是包含该组件的包的只读视图。要在运行时访问这些资源,进程可以使用 /pkg 命名空间。例如,root_presenter 可以使用绝对路径 /pkg/data/cursor32.png 访问 cursor32.png

服务

属于组件的进程在其命名空间中接收 /svc 目录。通过 /svc 提供的服务是组件环境提供的服务的子集。该子集由组件的清单文件中的 sandbox.services 白名单确定。

典型的组件将与来自 /svc 的许多服务交互,以便在系统中发挥一些有用的作用。例如,如果组件希望启动其他组件,则需要 fuchsia.sys.Launcher 服务。

不是组件的进程可能有也可能没有 /svc。这些进程接收其创建者决定提供给它们的任何 /svc

注意: 在过去,不存在服务沙箱机制,组件接收其环境中的所有服务。已将先前存在的组件升级为可接收所有具有 deprecated-all-services 功能的服务,这些服务最终将被删除。请不要在新组件使用 deprecated-all-services

配置其他命名空间

如果进程需要访问其他资源(例如,设备驱动程序),则包可以通过在其组件清单中包含 sandbox 属性来请求访问其他名称。例如,以下 meta/sandbox 文件请求直接访问输入驱动程序:

{
    "dev": [ "class/input" ]
}

在当前实现中,AppMgr 会允许所有此类请求,但随着系统的发展,这种情况可能会发生变化。

构建包

若要生成包,请使用在 //build/package.gni 中定义的 gn 中的 package() 宏。有关导入资源的详细信息,请参见 package() 宏的文档。

例如, 您可以查看 [https://fuchsia.googlesource.com/garnet/+/master/packages/prod/fortune] 和 [https://fuchsia.googlesource.com/garnet/+/master/bin/fortune/BUILD.gn] 。

标签
这篇文章对您有用吗?

我们要如何帮助您?

Comments

Leave a reply

您的电子邮箱地址不会被公开。