系统概览

Sysmem 是一种 FIDL 服务,用于分配共享内存,以供多个应用和硬件块使用。本文档简要介绍了它的主要功能及其为系统提供的功能。

设计初衷

现代系统具有可以对数据执行操作的专用硬件块。以下是此类屏蔽设置的一些示例:

  • 使用 GPU 渲染计算机图形。
  • 使用硬件编解码器对视频进行编码或解码。
  • 使用相机和 DSP 拍摄高品质照片。
  • 使用屏幕控制器的叠加层引擎将图片合成到屏幕上。
  • 使用 TPU 评估神经网络。

通常,我们需要创建在这些单独的硬件块之间传递数据的流水线。请参见以下示例:

  • 使用硬件编解码器解码视频,并将其与 GPU 上呈现的界面内容一起合成到显示中。
  • 将神经网络应用于实时摄像头画面。

为了高效执行此操作并避免复制,驱动程序和应用必须就数据所在的格式以及数据在内存中所处的位置达成一致。达成此协议后,一个单元的输出就可以直接供下一个单元使用。 硬件单元对这些属性有严格的限制,还优先选择哪种数据布局可带来最佳性能。

Sysmem 是一项全局服务,可以由应用馈送约束条件,并分配缓冲区以使满足所有约束条件。如果支持多种格式,则可以根据预期性能选择其中一种格式。

Sysmem 缓冲区通常用于表示图片,而 sysmem 对协商图片格式提供特殊支持。不过,sysmem 接口也可用于音频或任何其他类型的数据。

分配缓冲区后,Sysmem 不管理数据流。流水线中的应用负责相互协调,以确保同步。

分配流程(简化)

  1. 参与者连接到 fuchsia.sysmem.Allocator 服务
  2. 一个参与者(称为发起者)会创建一个初始缓冲区收集令牌
  3. 该参与者复制令牌,并将副本发送给其他参与者。
  4. 这些参与者还可以递归复制并发送令牌,直到所有参与者都收到令牌。
  5. 每个参与者都绑定其令牌以获取缓冲区集合。
  6. 每个参与者都对缓冲区集合设置限制条件
  7. Sysmem 会选择可以满足所有限制条件的格式。只有在每个参与者绑定其令牌并对集合设置了限制条件后,才能发生这种情况。
  8. Sysmem 会使用该格式分配多个缓冲区。
  9. 参与者从系统内存中检索缓冲区,以及有关已分配格式的信息。

sysmem 返回的信息是该缓冲区中的图片格式必须满足的一组约束条件。

此时,参与者可以按照分配的格式使用缓冲区,但受限于参与者之间的数据流的特定流水线限制。由于缓冲区中可以使用多种图片尺寸,因此参与者必须共同合作选择图片大小,然后才能确定精确的图片格式。这样一来,流水线就可以即时切换图像大小,而无需重新分配缓冲区。

如果需要将新参与者添加到已通过限制条件协商和分配的现有集合中,则可以向缓冲区集合附加新令牌。必须使用已分配的缓冲区收集来满足新参与者的约束条件,否则逻辑分配(从新参与者的角度来看)会失败。为了提高新参与者成功添加的几率,初始分配期间出现的其中一位参与者可以将令牌标记为“可分配”。这样一来,就可以使用令牌指定替代限制条件,以便缓冲区收集稍后能够容纳具有相同限制条件的新参与者。

缓冲区销毁

必须移除对缓冲区的所有引用,然后 sysmem 才会销毁缓冲区并允许重复使用内存。这些文件包括:

术语库

缓冲区

缓冲区表示应用将使用的单个图像或其他内存片。Sysmem 目前为每个缓冲区使用一个 VMO。客户端可以将内存映射到 CPU 上,或将其固定以将其用于硬件块。

参与者

参与者是指想要访问缓冲区的任何应用或驱动程序。所有参与者都必须连接到 sysmem 才能协商内存格式。

映像格式

图片格式是客户端将内存解读为一组像素所需的整套属性。例如,它包括像素格式、宽度和高度大小、行间距(以字节为单位)和颜色空间。

缓冲区设置

缓冲区设置是对缓冲区属性的完整说明。其中包括缓存信息,以及参与者访问内存可能需要的其他属性。对于图像,缓冲区设置也具有图像格式。

缓冲区设置不包含具体的内存地址,因此多个不同的缓冲区可以具有相同的缓冲区设置。

表示系统上一种特定类型的内存。一个系统可能有多个具有不同性能特征的堆。某些堆可能只能通过系统上的部分硬件设备使用。

某些堆可能无法从 CPU 访问。对于这些堆,表示缓冲区的 VMO 不能直接使用,而是用作键。希望使用缓冲区的应用必须将其 VMO 句柄发送到堆驱动程序,而堆驱动程序可以返回有关要使用的内存的信息。

堆示例:

  • 主系统内存。
  • 独立的 GPU 上的 VRAM。
  • 仅供某些硬件使用的系统内存的挖出区域。

约束条件

约束条件指定参与者能够使用的一组 BufferSettings。参与者通常会在一组约束条件中指定多个潜在的缓冲区设置,这使得系统能够灵活地选择其中任何一项,并降低没有设置可以满足所有参与者的约束条件的风险。

协商

协商是 sysmem 查看参与者的所有约束条件并选择适合所有这些约束条件的缓冲区设置的过程。如果可以使用多项设置,sysmem 可以使用有关客户端如何使用缓冲区以及系统架构的信息来选择最佳设置。

缓冲区收集

缓冲区集合是一组具有相同缓冲区设置的多个缓冲区。Sysmem 一次分配整个缓冲区集合。多个参与者可以具有向同一个缓冲区集合开放的 FIDL 通道。

缓冲区收集令牌

在分配内存之前,系统会在协商过程的初始阶段使用令牌。令牌可以复制并在进程之间传递,然后再最终绑定到缓冲区集合。