协议
分配器
在 fuchsia.sysmem2/allocator.fidl 中定义
分配系统内存缓冲区。
此协议不使用墓碑。
AllocateNonSharedCollection
代表单个客户端(也称为 发起方),而对方也是唯一参与者(从 sysmem)。
此调用主要用于临时/测试目的。此调用会跳过 fuchsia.sysmem2/BufferCollectionToken 阶段,因此 允许其他参与者指定其限制条件。
我们鼓励真实客户使用
fuchsia.sysmem2/Allocator.AllocateSharedCollection 与
让相关参与者直接表达他们对
系统通过向这些参与者发送 BufferCollectionToken
来启动系统。
- 请求
collection_request
: fuchsia.sysmem2/BufferCollection。
请求
名称 | 类型 |
---|---|
payload |
AllocatorAllocateNonSharedCollectionRequest
|
AllocateSharedCollection
创建一个根 fuchsia.sysmem2/BufferCollectionToken。
BufferCollectionToken
可以“复制”分发到
参与者
fuchsia.sysmem2/BufferCollectionToken.Duplicate。每个
BufferCollectionToken
可以转换为
使用 fuchsia.sysmem2.BufferCollection
fuchsia.sysmem2/Allocator.BindSharedCollection。
可以通过 fuchsia.sysmem2/BufferCollection.SetConstraints。
可以使用缓冲区填充缓冲区集合成功/失败的情况 确定自 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated。
关闭 BufferCollectionToken
的客户端,或
BufferCollection
(先没有 Release
)会导致所有客户端都失败
同一故障域,该域默认为
缓冲区收集。请参阅
fuchsia.sysmem2/BufferCollection.SetDispensable 和
fuchsia.sysmem2/BufferCollection.AttachToken,用于创建
单独的故障域。
请求
名称 | 类型 |
---|---|
payload |
AllocatorAllocateSharedCollectionRequest
|
BindSharedCollection
将 fuchsia.sysmem2/BufferCollectionToken 转换为 fuchsia.sysmem2/BufferCollection。
在发送此消息时,缓冲区收集尚未
缓冲区 - 参与者必须先发送
fuchsia.sysmem2/BufferCollection.SetConstraints(通过
BufferCollection
客户端结束。
从根目录复制了所有 BufferCollectionToken
BufferCollectionToken
(通过 AllocateSharedCollection
创建)必须是
“已交”通过 BindSharedCollection
(或 Release
ed)
现有BufferCollection
客户端必须已发送 SetConstraints
之前,逻辑 BufferCollection 将会填充缓冲区(或
会失败)。
- 请求
token
其服务器端的渠道的客户端端点 发送到系统内存的命令 fuchsia.sysmem2/Allocator.AllocateSharedCollection 或其服务器 end 是通过使用 fuchsia.sysmem2/BufferCollectionToken.Duplicate。令牌为 “已交”来换取 fuchsia.sysmem2/BufferCollection。 - 请求
buffer_collection_request
请求的服务器端 fuchsia.sysmem2/BufferCollection 渠道。发件人会保留 客户端。BufferCollection
频道是单个参与者的 与逻辑缓冲区集合之间的连接。通常 其他参与者使用自己的BufferCollection
频道 逻辑缓冲区集合。
请求
名称 | 类型 |
---|---|
payload |
AllocatorBindSharedCollectionRequest
|
GetVmoInfo
如果给定 sysmem 提供的 VMO 的句柄,这会返回额外的信息 相应 sysmem 逻辑缓冲区的信息。
大多数调用方会先复制一个 VMO 句柄,然后将副本发送到 这场通话
如果客户端为 sysmem 提供的 VMO 创建了子 VMO,则 子 VMO 不被视为“系统内存 VMO”将用于此次调用
- 请求
vmo
:系统内存提供的 VMO 的句柄(或查看错误)。
- 响应
buffer_collection_id
缓冲区集合 ID,即 每次启动时,每个逻辑缓冲区集合都是唯一的。 - response
buffer_index
:缓冲区内缓冲区的缓冲区索引, 缓冲区收集。该索引与 内缓冲区的索引相同。 fuchsia.sysmem2/BufferCollectionInfo.buffers。buffer_index
对于 sysmem 传送的所有 VMO,它们都是相同的 逻辑缓冲区(即使 VMO 组合不同)。buffer_index
为 在一个缓冲区集合的各个缓冲区中唯一唯一。对于给定的缓冲区buffer_collection_id
和buffer_index
的组合是唯一的 每次启动时。 - 响应
close_weak_asap
Iffvmo
是弱系统 VMO 的句柄,close_weak_asap
字段将在响应中设置。此标识名 当所有弱 VMO 句柄ZX_EVENTPAIR_PEER_CLOSED
应尽快关闭缓冲区。收到信号 缓冲区的所有强系统内存 VMO 很快就会关闭 (包括通过强有力的BufferCollectionToken
或 强BufferCollection
)。未能关闭所有弱系统 VMO 在ZX_EVENTPAIR_PEER_CLOSED
发生后快速处理缓冲区 被视为因客户端仍保持较弱的系统系统而导致 VMO 泄露 VMO 会处理并导致系统对日志发出很大的投诉。通过 可以单独释放集合的缓冲区。通过ZX_EVENTPAIR_PEER_CLOSED
可能在 响应到达客户端客户端不准备处理 弱系统内存 VMO,在看到此字段设置时可以关闭所有句柄 缓冲区并使所有关联的请求失败。
- 错误
[fuchsia.sysmem2/Error.NOT_FOUND]
- vmo 不是系统内存 VMO。强和弱系统内存 VMO 都可以传递给此调用,并且 传入此调用本身的 VMO 句柄会保留 VMO 的信息 才能响应此调用。因此 ZX_ERR_NOT_FOUND 错误不会含糊不清(即使 调用 VMO 的句柄;即使其他标识名已关闭 在 GetVmoInfo 响应到达客户端之前)。 - 错误
[fuchsia.sysmem2/Error.HANDLE_ACCESS_DENIED]
vmo 不是 能够与 GetVmoInfo 搭配使用(因为拥有相关权利/功能) 该 VMO 需要能够与 zx_vmo_get_info 配合使用,且 主题 ZX_INFO_HANDLE_BASIC。 - 错误
[fuchsia.sysmem2/Error.UNSPECIFIED]
对于 未指明的原因。如需了解详情,请参阅日志。 - 错误
[fuchsia.sysmem2/Error.PROTOCOL_DEVIATION]
vmo 字段 或者请求字段存在其他问题。
请求
名称 | 类型 |
---|---|
payload |
AllocatorGetVmoInfoRequest
|
响应
名称 | 类型 |
---|---|
payload |
Allocator_GetVmoInfo_Result
|
SetDebugClientInfo
将有关 sysmem 可以使用的当前客户端的信息设置为 帮助诊断泄漏的内存和等待 发送 fuchsia.sysmem2/BufferCollection.SetConstraints。
这会在所有 fuchsia.sysmem2/Node 上设置调试客户端信息
由这个fuchsia.sysmem2/分配器创建。
包括通过fuchsia.sysmem2BufferCollection
fuchsia.sysmem2/Allocator.BindSharedCollection(在缺少
之前对 fuchsia.sysmem2/Allocator.SetDebugClientInfo 的任何调用,
这些BufferCollection
与
上交令牌以创建 BufferCollection
)。
随后,此信息可以按Node
替换
发送 fuchsia.sysmem2/Node.SetDebugClientInfo。
发送 fuchsia.sysmem2/Allocator.SetDebugClientInfo 一次
Allocator
是确保所有
fuchsia.sysmem2/节点将至少包含一些调试客户端信息
而且比单独发送相同的调试信息更高效
通过 fuchsia.sysmem2/Node.SetDebugClientInfo 获取每个客户端信息
已创建 fuchsia.sysmem2/Node。
- 请求
name
,可以是任意字符串,但当前 进程名称(请参阅fsl::GetCurrentProcessName
)是一个很好的默认值。 - 请求
id
这可以是任意 ID,也可以是当前的进程 ID (请参阅fsl::GetCurrentProcessKoid
)是一个很好的默认值。
请求
名称 | 类型 |
---|---|
payload |
AllocatorSetDebugClientInfoRequest
|
ValidateBufferCollectionToken
检查 fuchsia.sysmem2/BufferCollectionToken 是否已知 sysmem 服务器。
通过此调用,客户端可以确定传入令牌是否为 系统内存服务器已知的真实 sysmem 令牌,不存在任何风险 无时无刻不等待可能虚假的令牌完成操作 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync 或 fuchsia.sysmem2/BufferCollectionToken.Sync(或任何其他双向 FIDL 消息)。在客户端信任令牌来源的情况下 提供真实令牌, 调试。
如果验证有时会失败,但其他时间成功, 令牌本身可能没有调用 fuchsia.sysmem2/BufferCollectionToken.Sync 或 fuchsia.sysmem2/BufferCollection.Sync(创建/复制 令牌,但在将令牌发送到当前客户端之前。可能 便于来源使用 要复制的 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync 令牌,因为该调用已内置同步步骤。或者, 在系统处理此调用之前,收集可能失败 因为缓冲区收集失败会清理 sysmem 对 相关令牌。
此调用对任何令牌都没有任何影响。
- 请求
token_server_koid
通道服务器端的 koid 可能是 BufferCollectionToken 渠道。这可以通过 经由zx_object_get_info
ZX_INFO_HANDLE_BASIC
related_koid
。
- 响应
is_known
true 表示系统内存当时知道令牌 系统内存处理了请求,但无法保证令牌 在客户端收到回复时仍然有效。功能 令牌至少是真实令牌, 对令牌的调用不会永久停止(会失败或公平成功) 而不是停滞不前)。如果 令牌的来源可以得到信任,以提供真实令牌。false 值表示 sysmem 在 sysmem 时不知道该令牌 处理了此调用,但令牌之前可能有效,或者 可能尚未生效。或者,如果令牌的发送者不受信任, 提供真实令牌,则该令牌可能是假的。我们的责任是 与 sysmem 同步,以确保 创建/复制的令牌在发送 传送给其他参与者。
请求
名称 | 类型 |
---|---|
payload |
AllocatorValidateBufferCollectionTokenRequest
|
响应
名称 | 类型 |
---|---|
payload |
Allocator_ValidateBufferCollectionToken_Result
|
BufferCollection
在 fuchsia.sysmem2/collection.fidl 中定义
fuchsia.sysmem2/BufferCollection 是直接从
系统启动的缓冲区收集;缓冲区收集
与拥有自己的BufferCollection
的其他参与者共享
与同一缓冲区集合关联的客户端。也就是说,
BufferCollection
接口的实例是缓冲区的视图
而不是缓冲区集合本身。
存在 BufferCollection
连接以便异步指示
当缓冲区集合已填充缓冲区时。
此外,系统内存服务器关闭通道可指示
客户端应关闭从
BufferCollection
。
某些缓冲区集合可能会占用足够的内存,因此值得避免使用 分配重叠(时间上)使用 fuchsia.sysmem2/BufferCollection.AttachLifetimeTracking 以便接收 发起者可以判断是否已获得缓冲区集合的足够缓冲区 在启动器分配新的缓冲区集合之前完全取消分配。
此协议不使用墓碑。
AttachLifetimeTracking
设置事件对,以便在发生以下情况时发出信号 (ZX_EVENTPAIR_PEER_CLOSED
)
缓冲区,且只有指定数量的缓冲区(或者
较少的内容)保留在缓冲区集合中。
fuchsia.sysmem2/BufferCollection.AttachLifetimeTracking 允许接收 等待旧缓冲区收集全部或大部分时间 然后再尝试分配新的缓冲区集合。通过 只有当其他缓冲区已完全加载和/或播放完毕时, 取消分配(不仅是客户端取消引用,而是所有内存资源 已完全回收/回收),或 树或子树的分配或逻辑分配失败,包括 此 fuchsia.sysmem2/BufferCollection。
在分配或逻辑分配之前,事件对不会发出信号 已完成;该集合的当前缓冲区计数为 已忽略。
如果附加的子树的逻辑分配失败(使用 fuchsia.sysmem2/BufferCollection.AttachToken), 事件对会在该失败期间关闭 缓冲区有可能在整个缓冲区集合中分配。这是 以确保逻辑分配与正常分配保持一致。
由此事件发出的生命周期包括对
分配的缓冲区,并且这种异步清理只能在所有
缓冲区的 VMO 句柄的持有者已关闭这些 VMO 句柄。
因此,客户端应小心谨慎,以免被永久屏蔽
如果 ZX_EVENTPAIR_PEER_CLOSED
有任何
使用逻辑缓冲区集合的参与者的可信度较低或
可靠性降低。未能分配新的/替换缓冲区集合
总比被困住要好得多。
此机制旨在与具有
类似的 AttachLifetimeTracking
消息;相同的条目
eventpair
句柄(服务器端)可通过多个
AttachLifetimeTracking
消息发送到不同的协议,而
ZX_EVENTPAIR_PEER_CLOSED
当所有
所有重复关键字
服务器端句柄。此外,由于事件对端点的工作原理,
可在不阻止
ZX_EVENTPAIR_PEER_CLOSED
信号。
服务器故意不“信任”信号
server_end
。该机制有意仅使用
ZX_EVENTPAIR_PEER_CLOSED
:无法“提前”设置,且只设置
当服务器端事件对的所有句柄都关闭时触发。“无意义”
与任何其他信号相关联,客户端应忽略所有信号,
eventpair
任意一端的其他信号位。
server_end
可能缺少 ZX_RIGHT_SIGNAL
或 ZX_RIGHT_SIGNAL_PEER
,
但必须包含 ZX_RIGHT_DUPLICATE
(且必须有 ZX_RIGHT_TRANSFER
到
则不会导致 BufferCollection
信道故障)。
目前,所有表字段均为必填字段。
- 请求
server_end
此事件对句柄将由 系统内存服务器, 缓冲区数量小于或等于buffers_remaining
。 - 请求
buffers_remaining
等待除buffers_remaining
以外的所有请求(或者 需要完全取消分配的缓冲区。大于零的数字可以 在已知数量的缓冲区 以便继续使用数据 例如在界面中显示上一个可用的视频帧 即使视频流使用的是受保护的输出缓冲区也是如此。时间是 超出了BufferCollection
接口的范围(至少对于 现在)来确定可以在不关闭的情况下持有的缓冲区数量,但是 该值通常介于 0-2 之间。
请求
名称 | 类型 |
---|---|
payload |
BufferCollectionAttachLifetimeTrackingRequest
|
AttachToken
创建新令牌,将新参与者添加到现有逻辑 缓冲区收集,如果现有集合的缓冲区计数, 且参与者允许。
这对于替换失败的参与者和/或 缓冲结束后添加/重新添加参与者 已分配。
使用 fuchsia.sysmem2/BufferCollection.AttachToken 时,子
位于附加的 fuchsia.sysmem2/BufferCollectionToken 的树
会按照常规流程设置限制条件或
fuchsia.sysmem2/Node 上,然后出现从
客户的尽管所有缓冲区都有可能
之前实际分配的这个过程称为“逻辑”
分配”。“分配”的大多数实例其他消息的文档
也可理解为“分配或逻辑分配”而
但我们在这里只说“分配”在大多数地方都是为了简洁/简洁
以及“逻辑分配”的详细信息剩余时间
请参阅 AttachToken
上的文档。
附加的 Node
失败不会传播到
已附加“Node
”。更常见的情况是,子级 Node
的失败会被屏蔽
如果子级已附加,则它不会到达其父级 Node
,或者
子项是可判的,且故障在逻辑分配后发生
(请参阅 fuchsia.sysmem2/BufferCollectionToken.SetDispensable)。
在某些情况下,参与者可能会选择先使用
为委托参与者的指定实例分配的令牌,以及
之后,如果该受托参与者的第一个实例失败,
该委托参与者在新的第二例中,我会收到一个令牌
使用 AttachToken
创建。
从 fuchsia.sysmem2/BufferCollectionToken 的角度来看
令牌的作用与任何其他令牌相同。客户端可以
根据需要使用 fuchsia.sysmem2/BufferCollectionToken.Duplicate 令牌。
并且可以将令牌发送给其他进程/参与者。通过
BufferCollectionToken
Node
应转换为
BufferCollection
Node
照常发送
fuchsia.sysmem2/Allocator.BindSharedCollection,或者可以关闭
在不会导致子树故障的情况下
fuchsia.sysmem2/BufferCollectionToken.Release。假设前者,
fuchsia.sysmem2/BufferCollection.SetConstraints 消息或
fuchsia.sysmem2/BufferCollection.Release 消息应发送到
BufferCollection
。
在子树中,
fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated 表示
子树参与者的使用
已有缓冲区收集,则已建立的
fuchsia.sysmem2/BufferCollectionInfo(包括映像格式)
以及现有的其他参与者(已添加
通过成功的逻辑分配)及其指定的缓冲区计数,
存在的局限性失败结果意味着新参与者的
限制来满足使用现有缓冲区集合的要求,并且
已经添加的参与者。您可以改为创建新集合
允许所有参与者的要满足约束条件,假设
SetDispensable
代替 AttachToken
,或常规令牌
。
使用 AttachToken
创建的令牌通过
当前对缓冲区收集有效的所有约束条件,加上
正在考虑的附加令牌加上附件下的子令牌
令牌本身不是附加的令牌,也不在此类令牌之下。
此子树下的其他子树被视为逻辑树
分配。
将现有缓冲区分配给参与者
fuchsia.sysmem2/BufferCollectionConstraints.min_buffer_count_for_camping
等采用先到先得的原则,但子级无法在逻辑上分配
在其所有父级都发送 SetConstraints
之前。
另请参阅 fuchsia.sysmem2/BufferCollectionToken.SetDispensable,
与 AttachToken
不同,创建的令牌为 Node
+ 子代
Node
(s)(位于已创建的子树中,但不在此其下的任何子树中)
子树)与其父项一起参与约束条件聚合
父实体的分配或逻辑分配期间发生的事件。
与 fuchsia.sysmem2/BufferCollectionToken.Duplicate 类似,
新创建的令牌需要 fuchsia.sysmem2/Node.Sync 才能
sysmem,才能将新令牌传递给 BindSharedCollection
。通过
Sync
的新令牌可通过
转换已创建的 fuchsia.sysmem2/BufferCollection.Sync 后,
BufferCollectionToken
转换为 BufferCollection
。此外,
还针对新令牌设置了 fuchsia.sysmem2/BufferCollectionToken.Sync
工作。或使用 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync
工作。像往常一样,BufferCollectionToken.Sync
可在任何
BufferCollectionToken.Duplicate
邮件已通过新的
将这些额外的令牌同步到 sysmem,方法是使用
单程往返。
目前,所有表字段均为必填字段。
- 请求
rights_attentuation_mask
。这样可降低 VMO 子树的权利。这些“rights_attenuation_mask
”的值 不会减弱(请注意,此列表中不包含 0): <ph type="x-smartling-placeholder">- </ph>
- ZX_RIGHT_SAME_RIGHTS(首选)
- 0xFFFFFFFF(在计算衰减掩码时这很合理)
- 请求
token_request
BufferCollectionToken
的服务器端 。客户端保留客户端。
请求
名称 | 类型 |
---|---|
payload |
BufferCollectionAttachTokenRequest
|
CheckAllBuffersAllocated
在轮询中检查是否分配了所有缓冲区 。
- 如果已分配缓冲区集合,则返回成功。
- 如果缓冲区收集失败,则返回相同的 fuchsia.sysmem2/错误为 fuchsia.sysmem2/BufferCollection/WaitForAllBuffersAllocated 会 return。
- 错误 fuchsia.sysmem2/Error.PENDING 缓冲区收集尚未 尚未尝试分配。也就是说,waitForAllBuffersAlality 不会快速响应。
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
BufferCollection_CheckAllBuffersAllocated_Result
|
GetBufferCollectionId
获取缓冲区集合 ID。此 ID 也可从
fuchsia.sysmem2/Allocator.GetVmoInfo(以及 buffer_index
)
)。
此通话主要在以下情形下非常有用:
fuchsia.sysmem2/BufferCollectionToken 或
fuchsia.sysmem2/BufferCollection,但只能传输 VMO
句柄,该句柄可与 BufferCollection
客户端端重新联接起来
通过其他路径创建的 ID。更希望通过
BufferCollectionToken
或 BufferCollection
(如果可行)。
信任 sysmem 以外的来源的 buffer_collection_id
值
类似于信任锆石之外的其他来源的 Koid 值。
除非确实有必要,否则都应该避免同时使用这两种方法,并且都要求
注意。在某些情况下,引用
BufferCollection
由buffer_collection_id
通过
但传入的值声称
仅凭 buffer_collection_id
不足以证明授予
buffer_collection_id
任意功能的发送端。发件人必须
先向接收者证明发送者有/有 VMO,或者有/有
BufferCollectionToken
。
sysmem 确认是否是有效的 sysmem 句柄,以及哪个 sysmem 映射到
buffer_collection_id
值。接收方应小心避免
假设发送者有 BufferCollectionToken
,且
因为发送方仅能证明其有 VMO。
- 响应
buffer_collection_id
此 ID 在每个缓冲区中是唯一的 每次启动时收集。每个缓冲区均由 同时使用buffer_collection_id
和buffer_index
。
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_GetBufferCollectionId_Result
|
GetNodeRef
这会获取一个句柄
在任何设备上调用 fuchsia.sysmem2/Node.IsAlternateFor
fuchsia.sysmem2/Node。此标识名仅用于证明
客户端已从此 Node
获取此标识名。
由于这是 get 设置,因此没有 fuchsia.sysmem2/Node.Sync
GetNodeRef
与 IsAlternateFor
调用之间所需的函数,
尽管这两个调用通常在不同的渠道上进行,
另请参阅 fuchsia.sysmem2/Node.IsAlternateFor。
目前,所有表字段均为必填字段。
- 响应
node_ref
此句柄可通过IsAlternateFor
不同的Node
频道,用于证明客户端获得了标识名 来自此Node
。
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_GetNodeRef_Result
|
IsAlternateFor
检查调用方 fuchsia.sysmem2/Node 是否在子树中
根植于共同父标记的不同子标记
fuchsia.sysmem2/BufferCollectionTokenGroup
传入 node_ref
。
此通话用于协助执行准入控制去重,以及 以及调试。
node_ref
必须使用
fuchsia.sysmem2/Node.GetNodeRef。
node_ref
可以是重复的句柄;因此无需调用
每次调用 fuchsia.sysmem2/Node.IsAlternateFor 时返回 GetNodeRef
。
如果调用令牌由于
可能是恶意/不受信任的令牌提供程序,调用
fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken
而不是在发生 IsAlternateFor
时无限期卡住
由于调用令牌不是真正的令牌(并非真正的令牌),
与 sysmem 通信)。另一种方法是
fuchsia.sysmem2/Allocator.BindSharedCollection 中包含此令牌
这也会验证令牌并将其转换为
fuchsia.sysmem2/BufferCollection,然后调用 IsAlternateFor
。
目前,所有表字段均为必填字段。
- 回答
is_alternate
<ph type="x-smartling-placeholder">- </ph>
- true:调用节点和
node_ref
Node
是一个BufferCollectionTokenGroup
。这意味着 发起调用的Node
和node_ref
Node
不会同时具有两者 其约束条件适用,而 sysmem 会选择其中一种 约束条件 - 不能两者都选。这是因为 在逻辑期间选择了BufferCollectionTokenGroup
并且只有一个子树的子树促成 约束汇总。 - false:调用方
Node
之间共有的第一个父节点 并且node_ref
Node
不是BufferCollectionTokenGroup
。 目前,这意味着共同的第一个父节点是BufferCollectionToken
或BufferCollection
(无论是否为Release
ed)。这意味着,调用的Node
和node_ref
Node
在约束条件期间可能同时应用这两个约束条件 逻辑分配的聚合(如果两个Node
都符合) 由所涉及的任何父级BufferCollectionTokenGroup
选择。在 在此示例中,没有任何BufferCollectionTokenGroup
可 直接阻止两个Node
同时被选中并 它们的约束条件都已汇总,但即使值为 false,也可以将其中一个或两个都汇总 如果其中有一项或两项,Node
仍有可能被排除在考虑范围外Node
有直接或间接父级BufferCollectionTokenGroup
,用于选择另一个子子树 与包含调用Node
或node_ref
Node
的子树相比。
- true:调用节点和
- 错误
[fuchsia.sysmem2/Error.NOT_FOUND]
node_ref 不是 与调用Node
的缓冲区集合相关联。 导致此错误的另一个原因是,如果node_ref
是 zx.Handle.EVENT 处理具有足够的权限,但实际上并不是 从GetNodeRef
获得的实node_ref
。 - 错误
[fuchsia.sysmem2/Error.PROTOCOL_DEVIATION]
调用方传递了node_ref
不是 zx.Handle:EVENT 句柄,或者不是 所需的权利。node_ref
- 此调用不会返回其他失败的状态代码。不过, sysmem 将来可能会添加其他代码,因此客户端应该 对任何失败的状态代码进行合理的默认处理。
请求
名称 | 类型 |
---|---|
payload |
NodeIsAlternateForRequest
|
响应
名称 | 类型 |
---|---|
payload |
Node_IsAlternateFor_Result
|
版本
在 fuchsia.sysmem2/BufferCollectionToken 通道上:
通常,参与者会将 BufferCollectionToken
转换为
fuchsia.sysmem2/BufferCollection,但参与者可以改为发送
Release
(然后立即关闭渠道,或者
稍后响应服务器关闭服务器端),
以免导致缓冲区收集失败。如果没有之前的 Release
,
关闭 BufferCollectionToken
客户端会导致缓冲
收集失败。
在 fuchsia.sysmem2/BufferCollection 通道上:
默认情况下,服务器会处理
fuchsia.sysmem2/BufferCollection 客户端端(不含 Release
)
首先)使缓冲区收集失败。在一定程度上是为了加快
当有任何参与者失败时,关闭 VMO 句柄以回收内存。如果
参与者想要在没有BufferCollection
导致缓冲区收集失败,参与者可以发送 Release
然后再关闭 BufferCollection
客户端。Release
可以
发生在 SetConstraints
之前或之后。如果早于 SetConstraints
,
缓冲区收集不需要此节点的约束即可
分配。如果晚于 SetConstraints
,系统会保留约束条件,
尽管在 BufferCollection
约束汇总时间。
在 fuchsia.sysmem2/BufferCollectionTokenGroup 通道上:
默认情况下,BufferCollectionTokenGroup
客户端意外关闭
end(先没有 Release
)会导致缓冲区故障
。在不采用任何规则的情况下关闭 BufferCollectionTokenGroup
渠道
缓冲区收集失败,请确保已对 AllChildrenPresent() 执行
已发送,并在关闭BufferCollectionTokenGroup
前发送 Release
客户端。
如果 Release
出现于
[fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of
释放without prior
AllChildrenPresent). This is intentionally not analogous to how <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.Release'>BufferCollection.Release</a> without <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.SetConstraints'>BufferCollection.SetConstraints</a> first doesn't cause buffer collection failure. For a
BufferCollectionTokenGroup, clean close requires
AllChildrenPresent(if not already sent), then
Release`,然后关闭客户端。
如果 Release
发生在 AllChildrenPresent
之后,则子项和所有
其约束条件保持不变(就像如果
BufferCollectionTokenGroup
渠道仍保持打开状态),且客户端
结束关闭不会导致缓冲区收集失败。
在所有 fuchsia.sysmem2/Node 通道上(上述任何一种):
为简单起见,上文中针对每频道协议的段落会忽略
一个单独的故障域
fuchsia.sysmem2/BufferCollectionToken.SetDispensable 或
fuchsia.sysmem2/BufferCollection.AttachToken。当客户端结束
意外关闭(没有先 Release
),且客户端是
而不是使整个缓冲区收集失败
表示故障域失败,但缓冲区收集本身
与故障域故障隔离开来此类故障域
嵌套,在这种情况下,只有最内层的故障域
Node
驻留失败。
请求
<空>
SetConstraints
向缓冲区提供 fuchsia.sysmem2/BufferCollectionConstraints 。
参与者只能通话 fuchsia.sysmem2/BufferCollection.SetConstraints,最多一次 fuchsia.sysmem2/BufferCollection。
要尝试分配缓冲区,
BufferCollection
客户端需要先调用 SetConstraints
,然后再调用
sysmem 将尝试分配缓冲区。
- 请求
constraints
。这些是对缓冲区的约束条件 由发送客户/参与者强加的数据收集。通过 无需设置constraints
字段。如果未设置,客户端 没有设置任何实际限制条件,但表示 无需设置任何限制条件。未设置constraints
字段不会收到任何 VMO 句柄,但仍然可以找到 分配了多少个缓冲区,并且仍然可以通过buffer_index
。
请求
名称 | 类型 |
---|---|
payload |
BufferCollectionSetConstraintsRequest
|
SetDebugClientInfo
将有关 sysmem 可以使用的当前客户端的信息设置为 帮助诊断泄漏的内存和等待 发送 fuchsia.sysmem2/BufferCollection.SetConstraints。
这会在此 fuchsia.sysmem2/Node 和所有节点上设置调试客户端信息。
Node
派生自此Node
,除非被
fuchsia.sysmem2/Allocator.SetDebugClientInfo 或更高版本
fuchsia.sysmem2/Node.SetDebugClientInfo。
发送 fuchsia.sysmem2/Allocator.SetDebugClientInfo 一次
Allocator
是确保所有
fuchsia.sysmem2/节点将至少包含一些调试客户端信息
而且比单独发送相同的调试信息更高效
通过 fuchsia.sysmem2/Node.SetDebugClientInfo 获取每个客户端信息
已创建 fuchsia.sysmem2/Node。
也在启用详细日志记录功能(请参阅 SetVerboseLogging
)时使用,用于
指明哪个客户最先关闭其渠道,从而转到子树
失败(如果子树的用途已过,这是正常现象,但
如果发生时间早于预期,则客户端渠道专用名称
帮助诊断故障最初来自何处
)。
目前,所有表字段均为必填字段。
- 请求
name
,可以是任意字符串,但当前 进程名称(请参阅fsl::GetCurrentProcessName
)是一个很好的默认值。 - 请求
id
这可以是任意 ID,也可以是当前的进程 ID (请参阅fsl::GetCurrentProcessKoid
)是一个很好的默认值。
请求
名称 | 类型 |
---|---|
payload |
NodeSetDebugClientInfoRequest
|
SetDebugTimeoutLogDeadline
如果未检测到 sysmem,系统会记录警告 所有客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints 。
客户端可以调用此方法来更改输出日志的时间。如果 多个客户端设置了截止时间,但未指定哪个截止期限 生效。
在大多数情况下,使用默认值即可。
目前,所有表字段均为必填字段。
- 请求
deadline
:系统内存开始尝试记录日志的时间 除非那时所有限制条件都与 sysmem 相关,否则系统会返回该警告。
请求
名称 | 类型 |
---|---|
payload |
NodeSetDebugTimeoutLogDeadlineRequest
|
SetName
为此缓冲区集合中的 VMO 设置名称。
如果名称在 ZX_MAX_NAME_LEN 中容纳不下,vmo 本身的名称 将被截断为适合大小。vmo 的名称将以 集合中的缓冲区索引(如果后缀适合放在 ZX_MAX_NAME_LEN).此处指定的名称(不截断)将 。
名称只会影响设置名称后分配的 VMO;这场通话 不会重命名现有 VMO。如果多个客户设置了不同的名称 则较大的优先级值将胜出使用 与先前名称相同优先级不会更改名称。
目前,所有表字段均为必填字段。
- 请求
priority
。仅当这是第一个SetName
时,才会设置名称 或者如果priority
大于任何之前priority
的值 此缓冲区集合的所有Node
之前的SetName
调用。 - request
name
在此缓冲区集合下创建的 VMO 的名称。
请求
名称 | 类型 |
---|---|
payload |
NodeSetNameRequest
|
SetVerboseLogging
这会为缓冲区收集启用详细日志记录功能。
详细日志记录包括通过
每个客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints
以及通过 fuchsia.sysmem2/Node.SetDebugClientInfo(或
fuchsia.sysmem2/Allocator.SetDebugClientInfo 和
Node
的树。
通常,在汇总时,系统仅输出一行投诉 仅显示汇总失败的具体详细原因 几乎不需要周围的上下文。虽然这通常足以诊断问题 如果只进行了细微的更改并且一切正常,就会出现问题 在进行这项小更改之前 这通常不是特别有用 新的缓冲区集合。尤其是 更为复杂的节点树,涉及 fuchsia.sysmem2/BufferCollection.AttachToken、 fuchsia.sysmem2/BufferCollectionToken.SetDispensable、 fuchsia.sysmem2/BufferCollectionTokenGroup 节点以及 详细日志记录可能有助于诊断节点的 原因、为什么逻辑分配失败, 子树的失败时间早于预期。
额外记录的目的是为了能在演出中获得 这一假设,假设仅启用了详细日志记录功能 。如果不跟踪错误 我们不应发送此消息。
请求
<空>
SetWeak
设置当前 fuchsia.sysmem2/Node 和所有子级 Node
弱,这意味着客户端的 Node
客户端(或此消息后创建的子级)并不孤单
使分配的 VMO 保持活跃状态。
从安全系数低的“Node
”获取的所有 VMO 都是安全系数低的系统 VMO。另请参阅
close_weak_asap
。
系统只允许在Node
准备好以下数据之前发送此消息:
分配(否则,服务器使用 ZX_ERR_BAD_STATE
关闭通道):
BufferCollectionToken
:任何时间BufferCollection
:SetConstraints
之前BufferCollectionTokenGroup
:AllChildrenPresent
之前
目前,在就绪后,未从强Node
转换为弱Node
但客户端可以创建
在分配和设置该额外值之前,额外指定 Node
Node
转换为弱
Release
并关闭客户端强 Node
的客户端,但是
保留客户端的弱 Node
。
零强 Node
和零强 VMO 句柄将导致缓冲区
收集失败(所有 Node
个客户端都将看到
ZX_CHANNEL_PEER_CLOSED
以及全部 close_weak_asap
个client_end
将会
看到 ZX_EVENTPAIR_PEER_CLOSED
,但 sysmem(有意)不会注意到
这种情况,直到所有 Node
都做好分配准备。对于
才能成功分配,至少要存在一个强 Node
但在该客户端收到 VMO 句柄之后,
客户端可以 BufferCollection.Release
并关闭客户端,而不用
导致此类故障。
这也暗示了 fuchsia.sysmem2/Node.SetWeakOk,但不意味着
暗示 SetWeakOk
且 for_children_also
true,这可以发送
视情况进行单独调整。
请求
<空>
SetWeakOk
这可告知系统,客户端已准备好关注
close_weak_asap
。
如果发送,此邮件必须早于 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated。
所有使用弱 fuchsia.sysmem2/BufferCollection 的参与者都必须
请在 WaitForAllBuffersAllocated
之前发送此消息,或者让家长发送此消息
Node
必须发送 fuchsia.sysmem2/Node.SetWeakOk 以及
for_child_nodes_also
true,否则 WaitForAllBuffersAllocated
将
触发缓冲区收集失败。
此消息必不可少,因为系统并非总是
老客户没有意识到需要关注
close_weak_asap
个ZX_EVENTPAIR_PEER_CLOSED
并关闭所有剩余项
sysmem 弱 VMO 会尽快处理。收到此消息并要求
表明他们接受总体评分的这一方面,
因此会避免旧版客户端收到信号较弱的情况
VMO 无法让 sysmem 以任何方式使该 VMO 稍后快速关闭
(并且基于每个缓冲区)。
不处理 close_weak_asap
和也不处理的参与者
通过 WaitForAllBuffersAllocated
检索任何 VMO 句柄,不需要
发送 SetWeakOk
(不需要让父级发送 Node
)
SetWeakOk
与 for_child_nodes_also
为 true)。但是,如果
同一参与者有一个检索 VMO 的子项/委托,
子级/受托人需要提前发送 SetWeakOk
WaitForAllBuffersAllocated
。
- 请求
for_child_nodes_also
如果存在且 true,则表示直接 在此消息之后创建的该节点的子节点以及所有子节点 这些节点的后代的行为将如同SetWeakOk
这些节点在此节点之前创建的任何子节点 消息。此设置是“固定的” 不含此布尔值且设置为 true 的后续SetWeakOk
不会重置 服务器端布尔值。如果这会给参与者带来问题, 解决方法是对子级执行SetWeakOk
并将for_child_nodes_also
设为 true 令牌。参与者只能设置for_child_nodes_also
:如果参与者确实能够承诺 针对其自身较弱的 VMO 句柄,遵循close_weak_asap
,并且 参与者持有相应子节点的 VMO 句柄持有较弱的 VMO 句柄Node
。设置for_child_nodes_also
后,后代Node
使用 sysmem(1) 的容器可能较弱,尽管它们的客户端 sysmem1Node
无法通过任何直接方式连接到SetWeakOk
或任何 了解close_weak_asap
的直接方式。这仅适用于 使用 sysmem(1) 的此Node
的后代,而不是此 直接从 sysmem2 令牌转换为 sysmem(1) 时为Node
令牌,除非此Node
的祖先实体,否则会导致分配失败 指定的for_child_nodes_also
为 true。
请求
名称 | 类型 |
---|---|
payload |
NodeSetWeakOkRequest
|
同步
确保之前的邮件已在服务器端收到。这是 在之前有创建新令牌的消息之后, 因为在发送 将令牌发送给其他参与者。
对符合以下条件的令牌调用 fuchsia.sysmem2/BufferCollectionToken.Sync:
不是/不是有效令牌,可能会导致 Sync
永久停止。请参阅
fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken(单向)
降低恶意/仿冒攻击的可能性
fuchsia.sysmem2/BufferCollectionToken,需支付一次往返的费用。
另一种方法是将令牌传递给
fuchsia.sysmem2/Allocator/BindSharedCollection,该集合还会验证
作为交换
fuchsia.sysmem2/BufferCollection 渠道,以及
然后可以放心地使用 fuchsia.sysmem2/BufferCollection.Sync
出现卡顿。
创建一个或多个 fuchsia.sysmem2/BufferCollectionToken 后
然后启动并完成Sync
,就可以放心地将
BufferCollectionToken
客户端结束给知道
其他服务器在发送令牌时
发送到系统内存的
fuchsia.sysmem2/Allocator.BindSharedCollection 消息。这是一个
创建令牌的高效方法,同时避免不必要的往返。
其他选项包括等待每个
fuchsia.sysmem2/BufferCollectionToken.Duplicate 需要完成
单独调用(在每个后面单独调用 Sync
),或者调用
fuchsia.sysmem2/BufferCollection.Sync 令牌
已通过以下方式转换为BufferCollection
?
fuchsia.sysmem2/Allocator.BindSharedCollection 或使用
fuchsia.sysmem2/BufferCollectionToken.DuplicateSync,其中包含
可以一次创建多个令牌
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_Sync_Result
|
WaitForAllBuffersAllocated
等待所有缓冲区分配完毕。
此 FIDL 调用在缓冲区分配完成时或完成时完成 以及一些失败详情。
在分配缓冲区之前必须发生以下情况:
- 缓冲区的所有 fuchsia.sysmem2/BufferCollectionToken
必须通过
BindSharedCollection
上交,才能获取 fuchsia.sysmem2/BufferCollection(为简单起见,我们假设 未使用 fuchsia.sysmem2/BufferCollection.AttachToken), 或已发送 fuchsia.sysmem2/BufferCollectionToken.Release 。 - 缓冲区收集的所有 fuchsia.sysmem2/BufferCollection 必须具有 fuchsia.sysmem2/BufferCollection.SetConstraints 或者拥有 fuchsia.sysmem2/BufferCollection.Release 。
- 结果
buffer_collection_info
。VMO 处理 信息。
- 错误
[fuchsia.sysmem2/Error.NO_MEMORY]
请求有效, 无法完成。 - 错误
[fuchsia.sysmem2/Error.PROTOCOL_DEVIATION
] 请求 格式错误。 - 错误
[fuchsia.sysmem2/Error.CONSTRAINTS_INTERSECTION_EMPTY
] 请求有效但无法得到满足,可能是由于硬件 限制。如果参与者与 Google 员工不兼容, 约束条件(大致来说就是空的交集)。请参阅 。在参与者可能会受到治疗的情况下 (可选),请参阅 BufferCollectionTokenGroup。使用 fuchsia.sysmem2/BufferCollection.AttachToken,作为 如果既有缓冲区内又没有足够的缓冲区, 来满足附加的令牌设置的约束条件, 从附加的令牌派生的任何令牌子树。
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
BufferCollection_WaitForAllBuffersAllocated_Result
|
BufferCollectionToken
在 fuchsia.sysmem2/collection.fidl 中定义
fuchsia.sysmem2/BufferCollectionToken 不是缓冲区集合,但 而是一种识别特定的潜在共享缓冲区集合的方法, 以及将潜在的共享缓冲区集合分发到 额外参与者,然后再分配任意对象。 缓冲区。
此协议不使用墓碑。
我们为 BufferCollectionToken
使用通道,而不是单个通道
eventpair
(配对),因为这样我们可以检测出错误情况,例如
创建失败。
CreateBufferCollectionTokenGroup
在一组令牌(称为 fuchsia.sysmem2/BufferCollectionTokenGroup。
大多数系统内存客户端和许多参与者不需要关注这一点
消息或关于BufferCollectionTokenGroup
的内容。但在某些情况下
参与者想要添加一组受托人
但如果这些约束条件无法以这种方式成功组合,
会回退到一组不同的(可能重叠)委托
和/或采用要求较低的策略(就
fuchisa.sysmem2/BufferCollectionConstraints 的严格程度如何?
所有相关的受托人参与测试)。在这种情况下,
BufferCollectionTokenGroup
非常有用。
BufferCollectionTokenGroup
用于创建 N 的 1 或 N
子级 fuchsia.sysmem2/BufferCollectionToken。子令牌
在聚合过程中未选择的选项将失败(关闭),
潜在参与者应该注意自己的BufferCollection
通道客户端端点看到 PEER_CLOSED,从而允许参与者
清理最终没有发生的推测性使用行为(这是
类似于正常的 BufferCollection
服务器端在失败时关闭
分配逻辑缓冲区集合,或之后缓冲区异步失败
集合)。
请参阅关于 BufferCollectionTokenGroup
协议的注释。
任何rights_attenuation_mask
或AttachToken
/SetDispensable
只需编写一个
BufferCollectionToken
作为
BufferCollectionTokenGroup
。
目前,所有表字段均为必填字段。
- 请求
group_request
请求的服务器端BufferCollectionTokenGroup
个频道。
请求
名称 | 类型 |
---|---|
payload |
BufferCollectionTokenCreateBufferCollectionTokenGroupRequest
|
复制
在此基础上创建一个额外的 fuchsia.sysmem2/BufferCollectionToken 一个,表示同一个缓冲区集合。
创建的令牌是该令牌的 fuchsia.sysmem2/节点层次结构。
此方法可用于添加参与者,方法是转移新的 将创建的令牌发送给其他参与者。
可以使用此单向消息来代替双向消息 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync FIDL 调用 您并不希望等待这些实例 要响应的系统 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync,或者 客户端代码的结构不健全,因此无法轻松复制所有必要的 一次性令牌。
在发送一条或多条 Duplicate
消息之后、发送
将新创建的子令牌提供给其他参与者(或其他参与者),
fuchsia.sysmem2/Allocator 通道进行连接),客户端必须发送
fuchsia.sysmem2/Node.Sync 并等待 Sync
响应。通过
可以对令牌或 BufferCollection
进行 Sync
调用
(通过将此令牌传递给 BindSharedCollection
获得)。两者
确保服务器知道通过 Duplicate
创建的令牌
其他参与者通过单独的命令将令牌发送到服务器之前,
Allocator
频道。
所有令牌都必须通过
fuchsia.sysmem2/Allocator.BindSharedCollection 或
fuchsia.sysmem2/Node.Release(对于 BufferCollection
)
成功分配缓冲区。
目前,所有表字段均为必填字段。
- 请求
rights_attenuation_mask
中 可通过 客户端结束token_request
。这样,发起者或 以表明 受托人。这不允许参与者获得权利 应用。值ZX_RIGHT_SAME_RIGHTS
用于指定 。- 以下为 Rights_attenuation_mask 值不会导致衰减:
<ph type="x-smartling-placeholder">
- </ph>
ZX_RIGHT_SAME_RIGHTS
(首选)- 0xFFFFFFFF(如果衰减掩码 计算)
- 0(已弃用 - 请勿使用 0 - 错误会记录到日志)
- 以下为 Rights_attenuation_mask 值不会导致衰减:
<ph type="x-smartling-placeholder">
- 请求
token_request
是BufferCollectionToken
的服务器端 。此渠道的客户端是 共享缓冲区集合。
请求
名称 | 类型 |
---|---|
payload |
BufferCollectionTokenDuplicateRequest
|
DuplicateSync
据此创建其他 fuchsia.sysmem2/BufferCollectionToken 一个,表示同一个缓冲区集合。
创建的令牌在 fuchsia.sysmem2/节点层次结构。
此方法可用于添加更多参与者,方法是将 将新创建的令牌发送给其他参与者。
系统将为
rights_attenuation_masks
数组。
如果由于请求原因,调用的令牌实际上可能不是有效令牌, 可能是恶意/不可信的令牌提供商,请考虑使用 fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken 而不是在发生问题时 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync 始终不会响应 因为调用令牌不是真实令牌。
与 fuchsia.sysmem2/BufferCollectionToken.Duplicate 相反,没有 调用该方法后,需要单独的 fuchsia.sysmem2/Node.Sync 方法,因为同步步骤包含在此调用中,代价是 在此次通话期间往返。
必须通过
fuchsia.sysmem2/Allocator.BindSharedCollection 或
fuchsia.sysmem2/Node.Release(对于 BufferCollection
)
成功分配缓冲区(或在
包含
fuchsia.sysmem2/BufferCollectionToken.AttachToken。
目前,所有表字段均为必填字段。
- 请求
rights_attenuation_mask
。在rights_attenuation_masks
,则不存在 0 的权利位 缓冲区 VMO 权利(可通过相应的返回内容获取) 令牌。这样,发起者或中间参与者可以 会削弱参与者的权利。因此,不允许 获得该参与者所不具备的权利。 值ZX_RIGHT_SAME_RIGHTS
可用于指定 因此应该应用弱音
- 响应
tokens
每个新创建的令牌的客户端结束。
请求
名称 | 类型 |
---|---|
payload |
BufferCollectionTokenDuplicateSyncRequest
|
响应
名称 | 类型 |
---|---|
payload |
BufferCollectionToken_DuplicateSync_Result
|
GetBufferCollectionId
获取缓冲区集合 ID。此 ID 也可从
fuchsia.sysmem2/Allocator.GetVmoInfo(以及 buffer_index
)
)。
此通话主要在以下情形下非常有用:
fuchsia.sysmem2/BufferCollectionToken 或
fuchsia.sysmem2/BufferCollection,但只能传输 VMO
句柄,该句柄可与 BufferCollection
客户端端重新联接起来
通过其他路径创建的 ID。更希望通过
BufferCollectionToken
或 BufferCollection
(如果可行)。
信任 sysmem 以外的来源的 buffer_collection_id
值
类似于信任锆石之外的其他来源的 Koid 值。
除非确实有必要,否则都应该避免同时使用这两种方法,并且都要求
注意。在某些情况下,引用
BufferCollection
由buffer_collection_id
通过
但传入的值声称
仅凭 buffer_collection_id
不足以证明授予
buffer_collection_id
任意功能的发送端。发件人必须
先向接收者证明发送者有/有 VMO,或者有/有
BufferCollectionToken
。
sysmem 确认是否是有效的 sysmem 句柄,以及哪个 sysmem 映射到
buffer_collection_id
值。接收方应小心避免
假设发送者有 BufferCollectionToken
,且
因为发送方仅能证明其有 VMO。
- 响应
buffer_collection_id
此 ID 在每个缓冲区中是唯一的 每次启动时收集。每个缓冲区均由 同时使用buffer_collection_id
和buffer_index
。
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_GetBufferCollectionId_Result
|
GetNodeRef
这会获取一个句柄
在任何设备上调用 fuchsia.sysmem2/Node.IsAlternateFor
fuchsia.sysmem2/Node。此标识名仅用于证明
客户端已从此 Node
获取此标识名。
由于这是 get 设置,因此没有 fuchsia.sysmem2/Node.Sync
GetNodeRef
与 IsAlternateFor
调用之间所需的函数,
尽管这两个调用通常在不同的渠道上进行,
另请参阅 fuchsia.sysmem2/Node.IsAlternateFor。
目前,所有表字段均为必填字段。
- 响应
node_ref
此句柄可通过IsAlternateFor
不同的Node
频道,用于证明客户端获得了标识名 来自此Node
。
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_GetNodeRef_Result
|
IsAlternateFor
检查调用方 fuchsia.sysmem2/Node 是否在子树中
根植于共同父标记的不同子标记
fuchsia.sysmem2/BufferCollectionTokenGroup
传入 node_ref
。
此通话用于协助执行准入控制去重,以及 以及调试。
node_ref
必须使用
fuchsia.sysmem2/Node.GetNodeRef。
node_ref
可以是重复的句柄;因此无需调用
每次调用 fuchsia.sysmem2/Node.IsAlternateFor 时返回 GetNodeRef
。
如果调用令牌由于
可能是恶意/不受信任的令牌提供程序,调用
fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken
而不是在发生 IsAlternateFor
时无限期卡住
由于调用令牌不是真正的令牌(并非真正的令牌),
与 sysmem 通信)。另一种方法是
fuchsia.sysmem2/Allocator.BindSharedCollection 中包含此令牌
这也会验证令牌并将其转换为
fuchsia.sysmem2/BufferCollection,然后调用 IsAlternateFor
。
目前,所有表字段均为必填字段。
- 回答
is_alternate
<ph type="x-smartling-placeholder">- </ph>
- true:调用节点和
node_ref
Node
是一个BufferCollectionTokenGroup
。这意味着 发起调用的Node
和node_ref
Node
不会同时具有两者 其约束条件适用,而 sysmem 会选择其中一种 约束条件 - 不能两者都选。这是因为 在逻辑期间选择了BufferCollectionTokenGroup
并且只有一个子树的子树促成 约束汇总。 - false:调用方
Node
之间共有的第一个父节点 并且node_ref
Node
不是BufferCollectionTokenGroup
。 目前,这意味着共同的第一个父节点是BufferCollectionToken
或BufferCollection
(无论是否为Release
ed)。这意味着,调用的Node
和node_ref
Node
在约束条件期间可能同时应用这两个约束条件 逻辑分配的聚合(如果两个Node
都符合) 由所涉及的任何父级BufferCollectionTokenGroup
选择。在 在此示例中,没有任何BufferCollectionTokenGroup
可 直接阻止两个Node
同时被选中并 它们的约束条件都已汇总,但即使值为 false,也可以将其中一个或两个都汇总 如果其中有一项或两项,Node
仍有可能被排除在考虑范围外Node
有直接或间接父级BufferCollectionTokenGroup
,用于选择另一个子子树 与包含调用Node
或node_ref
Node
的子树相比。
- true:调用节点和
- 错误
[fuchsia.sysmem2/Error.NOT_FOUND]
node_ref 不是 与调用Node
的缓冲区集合相关联。 导致此错误的另一个原因是,如果node_ref
是 zx.Handle.EVENT 处理具有足够的权限,但实际上并不是 从GetNodeRef
获得的实node_ref
。 - 错误
[fuchsia.sysmem2/Error.PROTOCOL_DEVIATION]
调用方传递了node_ref
不是 zx.Handle:EVENT 句柄,或者不是 所需的权利。node_ref
- 此调用不会返回其他失败的状态代码。不过, sysmem 将来可能会添加其他代码,因此客户端应该 对任何失败的状态代码进行合理的默认处理。
请求
名称 | 类型 |
---|---|
payload |
NodeIsAlternateForRequest
|
响应
名称 | 类型 |
---|---|
payload |
Node_IsAlternateFor_Result
|
版本
在 fuchsia.sysmem2/BufferCollectionToken 通道上:
通常,参与者会将 BufferCollectionToken
转换为
fuchsia.sysmem2/BufferCollection,但参与者可以改为发送
Release
(然后立即关闭渠道,或者
稍后响应服务器关闭服务器端),
以免导致缓冲区收集失败。如果没有之前的 Release
,
关闭 BufferCollectionToken
客户端会导致缓冲
收集失败。
在 fuchsia.sysmem2/BufferCollection 通道上:
默认情况下,服务器会处理
fuchsia.sysmem2/BufferCollection 客户端端(不含 Release
)
首先)使缓冲区收集失败。在一定程度上是为了加快
当有任何参与者失败时,关闭 VMO 句柄以回收内存。如果
参与者想要在没有BufferCollection
导致缓冲区收集失败,参与者可以发送 Release
然后再关闭 BufferCollection
客户端。Release
可以
发生在 SetConstraints
之前或之后。如果早于 SetConstraints
,
缓冲区收集不需要此节点的约束即可
分配。如果晚于 SetConstraints
,系统会保留约束条件,
尽管在 BufferCollection
约束汇总时间。
在 fuchsia.sysmem2/BufferCollectionTokenGroup 通道上:
默认情况下,BufferCollectionTokenGroup
客户端意外关闭
end(先没有 Release
)会导致缓冲区故障
。在不采用任何规则的情况下关闭 BufferCollectionTokenGroup
渠道
缓冲区收集失败,请确保已对 AllChildrenPresent() 执行
已发送,并在关闭BufferCollectionTokenGroup
前发送 Release
客户端。
如果 Release
出现于
[fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of
释放without prior
AllChildrenPresent). This is intentionally not analogous to how <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.Release'>BufferCollection.Release</a> without <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.SetConstraints'>BufferCollection.SetConstraints</a> first doesn't cause buffer collection failure. For a
BufferCollectionTokenGroup, clean close requires
AllChildrenPresent(if not already sent), then
Release`,然后关闭客户端。
如果 Release
发生在 AllChildrenPresent
之后,则子项和所有
其约束条件保持不变(就像如果
BufferCollectionTokenGroup
渠道仍保持打开状态),且客户端
结束关闭不会导致缓冲区收集失败。
在所有 fuchsia.sysmem2/Node 通道上(上述任何一种):
为简单起见,上文中针对每频道协议的段落会忽略
一个单独的故障域
fuchsia.sysmem2/BufferCollectionToken.SetDispensable 或
fuchsia.sysmem2/BufferCollection.AttachToken。当客户端结束
意外关闭(没有先 Release
),且客户端是
而不是使整个缓冲区收集失败
表示故障域失败,但缓冲区收集本身
与故障域故障隔离开来此类故障域
嵌套,在这种情况下,只有最内层的故障域
Node
驻留失败。
请求
<空>
SetDebugClientInfo
将有关 sysmem 可以使用的当前客户端的信息设置为 帮助诊断泄漏的内存和等待 发送 fuchsia.sysmem2/BufferCollection.SetConstraints。
这会在此 fuchsia.sysmem2/Node 和所有节点上设置调试客户端信息。
Node
派生自此Node
,除非被
fuchsia.sysmem2/Allocator.SetDebugClientInfo 或更高版本
fuchsia.sysmem2/Node.SetDebugClientInfo。
发送 fuchsia.sysmem2/Allocator.SetDebugClientInfo 一次
Allocator
是确保所有
fuchsia.sysmem2/节点将至少包含一些调试客户端信息
而且比单独发送相同的调试信息更高效
通过 fuchsia.sysmem2/Node.SetDebugClientInfo 获取每个客户端信息
已创建 fuchsia.sysmem2/Node。
也在启用详细日志记录功能(请参阅 SetVerboseLogging
)时使用,用于
指明哪个客户最先关闭其渠道,从而转到子树
失败(如果子树的用途已过,这是正常现象,但
如果发生时间早于预期,则客户端渠道专用名称
帮助诊断故障最初来自何处
)。
目前,所有表字段均为必填字段。
- 请求
name
,可以是任意字符串,但当前 进程名称(请参阅fsl::GetCurrentProcessName
)是一个很好的默认值。 - 请求
id
这可以是任意 ID,也可以是当前的进程 ID (请参阅fsl::GetCurrentProcessKoid
)是一个很好的默认值。
请求
名称 | 类型 |
---|---|
payload |
NodeSetDebugClientInfoRequest
|
SetDebugTimeoutLogDeadline
如果未检测到 sysmem,系统会记录警告 所有客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints 。
客户端可以调用此方法来更改输出日志的时间。如果 多个客户端设置了截止时间,但未指定哪个截止期限 生效。
在大多数情况下,使用默认值即可。
目前,所有表字段均为必填字段。
- 请求
deadline
:系统内存开始尝试记录日志的时间 除非那时所有限制条件都与 sysmem 相关,否则系统会返回该警告。
请求
名称 | 类型 |
---|---|
payload |
NodeSetDebugTimeoutLogDeadlineRequest
|
SetDispensable
将此 fuchsia.sysmem2/BufferCollectionToken 设置为可不需。
当 BufferCollectionToken
转换为
fuchsia.sysmem2/BufferCollection,但这种可粉的状态适用于
BufferCollection
。
通常,如果客户端关闭 fuchsia.sysmem2/BufferCollection
而无需发送
fuchsia.sysmem2/BufferCollection.Release 先是
BufferCollection
fuchisa.sysmem2/Node 将会失败,这也会
将失败传播到父级 fuchsia.sysmem2/Node,依此类推
到根 Node
,这会导致整个缓冲区收集失败。在
相比之下,在分配缓冲区后,可分配的 Node
可能会失败
而不会导致 fuchsia.sysmem2/Node 中的父级出现故障
层次结构。
可省略的 Node
会参与约束条件汇总
与父实体相关联。如果可饮用Node
在分配缓冲区之前失败,此故障将传播到
Node
的父级。
分配缓冲区后,可消耗的 Node
(或任何
可饮用 Node
的子级)不会传播到可饮用的茶饮料
Node
的家长。失败会从
将纸张 Node
转换为纸张 Node
。孩子失败是
如果使用
fuchsia.sysmem2/BufferCollection.AttachToken,或者如果子级是
且失败发生在分配之后。
如果参与者需要这样做,可以使用非必要的 Node
。
提供约束条件,但在分配缓冲区后,参与者
可以失败,而不会导致父级缓冲区收集失败
Node
的观点。
相比之下,BufferCollection.AttachToken
可用于创建
BufferCollectionToken
,即未参与约束条件
与其父级 Node
进行聚合,并且其在任何时候都会失败
不会传播到其父级 Node
,并且其可能的延迟
约束条件不会阻止父级 Node
完成其
缓冲区分配。
发起者(根资源Node
的创建者,使用
fuchsia.sysmem2/Allocator.AllocateSharedCollection)中
场景选择首先使用可消耗的 Node
。
之后,如果该参与者的第一个实例
该参与者失败后,系统会将该参与者的第二个新实例提供给我
使用 AttachToken
创建的 BufferCollectionToken
。
通常,客户端会在 BufferCollectionToken
上执行 SetDispensable
操作
将可饮用的BufferCollectionToken
发送给
受托人。由于 SetDispensable
会阻止传播
子级 Node
未能映射到父级 Node
(如果客户端依赖于
根据Node
客户端,可能需要改为通过其他方式发现故障。
如果其他方式不可用/不方便,客户可以改为
保留可分配的 Node
并在其下创建一个子级 Node
,
发送给受托参与者,保留此 Node
以便
通过此 Node
的根在此 Node
处的子树会发现故障
ZX_CHANNEL_PEER_CLOSED 信号,并采取适当的措施
(例如,启动受托人的新实例并递给它
BufferCollectionToken
(使用
fuchsia.sysmem2/BufferCollection.AttachToken,或传播失败
并以客户特定的方式进行清理)。
虽然可以在一个网页上SetDispensable
BufferCollectionTokenGroup
Node
的直接子项,则无法
替换掉原来直接子代故障的Node
使用 AttachToken
创建带有新令牌的 BufferCollectionTokenGroup
(因为组没有 AttachToken
)。相反,要启用
在本例中,AttachToken
替换,请再创建一个
作为该组的直接子项的非必需令牌,
现有可分配的令牌是额外令牌的子令牌。这样,
作为组的直接子项的额外令牌具有
BufferCollection.AttachToken
,可用于替换失败的
一次性令牌。
对已经不可取的令牌的 SetDispensable
具有幂等性。
请求
<空>
SetName
为此缓冲区集合中的 VMO 设置名称。
如果名称在 ZX_MAX_NAME_LEN 中容纳不下,vmo 本身的名称 将被截断为适合大小。vmo 的名称将以 集合中的缓冲区索引(如果后缀适合放在 ZX_MAX_NAME_LEN).此处指定的名称(不截断)将 。
名称只会影响设置名称后分配的 VMO;这场通话 不会重命名现有 VMO。如果多个客户设置了不同的名称 则较大的优先级值将胜出使用 与先前名称相同优先级不会更改名称。
目前,所有表字段均为必填字段。
- 请求
priority
。仅当这是第一个SetName
时,才会设置名称 或者如果priority
大于任何之前priority
的值 此缓冲区集合的所有Node
之前的SetName
调用。 - request
name
在此缓冲区集合下创建的 VMO 的名称。
请求
名称 | 类型 |
---|---|
payload |
NodeSetNameRequest
|
SetVerboseLogging
这会为缓冲区收集启用详细日志记录功能。
详细日志记录包括通过
每个客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints
以及通过 fuchsia.sysmem2/Node.SetDebugClientInfo(或
fuchsia.sysmem2/Allocator.SetDebugClientInfo 和
Node
的树。
通常,在汇总时,系统仅输出一行投诉 仅显示汇总失败的具体详细原因 几乎不需要周围的上下文。虽然这通常足以诊断问题 如果只进行了细微的更改并且一切正常,就会出现问题 在进行这项小更改之前 这通常不是特别有用 新的缓冲区集合。尤其是 更为复杂的节点树,涉及 fuchsia.sysmem2/BufferCollection.AttachToken、 fuchsia.sysmem2/BufferCollectionToken.SetDispensable、 fuchsia.sysmem2/BufferCollectionTokenGroup 节点以及 详细日志记录可能有助于诊断节点的 原因、为什么逻辑分配失败, 子树的失败时间早于预期。
额外记录的目的是为了能在演出中获得 这一假设,假设仅启用了详细日志记录功能 。如果不跟踪错误 我们不应发送此消息。
请求
<空>
SetWeak
设置当前 fuchsia.sysmem2/Node 和所有子级 Node
弱,这意味着客户端的 Node
客户端(或此消息后创建的子级)并不孤单
使分配的 VMO 保持活跃状态。
从安全系数低的“Node
”获取的所有 VMO 都是安全系数低的系统 VMO。另请参阅
close_weak_asap
。
系统只允许在Node
准备好以下数据之前发送此消息:
分配(否则,服务器使用 ZX_ERR_BAD_STATE
关闭通道):
BufferCollectionToken
:任何时间BufferCollection
:SetConstraints
之前BufferCollectionTokenGroup
:AllChildrenPresent
之前
目前,在就绪后,未从强Node
转换为弱Node
但客户端可以创建
在分配和设置该额外值之前,额外指定 Node
Node
转换为弱
Release
并关闭客户端强 Node
的客户端,但是
保留客户端的弱 Node
。
零强 Node
和零强 VMO 句柄将导致缓冲区
收集失败(所有 Node
个客户端都将看到
ZX_CHANNEL_PEER_CLOSED
以及全部 close_weak_asap
个client_end
将会
看到 ZX_EVENTPAIR_PEER_CLOSED
,但 sysmem(有意)不会注意到
这种情况,直到所有 Node
都做好分配准备。对于
才能成功分配,至少要存在一个强 Node
但在该客户端收到 VMO 句柄之后,
客户端可以 BufferCollection.Release
并关闭客户端,而不用
导致此类故障。
这也暗示了 fuchsia.sysmem2/Node.SetWeakOk,但不意味着
暗示 SetWeakOk
且 for_children_also
true,这可以发送
视情况进行单独调整。
请求
<空>
SetWeakOk
这可告知系统,客户端已准备好关注
close_weak_asap
。
如果发送,此邮件必须早于 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated。
所有使用弱 fuchsia.sysmem2/BufferCollection 的参与者都必须
请在 WaitForAllBuffersAllocated
之前发送此消息,或者让家长发送此消息
Node
必须发送 fuchsia.sysmem2/Node.SetWeakOk 以及
for_child_nodes_also
true,否则 WaitForAllBuffersAllocated
将
触发缓冲区收集失败。
此消息必不可少,因为系统并非总是
老客户没有意识到需要关注
close_weak_asap
个ZX_EVENTPAIR_PEER_CLOSED
并关闭所有剩余项
sysmem 弱 VMO 会尽快处理。收到此消息并要求
表明他们接受总体评分的这一方面,
因此会避免旧版客户端收到信号较弱的情况
VMO 无法让 sysmem 以任何方式使该 VMO 稍后快速关闭
(并且基于每个缓冲区)。
不处理 close_weak_asap
和也不处理的参与者
通过 WaitForAllBuffersAllocated
检索任何 VMO 句柄,不需要
发送 SetWeakOk
(不需要让父级发送 Node
)
SetWeakOk
与 for_child_nodes_also
为 true)。但是,如果
同一参与者有一个检索 VMO 的子项/委托,
子级/受托人需要提前发送 SetWeakOk
WaitForAllBuffersAllocated
。
- 请求
for_child_nodes_also
如果存在且 true,则表示直接 在此消息之后创建的该节点的子节点以及所有子节点 这些节点的后代的行为将如同SetWeakOk
这些节点在此节点之前创建的任何子节点 消息。此设置是“固定的” 不含此布尔值且设置为 true 的后续SetWeakOk
不会重置 服务器端布尔值。如果这会给参与者带来问题, 解决方法是对子级执行SetWeakOk
并将for_child_nodes_also
设为 true 令牌。参与者只能设置for_child_nodes_also
:如果参与者确实能够承诺 针对其自身较弱的 VMO 句柄,遵循close_weak_asap
,并且 参与者持有相应子节点的 VMO 句柄持有较弱的 VMO 句柄Node
。设置for_child_nodes_also
后,后代Node
使用 sysmem(1) 的容器可能较弱,尽管它们的客户端 sysmem1Node
无法通过任何直接方式连接到SetWeakOk
或任何 了解close_weak_asap
的直接方式。这仅适用于 使用 sysmem(1) 的此Node
的后代,而不是此 直接从 sysmem2 令牌转换为 sysmem(1) 时为Node
令牌,除非此Node
的祖先实体,否则会导致分配失败 指定的for_child_nodes_also
为 true。
请求
名称 | 类型 |
---|---|
payload |
NodeSetWeakOkRequest
|
同步
确保之前的邮件已在服务器端收到。这是 在之前有创建新令牌的消息之后, 因为在发送 将令牌发送给其他参与者。
对符合以下条件的令牌调用 fuchsia.sysmem2/BufferCollectionToken.Sync:
不是/不是有效令牌,可能会导致 Sync
永久停止。请参阅
fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken(单向)
降低恶意/仿冒攻击的可能性
fuchsia.sysmem2/BufferCollectionToken,需支付一次往返的费用。
另一种方法是将令牌传递给
fuchsia.sysmem2/Allocator/BindSharedCollection,该集合还会验证
作为交换
fuchsia.sysmem2/BufferCollection 渠道,以及
然后可以放心地使用 fuchsia.sysmem2/BufferCollection.Sync
出现卡顿。
创建一个或多个 fuchsia.sysmem2/BufferCollectionToken 后
然后启动并完成Sync
,就可以放心地将
BufferCollectionToken
客户端结束给知道
其他服务器在发送令牌时
发送到系统内存的
fuchsia.sysmem2/Allocator.BindSharedCollection 消息。这是一个
创建令牌的高效方法,同时避免不必要的往返。
其他选项包括等待每个
fuchsia.sysmem2/BufferCollectionToken.Duplicate 需要完成
单独调用(在每个后面单独调用 Sync
),或者调用
fuchsia.sysmem2/BufferCollection.Sync 令牌
已通过以下方式转换为BufferCollection
?
fuchsia.sysmem2/Allocator.BindSharedCollection 或使用
fuchsia.sysmem2/BufferCollectionToken.DuplicateSync,其中包含
可以一次创建多个令牌
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_Sync_Result
|
BufferCollectionTokenGroup
在 fuchsia.sysmem2/collection.fidl 中定义
系统内存实现与 分配 / 逻辑分配如下所示:
与往常一样,逻辑分配会考虑根节点以及所有具有
不传输 fuchsia.sysmem2/Node 的根连接
使用 fuchsia.sysmem2/BufferCollection.AttachToken 或子树创建
源于与以下账号相关联的 AttachToken
Node
和所有 Node
不传输另一个 AttachToken
的子树。这称为
剪枝的逻辑分配子树,简称剪枝的子树。
在约束汇总期间,每个
fuchsia.sysmem2/BufferCollectionTokenGroup 将选择单个子级
Node
。其余子元素将对
逻辑分配失败,而所选子级可能会成功。
如果总BufferCollectionTokenGroup
剪枝的逻辑分配子树,两个组之间的相对优先级
相当于它们在树的 DFS 预订单迭代中的排序,
父项的优先级高于子项,而左子项的优先级高于子项
优先级高于右侧子级。
选择某个组的特定子级时(无论是临时在 约束汇总尝试,或作为最终选择), 如果未选择群组的其他子项,则会“隐藏”任何其他群组 未选中的子项下。
在逻辑分配中,首先尝试通过临时 选择优先级最高的群组的子级 0,然后选择下一个优先级最高的子级 0 不会因临时选择而隐藏的最高优先级群组 远等
如果该汇总尝试失败,则系统将尝试对 所有相同组(除最低优先级的非隐藏组外)的序数 0 子项 组将暂时选择其序数 1 的子项(然后选择子项 2) 等等)。如果将优先级最低的新群组取消隐藏为临时群组 选择会更新,新取消隐藏的最低优先级群组 在更改临时选择之前,按顺序考虑其子项 之前优先级最低的群组中就结果而言 到系统化枚举 中所有可能的选择组合, 类似计数的顺序最频繁地更新优先级最低的群体, 优先级最高的群组出现的频率最低。我们并不实际尝试 我们可以跳过组合, 是多余的/等效的,因为它们会在不对结果进行任何更改的情况下隐藏。
尝试对枚举的非等效组合进行约束聚合
的选择以这种方式继续,直到 (a) 所有汇总尝试
失败,在这种情况下,整个逻辑分配会失败,或者 (b) 直到
尝试的汇总成功,此时会分配缓冲区(如果需要;
如果这是根位于整体根 Node
的已剪枝子树,则其值为
已尝试一次。如果基于第一个成功的缓冲区分配
约束聚合失败,则整个逻辑分配会失败(
没有缓冲区分配重试 / 重试)。如果缓冲区分配成功
(或者由于是经过剪除的子树,不包含
root),则逻辑分配会成功。
如果这个优先级方案无法合理地用于 系统管理人员,请随时与系统管理人员联系,讨论 从而轻松实现目标
请避免为每个网页创建大量BufferCollectionTokenGroup
逻辑分配,尤其是在总子项数量较多的情况下,以及
尤其是在合理预期聚合时,
使用序数 0 的子节点失败,之后的子节点可能也会失败。
系统可以降低评估过多项所需的高时间复杂性
在过多的组中选择子项组合/选择,只是简单地失败
超出某个(相当高,但不算大)最大数值的逻辑分配
一组经过考虑的组子级组合/选择。更高级(以及更多
(复杂),但预计缓解措施实际上没有必要;
值得增加的复杂性。如果最大限额为
或者如果您预计它会受到攻击
选项。
最好在一个文件中使用多个 fuchsia.sysmem2/ImageFormatConstraints
单个 fuchsia.sysmem2/BufferCollectionConstraints(如果可行,
参与者只需表达与
单个 fuchsia.images2/PixelFormat,通过系统内存来选择
PixelFormat
供所有参与者支持的工具使用)。
类似于 fuchsia.sysmem2/BufferCollectionToken 和
fuchsia.sysmem2/BufferCollection,
BufferCollectionTokenGroup
个频道,但不发送
先调用 fuchsia.sysmem2/Node.Release 会导致缓冲区收集失败
(如果使用
fuchsia.sysmem2/BufferCollectionToken.SetDispensable 或
fuchsia.sysmem2/BufferCollection.AttachToken 和
BufferCollectionTokenGroup
属于某个节点下的子树,
不会将失败传播到其父级)。
此协议不使用墓碑。
AllChildrenPresent
表示将不再创建子项。
创建完所有子节点后,客户端应发送 fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent 向 通知 sysmem 不会再创建子项,这样 sysmem 可以 知道何时开始聚合约束条件。
不允许在 AllChildrenPresent 之后发送 CreateChild;这将 失败群组的子树并关闭连接。
如果要发送 fuchsia.sysmem2/Node.Release,也应发送
在 AllChildrenPresent
之后,否则该组的子树将失败
触发。我们故意这样做,这与未使用 Release
的
之前的 fuchsia.sysmem2/BufferCollection.SetConstraints 不会导致
子树故障。
请求
<空>
CreateChild
创建一个子级 fuchsia.sysmem2/BufferCollectionToken。只有一个孩子 (包括其子项)在分配期间将被选中(或 分配)。
在将此令牌的客户端传递给
fuchsia.sysmem2/Allocator.BindSharedCollection,完成
fuchsia.sysmem2/Node.Sync 之后
必须提供 fuchsia.sysmem2/BufferCollectionTokenGroup.CreateChild。
或者,客户端可以使用
fuchsia.sysmem2/BufferCollectionTokenGroup.CreateChildrenSync
实质上包含 Sync
。
不允许在 AllChildrenPresent 之后发送 CreateChild;这将 失败群组的子树并关闭连接。
创建完所有子项后,发送 AllChildrenPresent。
- 请求
token_request
新令牌通道的服务器端。 - 请求
rights_attenuation_mask
如果 ZX_RIGHT_SAME_RIGHTS,则创建的 令牌让持有者获得与原先的 父令牌。如果值不是 ZX_RIGHT_SAME_RIGHTS,值被解释为具有 0 的位掩码 位确保相应权利已得到关注,因此 0xFFFFFFFF 只是 代表 ZX_RIGHT_SAME_RIGHTS。系统特意不允许使用值 0 会导致子树故障。
请求
名称 | 类型 |
---|---|
payload |
BufferCollectionTokenGroupCreateChildRequest
|
CreateChildrenSync
一次同步创建 1 个或多个子令牌。与此相反, fuchsia.sysmem2/BufferCollectionTokenGroup.CreateChild,否 在将客户端传递至客户端之前,必须指定 fuchsia.sysmem2/Node.Sync 传递给 fuchsia.sysmem2/Allocator/BindSharedCollection。
索引较低的子令牌的优先级高于(尝试更快) 索引较高的子词元。
按照所有子令牌,成功的聚合将仅选择一个子令牌 在所有已创建的儿童中 可能会多次调用 fuchsia.sysmem2/BufferCollectionTokenGroup.CreateChild 和 fuchsia.sysmem2/BufferCollectionTokenGroup.CreateChildrenSync)。
每个群组允许的儿童总数上限 整个树中(从根节点开始)的节点数量设有上限 无法通过这些协议进行配置
不允许在 AllChildrenPresent 之后发送 CreateChildrenSync; 这样会使该组的子树失败并关闭连接。
创建完所有子项后,发送 AllChildrenPresent。
- 请求
rights_attentuation_masks
。rights_attentuation_masks
确定创建的子项数量 词元。值 ZX_RIGHT_SAME_RIGHTS 不会削弱任何权利。 值 0xFFFFFFFF 是 ZX_RIGHT_SAME_RIGHTS 的同义词。不限 另一个值,掩码中的每个 0 位都会削弱该右侧对应的值。
- 响应
tokens
创建的子令牌。
请求
名称 | 类型 |
---|---|
payload |
BufferCollectionTokenGroupCreateChildrenSyncRequest
|
响应
名称 | 类型 |
---|---|
payload |
BufferCollectionTokenGroup_CreateChildrenSync_Result
|
GetBufferCollectionId
获取缓冲区集合 ID。此 ID 也可从
fuchsia.sysmem2/Allocator.GetVmoInfo(以及 buffer_index
)
)。
此通话主要在以下情形下非常有用:
fuchsia.sysmem2/BufferCollectionToken 或
fuchsia.sysmem2/BufferCollection,但只能传输 VMO
句柄,该句柄可与 BufferCollection
客户端端重新联接起来
通过其他路径创建的 ID。更希望通过
BufferCollectionToken
或 BufferCollection
(如果可行)。
信任 sysmem 以外的来源的 buffer_collection_id
值
类似于信任锆石之外的其他来源的 Koid 值。
除非确实有必要,否则都应该避免同时使用这两种方法,并且都要求
注意。在某些情况下,引用
BufferCollection
由buffer_collection_id
通过
但传入的值声称
仅凭 buffer_collection_id
不足以证明授予
buffer_collection_id
任意功能的发送端。发件人必须
先向接收者证明发送者有/有 VMO,或者有/有
BufferCollectionToken
。
sysmem 确认是否是有效的 sysmem 句柄,以及哪个 sysmem 映射到
buffer_collection_id
值。接收方应小心避免
假设发送者有 BufferCollectionToken
,且
因为发送方仅能证明其有 VMO。
- 响应
buffer_collection_id
此 ID 在每个缓冲区中是唯一的 每次启动时收集。每个缓冲区均由 同时使用buffer_collection_id
和buffer_index
。
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_GetBufferCollectionId_Result
|
GetNodeRef
这会获取一个句柄
在任何设备上调用 fuchsia.sysmem2/Node.IsAlternateFor
fuchsia.sysmem2/Node。此标识名仅用于证明
客户端已从此 Node
获取此标识名。
由于这是 get 设置,因此没有 fuchsia.sysmem2/Node.Sync
GetNodeRef
与 IsAlternateFor
调用之间所需的函数,
尽管这两个调用通常在不同的渠道上进行,
另请参阅 fuchsia.sysmem2/Node.IsAlternateFor。
目前,所有表字段均为必填字段。
- 响应
node_ref
此句柄可通过IsAlternateFor
不同的Node
频道,用于证明客户端获得了标识名 来自此Node
。
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_GetNodeRef_Result
|
IsAlternateFor
检查调用方 fuchsia.sysmem2/Node 是否在子树中
根植于共同父标记的不同子标记
fuchsia.sysmem2/BufferCollectionTokenGroup
传入 node_ref
。
此通话用于协助执行准入控制去重,以及 以及调试。
node_ref
必须使用
fuchsia.sysmem2/Node.GetNodeRef。
node_ref
可以是重复的句柄;因此无需调用
每次调用 fuchsia.sysmem2/Node.IsAlternateFor 时返回 GetNodeRef
。
如果调用令牌由于
可能是恶意/不受信任的令牌提供程序,调用
fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken
而不是在发生 IsAlternateFor
时无限期卡住
由于调用令牌不是真正的令牌(并非真正的令牌),
与 sysmem 通信)。另一种方法是
fuchsia.sysmem2/Allocator.BindSharedCollection 中包含此令牌
这也会验证令牌并将其转换为
fuchsia.sysmem2/BufferCollection,然后调用 IsAlternateFor
。
目前,所有表字段均为必填字段。
- 回答
is_alternate
<ph type="x-smartling-placeholder">- </ph>
- true:调用节点和
node_ref
Node
是一个BufferCollectionTokenGroup
。这意味着 发起调用的Node
和node_ref
Node
不会同时具有两者 其约束条件适用,而 sysmem 会选择其中一种 约束条件 - 不能两者都选。这是因为 在逻辑期间选择了BufferCollectionTokenGroup
并且只有一个子树的子树促成 约束汇总。 - false:调用方
Node
之间共有的第一个父节点 并且node_ref
Node
不是BufferCollectionTokenGroup
。 目前,这意味着共同的第一个父节点是BufferCollectionToken
或BufferCollection
(无论是否为Release
ed)。这意味着,调用的Node
和node_ref
Node
在约束条件期间可能同时应用这两个约束条件 逻辑分配的聚合(如果两个Node
都符合) 由所涉及的任何父级BufferCollectionTokenGroup
选择。在 在此示例中,没有任何BufferCollectionTokenGroup
可 直接阻止两个Node
同时被选中并 它们的约束条件都已汇总,但即使值为 false,也可以将其中一个或两个都汇总 如果其中有一项或两项,Node
仍有可能被排除在考虑范围外Node
有直接或间接父级BufferCollectionTokenGroup
,用于选择另一个子子树 与包含调用Node
或node_ref
Node
的子树相比。
- true:调用节点和
- 错误
[fuchsia.sysmem2/Error.NOT_FOUND]
node_ref 不是 与调用Node
的缓冲区集合相关联。 导致此错误的另一个原因是,如果node_ref
是 zx.Handle.EVENT 处理具有足够的权限,但实际上并不是 从GetNodeRef
获得的实node_ref
。 - 错误
[fuchsia.sysmem2/Error.PROTOCOL_DEVIATION]
调用方传递了node_ref
不是 zx.Handle:EVENT 句柄,或者不是 所需的权利。node_ref
- 此调用不会返回其他失败的状态代码。不过, sysmem 将来可能会添加其他代码,因此客户端应该 对任何失败的状态代码进行合理的默认处理。
请求
名称 | 类型 |
---|---|
payload |
NodeIsAlternateForRequest
|
响应
名称 | 类型 |
---|---|
payload |
Node_IsAlternateFor_Result
|
版本
在 fuchsia.sysmem2/BufferCollectionToken 通道上:
通常,参与者会将 BufferCollectionToken
转换为
fuchsia.sysmem2/BufferCollection,但参与者可以改为发送
Release
(然后立即关闭渠道,或者
稍后响应服务器关闭服务器端),
以免导致缓冲区收集失败。如果没有之前的 Release
,
关闭 BufferCollectionToken
客户端会导致缓冲
收集失败。
在 fuchsia.sysmem2/BufferCollection 通道上:
默认情况下,服务器会处理
fuchsia.sysmem2/BufferCollection 客户端端(不含 Release
)
首先)使缓冲区收集失败。在一定程度上是为了加快
当有任何参与者失败时,关闭 VMO 句柄以回收内存。如果
参与者想要在没有BufferCollection
导致缓冲区收集失败,参与者可以发送 Release
然后再关闭 BufferCollection
客户端。Release
可以
发生在 SetConstraints
之前或之后。如果早于 SetConstraints
,
缓冲区收集不需要此节点的约束即可
分配。如果晚于 SetConstraints
,系统会保留约束条件,
尽管在 BufferCollection
约束汇总时间。
在 fuchsia.sysmem2/BufferCollectionTokenGroup 通道上:
默认情况下,BufferCollectionTokenGroup
客户端意外关闭
end(先没有 Release
)会导致缓冲区故障
。在不采用任何规则的情况下关闭 BufferCollectionTokenGroup
渠道
缓冲区收集失败,请确保已对 AllChildrenPresent() 执行
已发送,并在关闭BufferCollectionTokenGroup
前发送 Release
客户端。
如果 Release
出现于
[fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of
释放without prior
AllChildrenPresent). This is intentionally not analogous to how <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.Release'>BufferCollection.Release</a> without <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.SetConstraints'>BufferCollection.SetConstraints</a> first doesn't cause buffer collection failure. For a
BufferCollectionTokenGroup, clean close requires
AllChildrenPresent(if not already sent), then
Release`,然后关闭客户端。
如果 Release
发生在 AllChildrenPresent
之后,则子项和所有
其约束条件保持不变(就像如果
BufferCollectionTokenGroup
渠道仍保持打开状态),且客户端
结束关闭不会导致缓冲区收集失败。
在所有 fuchsia.sysmem2/Node 通道上(上述任何一种):
为简单起见,上文中针对每频道协议的段落会忽略
一个单独的故障域
fuchsia.sysmem2/BufferCollectionToken.SetDispensable 或
fuchsia.sysmem2/BufferCollection.AttachToken。当客户端结束
意外关闭(没有先 Release
),且客户端是
而不是使整个缓冲区收集失败
表示故障域失败,但缓冲区收集本身
与故障域故障隔离开来此类故障域
嵌套,在这种情况下,只有最内层的故障域
Node
驻留失败。
请求
<空>
SetDebugClientInfo
将有关 sysmem 可以使用的当前客户端的信息设置为 帮助诊断泄漏的内存和等待 发送 fuchsia.sysmem2/BufferCollection.SetConstraints。
这会在此 fuchsia.sysmem2/Node 和所有节点上设置调试客户端信息。
Node
派生自此Node
,除非被
fuchsia.sysmem2/Allocator.SetDebugClientInfo 或更高版本
fuchsia.sysmem2/Node.SetDebugClientInfo。
发送 fuchsia.sysmem2/Allocator.SetDebugClientInfo 一次
Allocator
是确保所有
fuchsia.sysmem2/节点将至少包含一些调试客户端信息
而且比单独发送相同的调试信息更高效
通过 fuchsia.sysmem2/Node.SetDebugClientInfo 获取每个客户端信息
已创建 fuchsia.sysmem2/Node。
也在启用详细日志记录功能(请参阅 SetVerboseLogging
)时使用,用于
指明哪个客户最先关闭其渠道,从而转到子树
失败(如果子树的用途已过,这是正常现象,但
如果发生时间早于预期,则客户端渠道专用名称
帮助诊断故障最初来自何处
)。
目前,所有表字段均为必填字段。
- 请求
name
,可以是任意字符串,但当前 进程名称(请参阅fsl::GetCurrentProcessName
)是一个很好的默认值。 - 请求
id
这可以是任意 ID,也可以是当前的进程 ID (请参阅fsl::GetCurrentProcessKoid
)是一个很好的默认值。
请求
名称 | 类型 |
---|---|
payload |
NodeSetDebugClientInfoRequest
|
SetDebugTimeoutLogDeadline
如果未检测到 sysmem,系统会记录警告 所有客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints 。
客户端可以调用此方法来更改输出日志的时间。如果 多个客户端设置了截止时间,但未指定哪个截止期限 生效。
在大多数情况下,使用默认值即可。
目前,所有表字段均为必填字段。
- 请求
deadline
:系统内存开始尝试记录日志的时间 除非那时所有限制条件都与 sysmem 相关,否则系统会返回该警告。
请求
名称 | 类型 |
---|---|
payload |
NodeSetDebugTimeoutLogDeadlineRequest
|
SetName
为此缓冲区集合中的 VMO 设置名称。
如果名称在 ZX_MAX_NAME_LEN 中容纳不下,vmo 本身的名称 将被截断为适合大小。vmo 的名称将以 集合中的缓冲区索引(如果后缀适合放在 ZX_MAX_NAME_LEN).此处指定的名称(不截断)将 。
名称只会影响设置名称后分配的 VMO;这场通话 不会重命名现有 VMO。如果多个客户设置了不同的名称 则较大的优先级值将胜出使用 与先前名称相同优先级不会更改名称。
目前,所有表字段均为必填字段。
- 请求
priority
。仅当这是第一个SetName
时,才会设置名称 或者如果priority
大于任何之前priority
的值 此缓冲区集合的所有Node
之前的SetName
调用。 - request
name
在此缓冲区集合下创建的 VMO 的名称。
请求
名称 | 类型 |
---|---|
payload |
NodeSetNameRequest
|
SetVerboseLogging
这会为缓冲区收集启用详细日志记录功能。
详细日志记录包括通过
每个客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints
以及通过 fuchsia.sysmem2/Node.SetDebugClientInfo(或
fuchsia.sysmem2/Allocator.SetDebugClientInfo 和
Node
的树。
通常,在汇总时,系统仅输出一行投诉 仅显示汇总失败的具体详细原因 几乎不需要周围的上下文。虽然这通常足以诊断问题 如果只进行了细微的更改并且一切正常,就会出现问题 在进行这项小更改之前 这通常不是特别有用 新的缓冲区集合。尤其是 更为复杂的节点树,涉及 fuchsia.sysmem2/BufferCollection.AttachToken、 fuchsia.sysmem2/BufferCollectionToken.SetDispensable、 fuchsia.sysmem2/BufferCollectionTokenGroup 节点以及 详细日志记录可能有助于诊断节点的 原因、为什么逻辑分配失败, 子树的失败时间早于预期。
额外记录的目的是为了能在演出中获得 这一假设,假设仅启用了详细日志记录功能 。如果不跟踪错误 我们不应发送此消息。
请求
<空>
SetWeak
设置当前 fuchsia.sysmem2/Node 和所有子级 Node
弱,这意味着客户端的 Node
客户端(或此消息后创建的子级)并不孤单
使分配的 VMO 保持活跃状态。
从安全系数低的“Node
”获取的所有 VMO 都是安全系数低的系统 VMO。另请参阅
close_weak_asap
。
系统只允许在Node
准备好以下数据之前发送此消息:
分配(否则,服务器使用 ZX_ERR_BAD_STATE
关闭通道):
BufferCollectionToken
:任何时间BufferCollection
:SetConstraints
之前BufferCollectionTokenGroup
:AllChildrenPresent
之前
目前,在就绪后,未从强Node
转换为弱Node
但客户端可以创建
在分配和设置该额外值之前,额外指定 Node
Node
转换为弱
Release
并关闭客户端强 Node
的客户端,但是
保留客户端的弱 Node
。
零强 Node
和零强 VMO 句柄将导致缓冲区
收集失败(所有 Node
个客户端都将看到
ZX_CHANNEL_PEER_CLOSED
以及全部 close_weak_asap
个client_end
将会
看到 ZX_EVENTPAIR_PEER_CLOSED
,但 sysmem(有意)不会注意到
这种情况,直到所有 Node
都做好分配准备。对于
才能成功分配,至少要存在一个强 Node
但在该客户端收到 VMO 句柄之后,
客户端可以 BufferCollection.Release
并关闭客户端,而不用
导致此类故障。
这也暗示了 fuchsia.sysmem2/Node.SetWeakOk,但不意味着
暗示 SetWeakOk
且 for_children_also
true,这可以发送
视情况进行单独调整。
请求
<空>
SetWeakOk
这可告知系统,客户端已准备好关注
close_weak_asap
。
如果发送,此邮件必须早于 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated。
所有使用弱 fuchsia.sysmem2/BufferCollection 的参与者都必须
请在 WaitForAllBuffersAllocated
之前发送此消息,或者让家长发送此消息
Node
必须发送 fuchsia.sysmem2/Node.SetWeakOk 以及
for_child_nodes_also
true,否则 WaitForAllBuffersAllocated
将
触发缓冲区收集失败。
此消息必不可少,因为系统并非总是
老客户没有意识到需要关注
close_weak_asap
个ZX_EVENTPAIR_PEER_CLOSED
并关闭所有剩余项
sysmem 弱 VMO 会尽快处理。收到此消息并要求
表明他们接受总体评分的这一方面,
因此会避免旧版客户端收到信号较弱的情况
VMO 无法让 sysmem 以任何方式使该 VMO 稍后快速关闭
(并且基于每个缓冲区)。
不处理 close_weak_asap
和也不处理的参与者
通过 WaitForAllBuffersAllocated
检索任何 VMO 句柄,不需要
发送 SetWeakOk
(不需要让父级发送 Node
)
SetWeakOk
与 for_child_nodes_also
为 true)。但是,如果
同一参与者有一个检索 VMO 的子项/委托,
子级/受托人需要提前发送 SetWeakOk
WaitForAllBuffersAllocated
。
- 请求
for_child_nodes_also
如果存在且 true,则表示直接 在此消息之后创建的该节点的子节点以及所有子节点 这些节点的后代的行为将如同SetWeakOk
这些节点在此节点之前创建的任何子节点 消息。此设置是“固定的” 不含此布尔值且设置为 true 的后续SetWeakOk
不会重置 服务器端布尔值。如果这会给参与者带来问题, 解决方法是对子级执行SetWeakOk
并将for_child_nodes_also
设为 true 令牌。参与者只能设置for_child_nodes_also
:如果参与者确实能够承诺 针对其自身较弱的 VMO 句柄,遵循close_weak_asap
,并且 参与者持有相应子节点的 VMO 句柄持有较弱的 VMO 句柄Node
。设置for_child_nodes_also
后,后代Node
使用 sysmem(1) 的容器可能较弱,尽管它们的客户端 sysmem1Node
无法通过任何直接方式连接到SetWeakOk
或任何 了解close_weak_asap
的直接方式。这仅适用于 使用 sysmem(1) 的此Node
的后代,而不是此 直接从 sysmem2 令牌转换为 sysmem(1) 时为Node
令牌,除非此Node
的祖先实体,否则会导致分配失败 指定的for_child_nodes_also
为 true。
请求
名称 | 类型 |
---|---|
payload |
NodeSetWeakOkRequest
|
同步
确保之前的邮件已在服务器端收到。这是 在之前有创建新令牌的消息之后, 因为在发送 将令牌发送给其他参与者。
对符合以下条件的令牌调用 fuchsia.sysmem2/BufferCollectionToken.Sync:
不是/不是有效令牌,可能会导致 Sync
永久停止。请参阅
fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken(单向)
降低恶意/仿冒攻击的可能性
fuchsia.sysmem2/BufferCollectionToken,需支付一次往返的费用。
另一种方法是将令牌传递给
fuchsia.sysmem2/Allocator/BindSharedCollection,该集合还会验证
作为交换
fuchsia.sysmem2/BufferCollection 渠道,以及
然后可以放心地使用 fuchsia.sysmem2/BufferCollection.Sync
出现卡顿。
创建一个或多个 fuchsia.sysmem2/BufferCollectionToken 后
然后启动并完成Sync
,就可以放心地将
BufferCollectionToken
客户端结束给知道
其他服务器在发送令牌时
发送到系统内存的
fuchsia.sysmem2/Allocator.BindSharedCollection 消息。这是一个
创建令牌的高效方法,同时避免不必要的往返。
其他选项包括等待每个
fuchsia.sysmem2/BufferCollectionToken.Duplicate 需要完成
单独调用(在每个后面单独调用 Sync
),或者调用
fuchsia.sysmem2/BufferCollection.Sync 令牌
已通过以下方式转换为BufferCollection
?
fuchsia.sysmem2/Allocator.BindSharedCollection 或使用
fuchsia.sysmem2/BufferCollectionToken.DuplicateSync,其中包含
可以一次创建多个令牌
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_Sync_Result
|
节点
在 fuchsia.sysmem2/collection.fidl 中定义
此协议是所建立树中所有节点的父协议 (通过创建 fuchsia.sysmem2/BufferCollectionToken) fuchsia.sysmem2/BufferCollectionTokenGroup 创建,包括 fuchsia.sysmem2/BufferCollectionToken(此后已转换) 传递到 fuchsia.sysmem2/BufferCollection 渠道。
此协议不使用墓碑。
GetBufferCollectionId
获取缓冲区集合 ID。此 ID 也可从
fuchsia.sysmem2/Allocator.GetVmoInfo(以及 buffer_index
)
)。
此通话主要在以下情形下非常有用:
fuchsia.sysmem2/BufferCollectionToken 或
fuchsia.sysmem2/BufferCollection,但只能传输 VMO
句柄,该句柄可与 BufferCollection
客户端端重新联接起来
通过其他路径创建的 ID。更希望通过
BufferCollectionToken
或 BufferCollection
(如果可行)。
信任 sysmem 以外的来源的 buffer_collection_id
值
类似于信任锆石之外的其他来源的 Koid 值。
除非确实有必要,否则都应该避免同时使用这两种方法,并且都要求
注意。在某些情况下,引用
BufferCollection
由buffer_collection_id
通过
但传入的值声称
仅凭 buffer_collection_id
不足以证明授予
buffer_collection_id
任意功能的发送端。发件人必须
先向接收者证明发送者有/有 VMO,或者有/有
BufferCollectionToken
。
sysmem 确认是否是有效的 sysmem 句柄,以及哪个 sysmem 映射到
buffer_collection_id
值。接收方应小心避免
假设发送者有 BufferCollectionToken
,且
因为发送方仅能证明其有 VMO。
- 响应
buffer_collection_id
此 ID 在每个缓冲区中是唯一的 每次启动时收集。每个缓冲区均由 同时使用buffer_collection_id
和buffer_index
。
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_GetBufferCollectionId_Result
|
GetNodeRef
这会获取一个句柄
在任何设备上调用 fuchsia.sysmem2/Node.IsAlternateFor
fuchsia.sysmem2/Node。此标识名仅用于证明
客户端已从此 Node
获取此标识名。
由于这是 get 设置,因此没有 fuchsia.sysmem2/Node.Sync
GetNodeRef
与 IsAlternateFor
调用之间所需的函数,
尽管这两个调用通常在不同的渠道上进行,
另请参阅 fuchsia.sysmem2/Node.IsAlternateFor。
目前,所有表字段均为必填字段。
- 响应
node_ref
此句柄可通过IsAlternateFor
不同的Node
频道,用于证明客户端获得了标识名 来自此Node
。
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_GetNodeRef_Result
|
IsAlternateFor
检查调用方 fuchsia.sysmem2/Node 是否在子树中
根植于共同父标记的不同子标记
fuchsia.sysmem2/BufferCollectionTokenGroup
传入 node_ref
。
此通话用于协助执行准入控制去重,以及 以及调试。
node_ref
必须使用
fuchsia.sysmem2/Node.GetNodeRef。
node_ref
可以是重复的句柄;因此无需调用
每次调用 fuchsia.sysmem2/Node.IsAlternateFor 时返回 GetNodeRef
。
如果调用令牌由于
可能是恶意/不受信任的令牌提供程序,调用
fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken
而不是在发生 IsAlternateFor
时无限期卡住
由于调用令牌不是真正的令牌(并非真正的令牌),
与 sysmem 通信)。另一种方法是
fuchsia.sysmem2/Allocator.BindSharedCollection 中包含此令牌
这也会验证令牌并将其转换为
fuchsia.sysmem2/BufferCollection,然后调用 IsAlternateFor
。
目前,所有表字段均为必填字段。
- 回答
is_alternate
<ph type="x-smartling-placeholder">- </ph>
- true:调用节点和
node_ref
Node
是一个BufferCollectionTokenGroup
。这意味着 发起调用的Node
和node_ref
Node
不会同时具有两者 其约束条件适用,而 sysmem 会选择其中一种 约束条件 - 不能两者都选。这是因为 在逻辑期间选择了BufferCollectionTokenGroup
并且只有一个子树的子树促成 约束汇总。 - false:调用方
Node
之间共有的第一个父节点 并且node_ref
Node
不是BufferCollectionTokenGroup
。 目前,这意味着共同的第一个父节点是BufferCollectionToken
或BufferCollection
(无论是否为Release
ed)。这意味着,调用的Node
和node_ref
Node
在约束条件期间可能同时应用这两个约束条件 逻辑分配的聚合(如果两个Node
都符合) 由所涉及的任何父级BufferCollectionTokenGroup
选择。在 在此示例中,没有任何BufferCollectionTokenGroup
可 直接阻止两个Node
同时被选中并 它们的约束条件都已汇总,但即使值为 false,也可以将其中一个或两个都汇总 如果其中有一项或两项,Node
仍有可能被排除在考虑范围外Node
有直接或间接父级BufferCollectionTokenGroup
,用于选择另一个子子树 与包含调用Node
或node_ref
Node
的子树相比。
- true:调用节点和
- 错误
[fuchsia.sysmem2/Error.NOT_FOUND]
node_ref 不是 与调用Node
的缓冲区集合相关联。 导致此错误的另一个原因是,如果node_ref
是 zx.Handle.EVENT 处理具有足够的权限,但实际上并不是 从GetNodeRef
获得的实node_ref
。 - 错误
[fuchsia.sysmem2/Error.PROTOCOL_DEVIATION]
调用方传递了node_ref
不是 zx.Handle:EVENT 句柄,或者不是 所需的权利。node_ref
- 此调用不会返回其他失败的状态代码。不过, sysmem 将来可能会添加其他代码,因此客户端应该 对任何失败的状态代码进行合理的默认处理。
请求
名称 | 类型 |
---|---|
payload |
NodeIsAlternateForRequest
|
响应
名称 | 类型 |
---|---|
payload |
Node_IsAlternateFor_Result
|
版本
在 fuchsia.sysmem2/BufferCollectionToken 通道上:
通常,参与者会将 BufferCollectionToken
转换为
fuchsia.sysmem2/BufferCollection,但参与者可以改为发送
Release
(然后立即关闭渠道,或者
稍后响应服务器关闭服务器端),
以免导致缓冲区收集失败。如果没有之前的 Release
,
关闭 BufferCollectionToken
客户端会导致缓冲
收集失败。
在 fuchsia.sysmem2/BufferCollection 通道上:
默认情况下,服务器会处理
fuchsia.sysmem2/BufferCollection 客户端端(不含 Release
)
首先)使缓冲区收集失败。在一定程度上是为了加快
当有任何参与者失败时,关闭 VMO 句柄以回收内存。如果
参与者想要在没有BufferCollection
导致缓冲区收集失败,参与者可以发送 Release
然后再关闭 BufferCollection
客户端。Release
可以
发生在 SetConstraints
之前或之后。如果早于 SetConstraints
,
缓冲区收集不需要此节点的约束即可
分配。如果晚于 SetConstraints
,系统会保留约束条件,
尽管在 BufferCollection
约束汇总时间。
在 fuchsia.sysmem2/BufferCollectionTokenGroup 通道上:
默认情况下,BufferCollectionTokenGroup
客户端意外关闭
end(先没有 Release
)会导致缓冲区故障
。在不采用任何规则的情况下关闭 BufferCollectionTokenGroup
渠道
缓冲区收集失败,请确保已对 AllChildrenPresent() 执行
已发送,并在关闭BufferCollectionTokenGroup
前发送 Release
客户端。
如果 Release
出现于
[fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of
释放without prior
AllChildrenPresent). This is intentionally not analogous to how <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.Release'>BufferCollection.Release</a> without <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.SetConstraints'>BufferCollection.SetConstraints</a> first doesn't cause buffer collection failure. For a
BufferCollectionTokenGroup, clean close requires
AllChildrenPresent(if not already sent), then
Release`,然后关闭客户端。
如果 Release
发生在 AllChildrenPresent
之后,则子项和所有
其约束条件保持不变(就像如果
BufferCollectionTokenGroup
渠道仍保持打开状态),且客户端
结束关闭不会导致缓冲区收集失败。
在所有 fuchsia.sysmem2/Node 通道上(上述任何一种):
为简单起见,上文中针对每频道协议的段落会忽略
一个单独的故障域
fuchsia.sysmem2/BufferCollectionToken.SetDispensable 或
fuchsia.sysmem2/BufferCollection.AttachToken。当客户端结束
意外关闭(没有先 Release
),且客户端是
而不是使整个缓冲区收集失败
表示故障域失败,但缓冲区收集本身
与故障域故障隔离开来此类故障域
嵌套,在这种情况下,只有最内层的故障域
Node
驻留失败。
请求
<空>
SetDebugClientInfo
将有关 sysmem 可以使用的当前客户端的信息设置为 帮助诊断泄漏的内存和等待 发送 fuchsia.sysmem2/BufferCollection.SetConstraints。
这会在此 fuchsia.sysmem2/Node 和所有节点上设置调试客户端信息。
Node
派生自此Node
,除非被
fuchsia.sysmem2/Allocator.SetDebugClientInfo 或更高版本
fuchsia.sysmem2/Node.SetDebugClientInfo。
发送 fuchsia.sysmem2/Allocator.SetDebugClientInfo 一次
Allocator
是确保所有
fuchsia.sysmem2/节点将至少包含一些调试客户端信息
而且比单独发送相同的调试信息更高效
通过 fuchsia.sysmem2/Node.SetDebugClientInfo 获取每个客户端信息
已创建 fuchsia.sysmem2/Node。
也在启用详细日志记录功能(请参阅 SetVerboseLogging
)时使用,用于
指明哪个客户最先关闭其渠道,从而转到子树
失败(如果子树的用途已过,这是正常现象,但
如果发生时间早于预期,则客户端渠道专用名称
帮助诊断故障最初来自何处
)。
目前,所有表字段均为必填字段。
- 请求
name
,可以是任意字符串,但当前 进程名称(请参阅fsl::GetCurrentProcessName
)是一个很好的默认值。 - 请求
id
这可以是任意 ID,也可以是当前的进程 ID (请参阅fsl::GetCurrentProcessKoid
)是一个很好的默认值。
请求
名称 | 类型 |
---|---|
payload |
NodeSetDebugClientInfoRequest
|
SetDebugTimeoutLogDeadline
如果未检测到 sysmem,系统会记录警告 所有客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints 。
客户端可以调用此方法来更改输出日志的时间。如果 多个客户端设置了截止时间,但未指定哪个截止期限 生效。
在大多数情况下,使用默认值即可。
目前,所有表字段均为必填字段。
- 请求
deadline
:系统内存开始尝试记录日志的时间 除非那时所有限制条件都与 sysmem 相关,否则系统会返回该警告。
请求
名称 | 类型 |
---|---|
payload |
NodeSetDebugTimeoutLogDeadlineRequest
|
SetName
为此缓冲区集合中的 VMO 设置名称。
如果名称在 ZX_MAX_NAME_LEN 中容纳不下,vmo 本身的名称 将被截断为适合大小。vmo 的名称将以 集合中的缓冲区索引(如果后缀适合放在 ZX_MAX_NAME_LEN).此处指定的名称(不截断)将 。
名称只会影响设置名称后分配的 VMO;这场通话 不会重命名现有 VMO。如果多个客户设置了不同的名称 则较大的优先级值将胜出使用 与先前名称相同优先级不会更改名称。
目前,所有表字段均为必填字段。
- 请求
priority
。仅当这是第一个SetName
时,才会设置名称 或者如果priority
大于任何之前priority
的值 此缓冲区集合的所有Node
之前的SetName
调用。 - request
name
在此缓冲区集合下创建的 VMO 的名称。
请求
名称 | 类型 |
---|---|
payload |
NodeSetNameRequest
|
SetVerboseLogging
这会为缓冲区收集启用详细日志记录功能。
详细日志记录包括通过
每个客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints
以及通过 fuchsia.sysmem2/Node.SetDebugClientInfo(或
fuchsia.sysmem2/Allocator.SetDebugClientInfo 和
Node
的树。
通常,在汇总时,系统仅输出一行投诉 仅显示汇总失败的具体详细原因 几乎不需要周围的上下文。虽然这通常足以诊断问题 如果只进行了细微的更改并且一切正常,就会出现问题 在进行这项小更改之前 这通常不是特别有用 新的缓冲区集合。尤其是 更为复杂的节点树,涉及 fuchsia.sysmem2/BufferCollection.AttachToken、 fuchsia.sysmem2/BufferCollectionToken.SetDispensable、 fuchsia.sysmem2/BufferCollectionTokenGroup 节点以及 详细日志记录可能有助于诊断节点的 原因、为什么逻辑分配失败, 子树的失败时间早于预期。
额外记录的目的是为了能在演出中获得 这一假设,假设仅启用了详细日志记录功能 。如果不跟踪错误 我们不应发送此消息。
请求
<空>
SetWeak
设置当前 fuchsia.sysmem2/Node 和所有子级 Node
弱,这意味着客户端的 Node
客户端(或此消息后创建的子级)并不孤单
使分配的 VMO 保持活跃状态。
从安全系数低的“Node
”获取的所有 VMO 都是安全系数低的系统 VMO。另请参阅
close_weak_asap
。
系统只允许在Node
准备好以下数据之前发送此消息:
分配(否则,服务器使用 ZX_ERR_BAD_STATE
关闭通道):
BufferCollectionToken
:任何时间BufferCollection
:SetConstraints
之前BufferCollectionTokenGroup
:AllChildrenPresent
之前
目前,在就绪后,未从强Node
转换为弱Node
但客户端可以创建
在分配和设置该额外值之前,额外指定 Node
Node
转换为弱
Release
并关闭客户端强 Node
的客户端,但是
保留客户端的弱 Node
。
零强 Node
和零强 VMO 句柄将导致缓冲区
收集失败(所有 Node
个客户端都将看到
ZX_CHANNEL_PEER_CLOSED
以及全部 close_weak_asap
个client_end
将会
看到 ZX_EVENTPAIR_PEER_CLOSED
,但 sysmem(有意)不会注意到
这种情况,直到所有 Node
都做好分配准备。对于
才能成功分配,至少要存在一个强 Node
但在该客户端收到 VMO 句柄之后,
客户端可以 BufferCollection.Release
并关闭客户端,而不用
导致此类故障。
这也暗示了 fuchsia.sysmem2/Node.SetWeakOk,但不意味着
暗示 SetWeakOk
且 for_children_also
true,这可以发送
视情况进行单独调整。
请求
<空>
SetWeakOk
这可告知系统,客户端已准备好关注
close_weak_asap
。
如果发送,此邮件必须早于 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated。
所有使用弱 fuchsia.sysmem2/BufferCollection 的参与者都必须
请在 WaitForAllBuffersAllocated
之前发送此消息,或者让家长发送此消息
Node
必须发送 fuchsia.sysmem2/Node.SetWeakOk 以及
for_child_nodes_also
true,否则 WaitForAllBuffersAllocated
将
触发缓冲区收集失败。
此消息必不可少,因为系统并非总是
老客户没有意识到需要关注
close_weak_asap
个ZX_EVENTPAIR_PEER_CLOSED
并关闭所有剩余项
sysmem 弱 VMO 会尽快处理。收到此消息并要求
表明他们接受总体评分的这一方面,
因此会避免旧版客户端收到信号较弱的情况
VMO 无法让 sysmem 以任何方式使该 VMO 稍后快速关闭
(并且基于每个缓冲区)。
不处理 close_weak_asap
和也不处理的参与者
通过 WaitForAllBuffersAllocated
检索任何 VMO 句柄,不需要
发送 SetWeakOk
(不需要让父级发送 Node
)
SetWeakOk
与 for_child_nodes_also
为 true)。但是,如果
同一参与者有一个检索 VMO 的子项/委托,
子级/受托人需要提前发送 SetWeakOk
WaitForAllBuffersAllocated
。
- 请求
for_child_nodes_also
如果存在且 true,则表示直接 在此消息之后创建的该节点的子节点以及所有子节点 这些节点的后代的行为将如同SetWeakOk
这些节点在此节点之前创建的任何子节点 消息。此设置是“固定的” 不含此布尔值且设置为 true 的后续SetWeakOk
不会重置 服务器端布尔值。如果这会给参与者带来问题, 解决方法是对子级执行SetWeakOk
并将for_child_nodes_also
设为 true 令牌。参与者只能设置for_child_nodes_also
:如果参与者确实能够承诺 针对其自身较弱的 VMO 句柄,遵循close_weak_asap
,并且 参与者持有相应子节点的 VMO 句柄持有较弱的 VMO 句柄Node
。设置for_child_nodes_also
后,后代Node
使用 sysmem(1) 的容器可能较弱,尽管它们的客户端 sysmem1Node
无法通过任何直接方式连接到SetWeakOk
或任何 了解close_weak_asap
的直接方式。这仅适用于 使用 sysmem(1) 的此Node
的后代,而不是此 直接从 sysmem2 令牌转换为 sysmem(1) 时为Node
令牌,除非此Node
的祖先实体,否则会导致分配失败 指定的for_child_nodes_also
为 true。
请求
名称 | 类型 |
---|---|
payload |
NodeSetWeakOkRequest
|
同步
确保之前的邮件已在服务器端收到。这是 在之前有创建新令牌的消息之后, 因为在发送 将令牌发送给其他参与者。
对符合以下条件的令牌调用 fuchsia.sysmem2/BufferCollectionToken.Sync:
不是/不是有效令牌,可能会导致 Sync
永久停止。请参阅
fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken(单向)
降低恶意/仿冒攻击的可能性
fuchsia.sysmem2/BufferCollectionToken,需支付一次往返的费用。
另一种方法是将令牌传递给
fuchsia.sysmem2/Allocator/BindSharedCollection,该集合还会验证
作为交换
fuchsia.sysmem2/BufferCollection 渠道,以及
然后可以放心地使用 fuchsia.sysmem2/BufferCollection.Sync
出现卡顿。
创建一个或多个 fuchsia.sysmem2/BufferCollectionToken 后
然后启动并完成Sync
,就可以放心地将
BufferCollectionToken
客户端结束给知道
其他服务器在发送令牌时
发送到系统内存的
fuchsia.sysmem2/Allocator.BindSharedCollection 消息。这是一个
创建令牌的高效方法,同时避免不必要的往返。
其他选项包括等待每个
fuchsia.sysmem2/BufferCollectionToken.Duplicate 需要完成
单独调用(在每个后面单独调用 Sync
),或者调用
fuchsia.sysmem2/BufferCollection.Sync 令牌
已通过以下方式转换为BufferCollection
?
fuchsia.sysmem2/Allocator.BindSharedCollection 或使用
fuchsia.sysmem2/BufferCollectionToken.DuplicateSync,其中包含
可以一次创建多个令牌
请求
<空>
响应
名称 | 类型 |
---|---|
payload |
Node_Sync_Result
|
结构体
BufferCollection_CheckAllBuffersAllocated_Response
在 fuchsia.sysmem2/collection.fidl 中定义
<空>
Node_Sync_Response
在 fuchsia.sysmem2/collection.fidl 中定义
<空>
PixelFormatAndModifier
在 fuchsia.sysmem2/constraints.fidl 中定义
字段 | 类型 | 说明 | 默认 |
---|---|---|---|
pixel_format |
fuchsia.images2/PixelFormat
|
如果参与者在发送到 sysmem 的消息中指定,可以为此字段指定任意值。
参与者可以指定 fuchsia.images2/PixelFormat.DO_NOT_CARE
如果参与者需要指定 |
无默认设置 |
pixel_format_modifier |
fuchsia.images2/PixelFormatModifier
|
特定修饰符(不仅仅是标志),或 |
无默认设置 |
精英
CoherencyDomain 柔性环境
类型:uint32
在 fuchsia.sysmem2/constraints.fidl 中定义
INACCESSIBLE
仅适用于没有 CPU 访问
缓冲区。
无法从 CPU 访问的设备本地内存为 CoherencyDomain
INACCESSIBLE
,即使可能会使设备(实体或实体设备)
virtual)将数据从 INACCESSIBLE
缓冲区复制到
对 CPU 可见换句话说,INACCESSIBLE 并不意味着安全
而安全则意味着无法访问
CPU
表示提供方必须确保使用方可以读取生成的数据
使用 CPU,且使用者无需额外执行缓存操作
已由制作人(根据需要)执行
RAM
表示生产者必须确保生成的数据完全存在
没有任何脏 CPU 缓存行,且使用方必须使使用方失效
(或者通常刷新和失效)CPU 缓存,然后使用
CPURAM
域名可能比 CPU
域名更快,
这种访问方式是通过硬件 DMA 进行的,因为在这种情况下,不需要 CPU 缓存操作,
因为没有参与者实际使用 CPU 执行读取/写入操作
名称 | 值 | 说明 |
---|---|---|
CPU |
0 |
|
RAM |
1 |
|
INACCESSIBLE |
2 |
错误:柔性环境
类型:uint32
在 fuchsia.sysmem2/error.fidl 中定义
无论错误代码是什么,任何客户端重试时间都应该非常有限, 数字(如果有)。
Error 值绝不应存储在 zx_status_t 中,因为正值 已弃用。
名称 | 值 | 说明 |
---|---|---|
无效 |
0 |
这在此错误枚举中不是有效的错误值。服务器将 切勿将此值作为失败代码发送。该值不会被视为 “success”。在某些语言中,本地默认初始化的 Error 实例将具有此值,直到使用有效的 正错误代码。 |
未指定 |
1 |
未指明的错误。 如果该错误代码不适用其他错误代码,则使用此错误代码 可能不是因为通过 出现此错误的渠道。 客户端应以一般错误的形式处理此错误。 例如,当另一个客户端渠道具有 意外关闭(未发送 fuchsia.sysmem2/Node.Release),因此会导致任何 节点相同。在这种用法中, 不是接收客户端的“错”- 没有理由 因为接收客户端可能只能执行 处理错误的方法,至少不是直接的。 再举一例,如果系统调用正常 预期会成功的操作意外失败,并且 不明确的原因 “追责”客户端。 客户端绝不应要求 / 依赖导致错误的特定原因 将导致 UNSPECIFIED 继续,因为任何特定的错误原因都可能 则可能导致以后出现更具体的错误代码。 |
PROTOCOL_DEVIATION |
2 |
某个必填字段未设置或指定的值无效。请参阅 日志以获取更多信息。 当在 顺序错误或与协议规则不符。 |
NOT_FOUND |
3 |
未找到客户指定的对象或 ID。 |
HANDLE_ACCESS_DENIED |
4 |
该对象句柄没有足够的权限来执行请求。 |
NO_MEMORY |
5 |
由于缺少可用内存,无法满足分配条件。 内存耗尽可能特定于所选的堆 因此在某些情况下,可能会发生此错误 尽管正常的系统 RAM 并没有即将耗尽, 配置和选择的堆。 |
CONSTRAINTS_INTERSECTION_EMPTY |
6 |
请求有效,但无法满足,可能是由于硬件 限制。如果参与该分配流程的参与者 具有不兼容的约束条件(大致来说就是空的交集)。 如需了解详情,请参阅日志。如果参与者可能 可能会被视为可选,请参阅 BufferCollectionTokenGroup。 如果现有的缓冲区空间不足, 集合来满足额外令牌(包括派生的子树) 使用 fuchsia.sysmem2/BufferCollection.AttachToken 创建。 如果客户端的节点位于某个组下,而另一个组 会改为选择群组下级群组 |
PENDING |
7 |
系统尚未尝试分配。正在呼叫 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated 会 屏蔽。 |
TOO_MANY_GROUP_CHILD_COMBINATIONS |
8 |
|
表格
AllocatorAllocateNonSharedCollectionRequest 资源
在 fuchsia.sysmem2/allocator.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
collection_request |
server_end<BufferCollection>
|
AllocatorAllocateSharedCollectionRequest 资源
在 fuchsia.sysmem2/allocator.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
token_request |
server_end<BufferCollectionToken>
|
AllocatorBindSharedCollectionRequest 资源
在 fuchsia.sysmem2/allocator.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
token |
BufferCollectionToken
|
|
2 |
buffer_collection_request |
server_end<BufferCollection>
|
AllocatorGetVmoInfoRequest 资源
在 fuchsia.sysmem2/allocator.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
vmo |
handle<vmo>
|
需要设置 |
AllocatorSetDebugClientInfoRequest
在 fuchsia.sysmem2/allocator.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
name |
string[256]
|
|
2 |
id |
uint64
|
AllocatorValidateBufferCollectionTokenRequest
在 fuchsia.sysmem2/allocator.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
token_server_koid |
zx/Koid
|
Allocator_GetVmoInfo_Response 资源
在 fuchsia.sysmem2/allocator.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
buffer_collection_id |
uint64
|
|
2 |
buffer_index |
uint64
|
|
3 |
close_weak_asap |
handle<eventpair>
|
Allocator_ValidateBufferCollectionToken_Response
在 fuchsia.sysmem2/allocator.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
is_known |
bool
|
BufferCollectionAttachLifetimeTrackingRequest 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
server_end |
handle<eventpair>
|
|
2 |
buffers_remaining |
uint32
|
BufferCollectionAttachTokenRequest 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
rights_attenuation_mask |
zx/Rights
|
|
2 |
token_request |
server_end<BufferCollectionToken>
|
BufferCollectionConstraints
在 fuchsia.sysmem2/constraints.fidl 中定义
对分配的缓冲区的约束条件以及对图像的约束条件(可选) 存储在缓冲区中的资源。可以按参与者指定这些限制。 sysmem 服务会实现来自多个 参与者。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
usage |
BufferUsage
|
汇总 fuchsia.sysmem2/BufferCollectionConstraints 时, 按位-OR。 必须至少指定一个 如果指定 |
2 |
min_buffer_count_for_camping |
uint32
|
每位参与者可同时享受的缓冲数量 专属使用时间超过暂时性(露营)即可。 在这种情况下,“暂时的”“时长”是指看完视频所需的时间 运行一小段非阻塞代码来完成传输 对相应缓冲区的所有权。例如,从存储空间读取内容、等待 或者执行类似 帧编码或解码不会被视为瞬时时长,即使 有时可能很快就能完成 例如,视频解码器会(至少)指定 的参考帧 + 目前正在解码为 1 帧的帧。但不包括 1 个 异步运行且快速提供 已解码的帧,即使该帧可能归属于某个已解码的帧, 同时对下一帧进行解码时的瞬时时长。 参与者不得露营超过此处指定的缓冲区(但 暂时使用),否则处理可能会卡住。 在聚合 BufferCollectionConstraints 时,这些值会相加。 在测试场景中,对于任何 Transformer 来说, (在此例中,一次屏幕刷新周期是“显著”的) 上下文)可能会(理想情况下会)被标记为失败。测试中 向参与者提供的缓冲区不得超过 。 |
3 |
min_buffer_count_for_dedicated_slack |
uint32
|
每个参与者所需的 Slack 缓冲区数量下限 以便提高处理重叠率 / 提高性能。 在聚合 参与者通常应在此处指定 0 或 1,通常是 0 为
如果 在测试场景中,可能强制将此字段设为 0,
预计参与者可以继续工作,而不会遇到困难。如果
正向进度原因需要一个缓冲区,该缓冲区应该
计入 |
4 |
min_buffer_count_for_shared_slack |
uint32
|
与 参与者可以指定 >如果参与者希望确保 但整体上还存在一些 Slack,但不需要将它用于专用状态。 选择是使用 在测试场景中,可能强制将此字段设为 0,
预计参与者可以继续工作,而不会遇到困难。如果
正向进度原因需要一个缓冲区,该缓冲区应该
计入 |
5 |
min_buffer_count |
uint32
|
挑剔的参与者很不幸,可能需要
如果未设置此字段,则逻辑 |
6 |
max_buffer_count |
uint32
|
挑剔的参与者很不幸,可能需要
如果未设置此字段,则逻辑 |
7 |
buffer_memory_constraints |
BufferMemoryConstraints
|
有意设置“ 如果未设置,客户端会指定“随意”关于任何缓冲区内存 限制条件。 |
8 |
image_format_constraints |
vector<ImageFormatConstraints>[64]
|
对所存储图片的图片格式参数的可选限制
该集合的缓冲区中这包括
fuchsia.images2/PixelFormat 和 汇总时,只有 参与者可以指定 在 SetConstraints 消息中,未设置或长度为零意味着无图片格式
限制条件;如果没有其他参与者,则可以分配原始缓冲区
指定任何 |
BufferCollectionInfo 资源
在 fuchsia.sysmem2/results.fidl 中定义
缓冲区集合及其缓冲区的相关信息。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
settings |
SingleBufferSettings
|
这些设置会应用于初始缓冲区中的所有缓冲区 分配。 此字段将始终由 sysmem 设置。 |
2 |
buffers |
vector<VmoBuffer>[128]
|
VMO 处理 中每个缓冲区的 VMO 处理 。 该矢量的大小是 buffer_count(不会发送 buffer_count)。 )。 所有缓冲区 VMO 句柄的大小和访问权限都相同。尺寸 位于 settings.buffer_settings.size_bytes 中。 VMO 访问权限取决于 分配缓冲区集合时指定的客户端。例如, 表示为只读使用情况的客户端将收到未写入的 VMO 权利。此外,通过上述 参数, BufferCollectionToken.Duplicate() 调用。 此字段始终包含 VmoBuffer(s),即使参与者也是如此 指定不需要 VMO 句柄的用法。这样一来, vmo_usable_start 值,以防出现任何 提供给参与者 此字段将始终由 sysmem 设置,即使参与者并未设置也是如此 指定所有缓冲区使用情况(但 fuchsia.sysmem2/VmoBuffer.vmo 子字段)。 |
3 |
buffer_collection_id |
uint64
|
此编号在每次启动时的所有逻辑缓冲区集合中都是唯一的。 所有 BufferCollectionToken 的此 ID 号都是相同的, BufferCollection 和 BufferCollectionTokenGroup 相同的逻辑缓冲区集合(派生自相同的根令牌) 使用 fuchsia.sysmem2.Allocator.CreateSharedCollection 创建,或使用 CreateNonSharedCollection 的一部分。 您可以从 BufferCollectionToken 中检索相同的 ID, BufferCollection 或 BufferCollectionTokenGroup GetBufferCollectionId(以往返于 sysmem 的往返为代价)。 此字段将始终由 sysmem 设置。 |
BufferCollectionSetConstraintsRequest 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
constraints |
BufferCollectionConstraints
|
BufferCollectionTokenCreateBufferCollectionTokenGroupRequest 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
group_request |
server_end<BufferCollectionTokenGroup>
|
BufferCollectionTokenDuplicateRequest 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
rights_attenuation_mask |
zx/Rights
|
|
2 |
token_request |
server_end<BufferCollectionToken>
|
BufferCollectionTokenDuplicateSyncRequest
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
rights_attenuation_masks |
vector<zx/Rights>[64]
|
BufferCollectionTokenGroupCreateChildRequest 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
token_request |
server_end<BufferCollectionToken>
|
必须设置。 |
2 |
rights_attenuation_mask |
zx/Rights
|
如果未设置,则默认值为 |
BufferCollectionTokenGroupCreateChildrenSyncRequest
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
rights_attenuation_masks |
vector<zx/Rights>[64]
|
BufferCollectionTokenGroup_CreateChildrenSync_Response 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
tokens |
vector<BufferCollectionToken>[64]
|
BufferCollectionToken_DuplicateSync_Response 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
tokens |
vector<BufferCollectionToken>[64]
|
BufferCollection_WaitForAllBuffersAllocations_Response 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
buffer_collection_info |
BufferCollectionInfo
|
BufferMemoryConstraints
在 fuchsia.sysmem2/constraints.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
min_size_bytes |
uint64
|
将被视为 1 |
2 |
max_size_bytes |
uint64
|
unset 被视为 0xFFFFFFFFFFFFFFFF。 |
3 |
physically_contiguous_required |
bool
|
如果为 false,缓冲区 VMO 的物理页面可以是非连续的。时间 true,缓冲区 VMO 的物理页面必须依序连续。答 不需要物理连续 VMO 的客户端仍必须接受 物理连续虚拟机VMO。 |
4 |
secure_required |
bool
|
如果为 true,则参与者需要安全内存。 汇总 |
5 |
cpu_domain_supported |
bool
|
如果为 true(或 如果选择了 CPU 网域,参与者必须确保 CPU 可以读取 或将数据写入缓冲区,而无需 。 换言之,如果生产者参与者将数据 DMA 直接 非缓存一致性架构(例如 arm),生产者必须确保 CPU 缓存已清理。DMA 写入前的缓冲区,以及 在 DMA 写入后、指示 其他参与者就可以发送该缓冲区了如果消费者参与者 在非缓存一致性架构(例如 arm,使用方必须在 DMA 之前刷新 CPU 缓存 阅读。 不执行任何 DMA 且仅使用 CPU 的参与者只能写入和读取 缓冲区(在应该缓存时),而无需执行任何 CPU 缓存操作。 |
6 |
ram_domain_supported |
bool
|
如果为 true,参与者可以由系统内存选择 RAM 域。 如果选择了 RAM 域,则 RAM 中必须有提供方数据 (采用 CPU 缓存状态,使 RAM 数据不会被 脏 CPU 缓存行将不正确的数据写入 RAM)和消耗方 使用 CPU 读取必须在读取之前使 CPU 缓存失效( 生产者不保证不会过时的“干净”缓存行)。 换言之,如果生产者参与者使用 CPU 来 非缓存一致性架构(例如 arm),生产方必须刷新 先将数据传输到 RAM,然后再通知另一个参与者 准备就绪。如果消费者参与者使用 CPU 读取 非缓存一致性架构(如 arm),参与者必须 失效(通常是刷新+失效,同时知道没有缓存 脏数据行)读取缓冲区。 不对缓冲区进行任何 CPU 访问的仅使用 RAM 的参与者可以 只需在应该缓冲区与缓冲区进行 DMA 操作时,无需 执行任何 CPU 缓存操作 |
7 |
inaccessible_domain_supported |
bool
|
如果为 true,参与者可以由系统内存选择“无法访问” 网域。 如果选择“无法访问的域”,CPU 将读取和写入数据 被阻止。尝试通过 CPU 读取/写入数据可能会导致 UB 中和/或进程终止。 如果选择“无法访问的网域”,则参与者只能操作 使用硬件执行的特定媒体市场区域,或针对具体平台的 DMA 安全环境(将执行所需的 CPU 缓存操作) 类似于 RAM 域参与者的操作方式)。 安全堆仅支持 INACCESSIBLE 网域,并且会导致分配失败
如果除 如果选择“无法访问的域”,参与者(外部 (安全/DRM 环境)均不得尝试映射缓冲区, 不会尝试执行任何 CPU 缓存操作。就这一点而言 类似于 RAM 域,所有参与者仅执行 DMA, 进行 CPU 访问的参与者。 |
8 |
permitted_heaps |
vector<Heap>[64]
|
参与者可以接受哪些堆。未参加活动的参与者
请注意在哪个堆内存上分配了内存应保持未设置此字段。答
只有在所有参与者都明确指示时,才会选择安全堆
安全堆可通过 |
BufferMemorySettings
在 fuchsia.sysmem2/results.fidl 中定义
这些设置是针对缓冲区集合的所有缓冲区的内存相关设置。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
size_bytes |
uint64
|
此字段将始终由 sysmem 设置。 |
2 |
is_physically_contiguous |
bool
|
此字段将始终由 sysmem 设置。 |
3 |
is_secure |
bool
|
此字段将始终由 sysmem 设置。 |
4 |
coherency_domain |
CoherencyDomain
|
此字段将始终由 sysmem 设置。 |
5 |
heap |
Heap
|
从中分配缓冲区的特定堆。 此字段将始终由 sysmem 设置。 |
BufferUsage
在 fuchsia.sysmem2/usages.fidl 中定义
描述客户端如何访问缓冲区的内容。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
none |
uint32
|
如果客户端设置了此字段,则客户端不应设置任何其他
字段。此字段中的唯一有效位是
|
2 |
cpu |
uint32
|
如果设置,则会保留 CPU 使用率。请参阅 usages.fidl 中的 |
3 |
vulkan |
uint32
|
如果设置,则会存储 vulkan 用法位。请参阅 |
4 |
display |
uint32
|
如果设置,则会保留显示屏使用位。在以下位置查看 |
5 |
video |
uint32
|
如果设置,则会存储视频使用位。请参阅 usages.fidl 中的 |
配置
在 fuchsia.sysmem2/config.fidl 中定义
此类型在 sysmem_config.persistent_fidl 文件中进行了 fidl::Persist() 处理 由汇编工具在 sysmem 网域配置中读取,而由 sysmem 读取
一般情况下,最好使用 json[5],但我们要生成这个配置 使用 FIDL 类型进行 Rust 开发(以避免重复并利用 FIDL rust codegen),并且没有适用于 FIDL 类型的 JSON 架构。
目前没有机制可以在运行时更改此配置中的任何内容 还是从启动到启动的整个过程。每次运行汇编工具时,此配置都是静态的。
请参阅 src/lib/assembly/config_schema/src/platform_config/sysmem_config.rs 系统内存配置的各个方面,直接在板信息中内嵌指定 或组装平台配置sysmem 配置的两个部分 重叠。此处的配置适用于 sysmem 配置的各个方面, 过于冗长,无法直接包含在主板信息或组装平台中 配置。此外,部分/大多数像素格式费用条目 以编程方式生成(根据本注释)。
在按汇编工具进行聚合之前,有多个 .persistent_fidl 每个文件存储自己的 Config 实例。板信息和组装 平台配置会列出包含板信息的输入 Persistent_fidl 文件 逻辑上,然后再进行组装平台配置。整个文件列表 以便之后的文件可以替换/替换之前文件中的信息。
由于此类型仅适用于持续存在的音效,其中 序列化实例的长度没有限制,我们不必限制 矢量元素计数。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
format_costs |
vector<FormatCostEntry>
|
这是将会考虑的 FormatCost 条目的有序列表 由系统内存来打破所有参与者支持的内容形式之间的联系 缓冲区集合 在配置汇总期间,如果后续条目具有匹配的 FormatCostKey, 系统会省略/移除较早的条目。这样,以后的文件就可以 覆盖之前文件中的条目,并允许 汇编平台配置,以覆盖在 面板信息。 此矢量通常不会有两个匹配的条目。 配置中的 pixel_format、pixel_format_modifier 和 buffer_usage_bits 由 sysmem 从 sysmem_config.persistent_fidl 加载的实例。如果不知道 这两个字段中确实有两个条目匹配,则 sysmem 可以忽略除一个外的所有其他条目 任意选择的条目 |
FormatCostEntry
在 fuchsia.sysmem2/config.fidl 中定义
FormatCostEntry 可用于影响 PixelFormatAndModifier 用于缓冲区收集,可以选择将 BufferUsage 考虑在内。
默认费用为 f32::MAX,即任何具有非 MAX 值的指定费用 会优先使用指定的格式 FormatCost 条目。
具有相同 pixel_format、pixel_format_modifier 和 required_usage_bits 作为前一个条目将覆盖该条目。 为便于匹配,如果缺少 pixel_format_modifier 就会与 LINEAR 匹配,并且 缺失 required_buffer_usage_bits 则匹配全 0 使用位。
板级信息 sysmem_defaults 条目在逻辑上早于平台 sysmem 条目。
在以下情况下,Sysmem 将使用生成的 FormatCostEntry 汇总列表 打破了所有 缓冲区集合的参与者。对于每种相互支持的格式 系统会忽略格式不匹配的条目, 系统将忽略 buffer_usage_bits 设置。在其余条目中,该条目 与汇总的参与者使用情况数据最多的是 决定费用(如果相等,则以较晚者为准)。然后, 会选择费用最低的广告格式如果费用相当(费用相等),则 会随意断开,但并非随机。
但这并不作为一种机制,用于阻止用户选择存在 缓冲区集合的所有参与者都支持。如果参与者 声称支持某种格式,但未能正确处理该格式, 应进行修正以正确处理该格式,或者进行更改以停止声明版权 支持该格式
此机制旨在影响广告格式选择 更高效的格式、更低的内存带宽占用、 等等,并考虑到可能出现的怪异行为, 指定主板或整体平台配置所独有
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
key |
FormatCostKey
|
必须设置。如果两个条目具有逻辑上相等的键(在字段之后) 默认值),后一个条目会覆盖前一个条目。 |
2 |
cost |
float32
|
必须设置。费用较低者胜出,但也会看到 FormatCostKey 字段 re. 先按格式和用法位数过滤条目。 当两个视频条目(每个条目的 所有参与者均支持其格式)时, 具有不同的成本,成本较低的条目(及其 格式)。 对于非测试场景,请仅使用费用值 >0.0(通常至少为 1.0),其中包含 0.0, 测试。 |
FormatCostKey
在 fuchsia.sysmem2/config.fidl 中定义
具有相同 pixel_format、pixel_format_modifier 和 required_usage_bits 作为前一个条目将覆盖该条目。 为便于匹配,如果缺少 pixel_format_modifier 就会与 LINEAR 匹配,并且 缺失 required_buffer_usage_bits 则匹配全 0 使用位。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
pixel_format |
fuchsia.images2/PixelFormat
|
Pixel_format 和 pixel_format_modifier 是此 需遵守 FormatCost 条目。 必须设置。 |
2 |
pixel_format_modifier |
fuchsia.images2/PixelFormatModifier
|
Pixel_format 和 pixel_format_modifier 是此 需遵守 FormatCost 条目。 如果未设置,等同于 LINEAR。 |
3 |
buffer_usage_bits |
BufferUsage
|
设置后,仅当缓冲区集合的 至少设置过这些使用位 缓冲区集合具有聚合的 BufferUsage,即并集 每个参与者的 BufferUsage 位数。FormatCost 条目数和 设置位会被忽略。在其他广告中,格式匹配的 最多的使用量位设置决定了 缓冲区收集。 然后,在 该模式的所有参与者共同支持的格式 缓冲区收集。 此字段的主要用途是允许“挥手关闭”一种 可以用,但是效果不佳。 在这种情况下,如果有问题的组合 使用位的比例。如果此格式是 缓冲区参与者之间唯一相互支持的格式 。 如果未设置任何使用位,则等同于设置零使用位,即应用相应条目 除非适用另一个具有更具体的用法的条目。 在某些情况下,让所有条目都省略此字段是一种合理的做法, 当/如果仅根据格式费用选择格式(忽略使用情况),为 。 |
FormatCosts
在 fuchsia.sysmem2/config.fidl 中定义
这是格式成本文件中持久性 Fid 的根源。格式 汇编工具读取成本文件,然后合并为 sysmem 网域配置中的 sysmem_config.persistent_fidl 文件(请参阅“配置”) )。
一般情况下,最好使用 json[5],但我们要生成这个配置 使用 FIDL 类型进行 Rust 开发(以避免重复并利用 FIDL rust codegen),并且没有适用于 FIDL 类型的 JSON 架构。
虽然生成的 sysmem_config.persistent_fidl 是单个文件 包含 sysmem 配置的多个方面,这与格式成本文件不同 仅包含格式费用。我们不介意 但最好是将 sysmem 的域配置下载到单个文件 。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
format_costs |
vector<FormatCostEntry>
|
这些条目将以 ['fuchsia.sysmem2.Config.format_costs'](参见上文),除非被替换为 后续条目(可以在同一个矢量中,也可以在后续处理的文件中) 由汇编工具在汇总期间触发)。 |
堆
在 fuchsia.sysmem2/constraints.fidl 中定义
对堆实例的引用。
一个给定的堆实例可以有多个 Heap
,这些实例可用于
引用了堆实例在不知情的情况下比较 Heap
个表
用这些 Heap
别名确定是否有两个 Heap
表的可靠方法并不可靠
引用同一堆(匹配表示是,但不匹配则表示可能)。
允许堆别名可更轻松地重命名 Heap.type
。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
heap_type |
string[128]
|
堆的类型,使用根据 此 API 的注释中介绍了 fuchsia.sysmem.heap.bind 文件。 示例:
|
2 |
id |
uint64
|
堆的 uint64 ID。只需为每个(类型、
启动)元组。也就是说,指定的堆 ID 仅在
机器的当前启动(而不是跨多次启动),并且仅在
对于引用单例堆的 |
ImageFormatConstraints
在 fuchsia.sysmem2/constraints.fidl 中定义
描述了对缓冲区中图像数据布局的约束。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
pixel_format |
fuchsia.images2/PixelFormat
|
存在以下限制的 fuchsia.images2/PixelFormat 。
一位参与者可以有多个 fuchsia.sysmem2/PixelFormatAndModifier。
另请参阅 fuchsia.sysmem2/ImageFormatConstraints.pixel_format_and_modifiers. 此字段必须设置为
fuchsia.images2/PixelFormat.INVALID
参与者可以指定 fuchsia.images2/PixelFormat.DO_NOT_CARE
如果参与者需要指定 |
2 |
pixel_format_modifier |
fuchsia.images2/PixelFormatModifier
|
应用以下约束条件的像素格式修饰符。
这个值来自 另请参阅 如果设置了
设置后,此值是一个特定的修饰符(不仅仅是标志),或者
|
3 |
color_spaces |
vector<fuchsia.images2/ColorSpace>[32]
|
留空会出错。如果输入重复,则会出现错误。“任意排序”现为 而不是错误。 客户端可以指定单个条目
[fuchsia.sysmem2/ColorSpace.DO_NOT_CARE |
4 |
min_size |
fuchsia.math/SizeU
|
允许的最小尺寸(以像素为单位)。 例如,视频解码器参与者可以将此字段设为
流可能指定的最小尺寸。在
相反, 发送到系统内存时,如果参与者已
准备好处理尽可能小的非零图像布局
仅受 制作方应设置 从 sysmem 接收内容时,将始终设置此字段, 宽度和高度都为 0,因为必须至少有一个参与者 指定一个非零的最小尺寸(其中宽度和高度均不能 零)。 另请参阅 |
5 |
max_size |
fuchsia.math/SizeU
|
大小上限(以像素为单位)。例如,景观可设置该字段(直接 或子参与者)设置为可合成的大小上限。 如果发送到系统内存,则取消设置会被视为 0xFFFFFFFF、0xFFFFFFFF。 从 sysmem 接收内容时,此字段将始终设置。对于宽度和 高度,如果没有强制实施最大值,则子字段将是 0xFFFFFFFF。 另请参阅 |
6 |
min_bytes_per_row |
uint32
|
每行的最小字节数,包括 行中的最后一个图片数据。 这有时也称为“步长(以字节为单位)”或“line to line” 偏移”。对于单平面格式,这是指每行的字节数 像素值。对于多平面格式,这是指每行的字节数 平面 0 中的样本数(例如,亮度每行的字节数 样本)。多平面 格式,那么平面 0 以外的平面中每行的字节数格式为 但始终与平面有特定的关系, 0 个字节, 。 将 从 sysmem 收到该结构时,此字段将始终为
设置(如果存在父结构),并且始终至少为
一些提供方参与者可能更倾向于
|
7 |
max_bytes_per_row |
uint32
|
每行的最大字节数,包括 行中的最后一个图片数据。 当发送到 sysmem 时,该值必须大于等于 如果发送到系统内存,则取消设置会被视为 0xFFFFFFFF。 从 sysmem 收到内容时,此字段将始终设置。如果最大值为 则该值将为 0xFFFFFFFF(而非零)。 |
8 |
max_width_times_height |
uint64
|
最大像素数。 以像素为单位的最大图片区域通过 fuchsia.sysmem/BufferMemoryConstraints.max_size_bytes 和 fuchsia.sysmem/BufferSettings.size_bytes,也可以 由系统直接强制执行 与 fuchsia.sysmem2/ImageFormatConstraints.max_size 相反 字段,用于分别限制宽度和高度,此字段用于限制 总像素数。 与此相反,
fuchsia.sysmem/BufferMemoryConstraints.max_size_bytes,此字段
不限制
使用像素),并且不会限制非像素字节数
已平铺 宽高比非常窄或非常短的图片效果可能较差 每像素的像素数。内边距和/或 内存带宽开销往往会因极端宽高比增加。 参与者可能表示缺乏对“非常狭窄”或“非常短”的支持 使用 ['fuchsia.sysmem/ImageFormatConstraints.min_size`] 来表示 如果发送到系统内存,则取消设置会被视为 0xFFFFFFFF。 从 sysmem 接收内容时,此字段将始终设置,并且可以设置为 0xFFFFFFFF。 |
9 |
size_alignment |
fuchsia.math/SizeU
|
图片
如果未设置任何值,则视为 1, 1。 |
10 |
display_rect_alignment |
fuchsia.math/SizeU
|
如果未设置任何值,则视为 1, 1。 |
11 |
required_min_size |
fuchsia.math/SizeU
|
这些字段可用于确保聚合限制条件
例如,生产者视频解码器不希望限制
允许的 再举一个例子,意在对视频进行解码的发起方
知道串流中的帧的最大预期大小
因此,通过设置 提供方或发起者经常会设置这些字段 而不是让使用方设置这些字段 而 此字段通过计算每个组成部分的最小值和 required_max_size 通过计算每个组件的最大值来汇总。 如果未设置,则视为 0xFFFFFFFF、0xFFFFFFFF。 |
12 |
required_max_size |
fuchsia.math/SizeU
|
另请参阅 |
13 |
bytes_per_row_divisor |
uint32
|
当 intent 存在以下情况时,最好使用 如果意图是为了确保 虽然任何值 |
14 |
start_offset_divisor |
uint32
|
不建议 Producer 参与者设置非零图像开始 偏移(相对于缓冲区基数)除非实际需要,因为并非所有 正确处理非零图像开始偏移。 |
15 |
pixel_format_and_modifiers |
vector<PixelFormatAndModifier>[64]
|
(额外的)fuchsia.sysmem2/PixelFormatAndModifier 并遵循以下限制条件 举个非限制性的例子,如果参与者只想设置单个
如果设置了 服务器将 在 在对 来自 一个 另请参阅 |
16 |
require_bytes_per_row_at_pixel_boundary |
bool
|
Iff 设置且值为 true,结果中的 bytes_per_row_divisor ImageFormatConstraints 肯定是 将字节数设为整数。这可能会导致 与未将此字段设置为 0 时相比,每行末尾的内边距 true,但确保步长可以表示为整数 像素值。 例如,如果所选 |
NodeIsAlternateForRequest 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
node_ref |
handle<event>
|
NodeSetDebugClientInfoRequest
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
name |
string[256]
|
|
2 |
id |
uint64
|
NodeSetDebugTimeoutLogDeadlineRequest
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
deadline |
zx/Time
|
NodeSetNameRequest
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
priority |
uint32
|
|
2 |
name |
string[64]
|
NodeSetWeakOkRequest 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
for_child_nodes_also |
bool
|
Node_GetBufferCollectionId_Response
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
buffer_collection_id |
uint64
|
Node_GetNodeRef_Response 资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
node_ref |
handle<event>
|
Node_IsAlternateFor_Response
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
is_alternate |
bool
|
SingleBufferSettings
在 fuchsia.sysmem2/results.fidl 中定义
这些设置和约束条件适用于集合中的所有缓冲区。
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
buffer_settings |
BufferMemorySettings
|
此字段将始终由 sysmem 设置。 |
2 |
image_format_constraints |
ImageFormatConstraints
|
保存数据不是未压缩图片数据的缓冲区将没有 此字段。用于存放未压缩图片数据的缓冲区 可以设置此字段。 至少目前,更改 PixelFormat 需要重新分配 缓冲区。 如果此政策未设置,对图片格式没有任何限制。 |
VmoBuffer 资源
在 fuchsia.sysmem2/results.fidl 中定义
Ordinal | 字段 | 类型 | 说明 |
---|---|---|---|
1 |
vmo |
handle<vmo>
|
如果参与者只有 |
2 |
vmo_usable_start |
uint64
|
第一个可用字节的 VMO 内的偏移量。必须小于VMO 的大小 (以字节为单位),并为 BufferMemorySettings.size_bytes 留出足够的空间 在 VMO 结束之前 目前,sysmem 会始终将此字段设置为 0,将来,sysmem 会始终将此字段设置为 0 不会将此字段设置为非零值,除非所有参与者 明确表明支持非零 vmo_usable_start(此 机制不存在)。尚未参加 明确指出支持非零 vmo_usable_start(当前所有 客户端)应隐式假定此字段已设置为 0, 实际查看过这个字段 |
3 |
close_weak_asap |
handle<eventpair>
|
当且仅当 |
联合体
Allocator_GetVmoInfo_Result 严格的 资源
在 fuchsia.sysmem2/allocator.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
Allocator_GetVmoInfo_Response
|
|
2 |
err |
Error
|
|
3 |
framework_err |
internal
|
Allocator_ VerifyBufferCollectionToken_Result 严格
在 fuchsia.sysmem2/allocator.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
Allocator_ValidateBufferCollectionToken_Response
|
|
3 |
framework_err |
internal
|
BufferCollectionTokenGroup_CreateChildrenSync_Result 严格的资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
BufferCollectionTokenGroup_CreateChildrenSync_Response
|
|
3 |
framework_err |
internal
|
BufferCollectionToken_DuplicateSync_Result 严格的资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
BufferCollectionToken_DuplicateSync_Response
|
|
3 |
framework_err |
internal
|
BufferCollection_CheckAllBuffersAlality_Result 需要严格
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
BufferCollection_CheckAllBuffersAllocated_Response
|
|
2 |
err |
Error
|
|
3 |
framework_err |
internal
|
BufferCollection_WaitForAllBuffersAltitude_Result 严格的资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
BufferCollection_WaitForAllBuffersAllocated_Response
|
|
2 |
err |
Error
|
|
3 |
framework_err |
internal
|
Node_GetBufferCollectionId_Result 严格
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
Node_GetBufferCollectionId_Response
|
|
3 |
framework_err |
internal
|
Node_GetNodeRef_Result 严格资源
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
Node_GetNodeRef_Response
|
|
3 |
framework_err |
internal
|
Node_IsAlternateFor_Result 严格
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
Node_IsAlternateFor_Response
|
|
2 |
err |
Error
|
|
3 |
framework_err |
internal
|
Node_Sync_Result 严格
在 fuchsia.sysmem2/collection.fidl 中定义
Ordinal | 变体 | 类型 | 说明 |
---|---|---|---|
1 |
response |
Node_Sync_Response
|
|
3 |
framework_err |
internal
|