通訊協定
分配器
定義於 fuchsia.sysmem2/allocator.fidl
分配系統記憶體緩衝區。
這個通訊協定中不使用 Epitaph 語言,
AllocateNonSharedCollection
代表單一用戶端分配緩衝區集合 (即 發起人) 也是唯一的參與者 (從觀點來看) sysmem)。
這項呼叫主要用於臨時/測試用途。這場呼叫會略過 fuchsia.sysmem2/BufferCollectionToken 階段,因此無法 允許其他參與者指定其限制條件。
鼓勵真實客戶使用
改為 fuchsia.sysmem2/Allocator.AllocateSharedCollection,以及
讓相關參與者直接表達自身限制
將 BufferCollectionToken
傳送給這些參與者,藉此建立 sysmem。
- 要求
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
伺服器端點之前為 傳送到 sysmem fuchsia.sysmem2/Allocator.AllocateSharedCollection,或該群組的伺服器 結尾是透過 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 不屬於「sysmem VMO」。
- 要求
vmo
向 sysmem 提供的 VMO 的控制代碼 (或查看錯誤)。
- 回應
buffer_collection_id
緩衝區集合 ID, 每次啟動每個邏輯緩衝區集合皆不重複。 - 回應
buffer_index
內部緩衝區的緩衝區索引 緩衝區收集。這與其中緩衝區的索引相同 fuchsia.sysmem2/BufferCollectionInfo.buffers。buffer_index
所有 sysmem 交付的 VMO 都會擁有相同的 邏輯緩衝區 (即使 VMO 控制器不同)。buffer_index
是 僅在緩衝區集合的緩衝區中不重複對於指定的緩衝區buffer_collection_id
和buffer_index
的組合是唯一的 每次啟動。 - 回應
close_weak_asap
如果vmo
是弱 sysmem VMO 的控制代碼, 系統會在回應中設定close_weak_asap
欄位。這個帳號代碼 所有低度 VMO 控制代碼ZX_EVENTPAIR_PEER_CLOSED
緩衝區應盡快關閉。這可發出訊號 所有對緩衝區的 sysmem VMO 關閉不久後 (包括任何透過強力BufferCollectionToken
間接保留,或 強大的BufferCollection
)。無法關閉所有低度 sysmem VMO 在ZX_EVENTPAIR_PEER_CLOSED
發生時快速控制緩衝區 視為 VMO 外洩情形,是因為用戶端仍保有弱勢系統的漏洞 VMO 會處理異常情況,並導致 sysmem 對記錄檔產生大量投訴。 集合的緩衝區可彼此獨立釋放。ZX_EVENTPAIR_PEER_CLOSED
可能已在 回應到用戶端後未準備好處理的用戶端 低強度 sysmem VMO 看到這個欄位時,可以關閉所有帳號代碼 緩衝區並失敗任何相關的要求
- 錯誤
[fuchsia.sysmem2/Error.NOT_FOUND]
- vmo 不是 sysmem VMO。強大和弱的 sysmem 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/Allocator 所建立
包括透過程式建立的任何 fuchsia.sysmem2/BufferCollection
fuchsia.sysmem2/Allocator.BindSharedCollection (沒有
之前對 fuchsia.sysmem2/Allocator.SetDebugClientInfo 的呼叫,
這些 BufferCollection
的初始偵錯用戶端資訊與
產生 BufferCollection
的憑證。
您之後可以為每個 Node
覆寫這項資訊。
傳送 fuchsia.sysmem2/Node.SetDebugClientInfo。
每傳送一次 fuchsia.sysmem2/Allocator.SetDebugClientInfo
Allocator
是最有效率的做法
fuchsia.sysmem2/Node 會至少包含一些偵錯用戶端資訊
也比單獨傳送相同的偵錯檔案
透過 fuchsia.sysmem2/Node.SetDebugClientInfo 取得用戶端資訊
已建立 fuchsia.sysmem2/Node。
- 要求
name
這可以是任意字串,但目前的 程序名稱 (請參閱fsl::GetCurrentProcessName
) 就是很好的預設值。 - 要求
id
這可以是任意 ID,但目前程序 ID (請參閱fsl::GetCurrentProcessKoid
) 是很好的預設值。
要求
名稱 | 類型 |
---|---|
payload |
AllocatorSetDebugClientInfoRequest
|
ValidateBufferCollectionToken
檢查 fuchsia.sysmem2/BufferCollectionToken Symem 伺服器
透過這項呼叫,用戶端可以判斷傳入的權杖是否為 Symem 伺服器已知的實際 sysmem 權杖,沒有任何風險 免於等待可能的假代詞完成作業 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync 或 fuchsia.sysmem2/BufferCollectionToken.Sync (或任何其他雙向的雙向關係) FIDL 訊息)。用戶端信任權杖來源時 要提供實際權杖,通常不需要在 以及偵錯
如果驗證失敗但有時失敗, 權杖本身可能未呼叫 fuchsia.sysmem2/BufferCollectionToken.Sync 或 建立/複製 Deployment 後 fuchsia.sysmem2/BufferCollection.Sync 權杖,在將權杖傳送至目前用戶端之前。新版本 讓原始碼 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync 權杖,因為該呼叫內建同步步驟。或緩衝區 在 sysmem 處理此呼叫之前,收集作業可能會失敗 伺服器,當緩衝區收集失敗時,系統會清除 sysmem 對 相關聯的符記
這個呼叫不會對任何權杖產生影響。
- 要求
token_server_koid
管道伺服器端的 KOid 可能是 BufferCollectionToken 管道您可以取得 透過zx_object_get_info
ZX_INFO_HANDLE_BASIC
related_koid
。
- 回應
is_known
true 表示 sysmem 在當時知道符記 sysmem 已處理要求,但並不保證符記一定是 仍然有效。功用 保證至少該符記是真實符記,因此 呼叫權杖時不會停滯 (將失敗或成功呼叫) 而非停滯)。如果 可提供實際權杖,值得信任。是 值表示 sysmem 時,Smem 不知道該符記 已處理過這項呼叫,但權杖先前可能有效,或 可能因此成為有效狀態。或者,如果權杖傳送者不受信任, 提供實際權杖,這個權杖可能是假的 與 sysmem 同步的寄件者名部分,確保之前 Symem 會先得知建立/重複的符記,然後才會傳送 權杖指派給其他參與者。
要求
名稱 | 類型 |
---|---|
payload |
AllocatorValidateBufferCollectionTokenRequest
|
回應
名稱 | 類型 |
---|---|
payload |
Allocator_ValidateBufferCollectionToken_Result
|
BufferCollection
定義於 fuchsia.sysmem2/collection.fidl
fuchsia.sysmem2/BufferCollection 是直接來自
加入 sysmem re緩衝區收集;通常是緩衝區收集
將與有自己的 BufferCollection
的其他參與者共用
與相同緩衝區集合相關聯的用戶端端點。也就是
BufferCollection
介面的執行個體是緩衝區的檢視畫面
而非緩衝區收集本身
BufferCollection
連線的用意是協助非同步指標,
緩衝區集合已填入緩衝區時。
此外,當 sysmem 伺服器關閉管道時
用戶端應關閉所有取自此網路的 VMO 控制代碼
盡快 BufferCollection
。
某些緩衝區集合可能會使用足夠的記憶體,因此建議避免 使用 fuchsia.sysmem2/BufferCollection.AttachLifetimeTracking 啟動器可以瞭解緩衝區收集作業是否已達到足夠的緩衝區 在啟動者分配新的緩衝區集合之前,就先行釋放。
這個通訊協定中不使用 Epitaph 語言,
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
此事件配對控點將由 Symem 伺服器 (最初分配到緩衝區時, 緩衝區數量小於或等於buffers_remaining
。 - 要求
buffers_remaining
等待所有狀態 (buffers_remaining
除外),或 才能完整配置緩衝區。大於 0 的數字 這在已知有大量緩衝區的情況下可能會很有用 刻意關閉,不讓資料繼續使用 例如,在 UI 中保留最後一個可用影片影格 (即使影片串流使用受保護的輸出緩衝區)。是 在BufferCollection
介面的範圍之外 (至少 ),決定在不關閉的情況下可保留的緩衝區數量,但 通常會介於 0 至 2 之間。
要求
名稱 | 類型 |
---|---|
payload |
BufferCollectionAttachLifetimeTrackingRequest
|
AttachToken
建立新符記,將新的參與者新增至現有邏輯 緩衝區收集 (如果現有集合的緩衝區數量) 和參與者允許
這有助於取代失敗的參與者,和/或 在緩衝區後新增/重新新增參與者
使用 fuchsia.sysmem2/BufferCollection.AttachToken
源自於附屬 fuchsia.sysmem2/BufferCollectionToken 的樹狀結構
進行一般設定程序
fuchsia.sysmem2/Node,這樣系統便看起來似乎從該節點分配緩衝區
客戶儘管可能會遇到所有緩衝區
事實上,系統先前分配到的 4 個 Pod這項程序稱為
。「分配」的多數例項在其他郵件中
也能讀取為「分配或邏輯分配」剩餘期間
但我們會直接說出「allocation」確保內容簡潔/清晰
並詳細介紹「邏輯分配」左側是
有關 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
(在已建立的子樹狀結構中,但不屬於此
子樹狀結構) 參與限制及其父項
父項分配或邏輯分配期間
類似於 fuchsia.sysmem2/BufferCollectionToken.Duplicate,
新建立的權杖必須設為 fuchsia.sysmem2/Node.Sync
Symem 的 sysmem,才能傳遞新憑證給 BindSharedCollection
。
Sync
的
fuchsia.sysmem2/BufferCollection.Sync
BufferCollectionToken
轉換為 BufferCollection
。或者
新權杖上的 fuchsia.sysmem2/BufferCollectionToken.Sync
能夠正常運作。或使用 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync
能夠正常運作。如往常,BufferCollectionToken.Sync
可以在
BufferCollectionToken.Duplicate
訊息已透過新的
建立權杖,並透過
單程票。
目前所有的資料表欄位皆為必填。
- 要求
rights_attentuation_mask
。這麼做可讓您強化 VMO 。「rights_attenuation_mask
」的這些值 不會造成注意 (請注意,0 不在這份清單中):- ZX_RIGHT_SAME_RIGHTS (建議)
- 0xFFFFFFFF (適合在計算注意力遮罩時)
- 要求
token_request
:BufferCollectionToken
的伺服器端 頻道。用戶端會保留用戶端。
要求
名稱 | 類型 |
---|---|
payload |
BufferCollectionAttachTokenRequest
|
CheckAllBuffersAllocated
檢查輪詢中是否已分配所有緩衝區 。
- 如果緩衝區集合已分配,會傳回成功。
- 如果緩衝區收集失敗,則會傳回相同的 fuchsia.sysmem2/錯誤為 fuchsia.sysmem2/BufferCollection/WaitForAllBuffersAllocated 是指 傳回。
- 錯誤 fuchsia.sysmem2/Error.PENDING 緩衝區收集尚未 嘗試分配。這表示 waitForAllBuffersAlAddresses 無法快速回應
要求
<空白>
回應
名稱 | 類型 |
---|---|
payload |
BufferCollection_CheckAllBuffersAllocated_Result
|
GetBufferCollectionId
取得緩衝區集合 ID。這個 ID 也有:
fuchsia.sysmem2/Allocator.GetVmoInfo (以及 buffer_index
集合內)。
這種呼叫在無法傳達訊息時,主要就能派上用場
fuchsia.sysmem2/BufferCollectionToken 或
fuchsia.sysmem2/BufferCollection,但只能傳輸 VMO
控制代碼,可與 BufferCollection
用戶端彙整在一起
只有透過不同路徑建立的 Pod如果想傳達
盡可能直接BufferCollectionToken
或 BufferCollection
。
信任來自 sysmem 以外來源的 buffer_collection_id
值
類似於從 Zircon 以外的來源信任 koid 值。
除非確實有必要,否則應避免同時使用兩者,
。在某些情況下,可以參考
由 buffer_collection_id
透過BufferCollection
目的在於達到效率,但傳入值聲稱
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
- true:呼叫節點與
node_ref
Node
是BufferCollectionTokenGroup
。也就是說 呼叫Node
和node_ref
Node
不會同時 則不受 sysmem 選擇 不是兩者這是因為只有一個子的子系 邏輯運算子選取BufferCollectionTokenGroup
而且只會有一個子項子樹狀結構 限制匯總 - false:呼叫
Node
之間的第一個父項節點 且node_ref
Node
不是BufferCollectionTokenGroup
。 目前,共同中的第一個父項節點是BufferCollectionToken
或BufferCollection
(不論是否Release
後)。也就是說,呼叫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]
呼叫端傳遞 不是 zx.Handle:EVENT 控制代碼的node_ref
,或沒有 實際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
用戶端意外關閉
結束 (省略 Release
) 將觸發緩衝區失敗
集合。如要在不關閉使用者的情況下關閉 BufferCollectionTokenGroup
管道,請按照下列步驟操作:
緩衝區收集失敗,請確認 AllChildrenPresent() 已發送
,並在關閉BufferCollectionTokenGroup
前傳送 Release
用戶端。
如果Release
的發生時間早於
請 [fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of
Releasewithout 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/Node 會至少包含一些偵錯用戶端資訊
也比單獨傳送相同的偵錯檔案
透過 fuchsia.sysmem2/Node.SetDebugClientInfo 取得用戶端資訊
已建立 fuchsia.sysmem2/Node。
啟用詳細記錄功能時也會使用 (請參閱 SetVerboseLogging
):
指出哪位客戶先關閉頻道,再導向子樹狀結構
失敗 (如果子樹狀結構的用途已結束,則可能是正常情況,但
如果不是預期情況,則可使用用戶端專屬管道名稱
協助診斷故障來源
顯示比例)。
目前所有的資料表欄位皆為必填。
- 要求
name
這可以是任意字串,但目前的 程序名稱 (請參閱fsl::GetCurrentProcessName
) 就是很好的預設值。 - 要求
id
這可以是任意 ID,但目前程序 ID (請參閱fsl::GetCurrentProcessKoid
) 是很好的預設值。
要求
名稱 | 類型 |
---|---|
payload |
NodeSetDebugClientInfoRequest
|
SetDebugTimeoutLogDeadline
如果沒有發現 sysmem,Sysmem 會記錄警示 所有用戶端的 fuchsia.sysmem2/BufferCollection.SetConstraints 。
用戶端可以呼叫這個方法,以在記錄列印時變更。如果 多個用戶端設定了期限,因此系統已指定 就會生效。
在大部分的情況下,預設值可正常運作。
目前所有的資料表欄位皆為必填。
- 要求
deadline
sysmem 開始嘗試記錄的時間 警告,除非所有限制在此日期前出現 sysmem。
要求
名稱 | 類型 |
---|---|
payload |
NodeSetDebugTimeoutLogDeadlineRequest
|
SetName
為這個緩衝區集合中的 VMO 設定名稱。
如果名稱不適合在 ZX_MAX_NAME_LEN 中,請提供 Vmo 的名稱 系統會將圖片截斷以符合尺寸vmo 的名稱會加上 集合內的緩衝區索引 (如果後置字串符合 ZX_MAX_NAME_LEN).您在這裡指定的名稱 (不含截斷名稱) 將會 「檢查」項目
這個名稱只會影響在設定名稱後分配的 VMO;這場通話 無法重新命名現有的 VMO。如果多個客戶設定不同名稱 那麼優先順序較高的值勝出使用 優先順序與前一個名稱相同,名稱不會改變。
目前所有的資料表欄位皆為必填。
- 要求
priority
只有在此名稱是第一個SetName
時才會設定名稱 或priority
大於priority
在此緩衝區集合的所有Node
進行之前的SetName
呼叫。 - 要求
name
在此緩衝區集合下建立的 VMO 名稱。
要求
名稱 | 類型 |
---|---|
payload |
NodeSetNameRequest
|
SetVerboseLogging
這會啟用緩衝區集合的詳細記錄功能。
詳細記錄功能包括透過
每個用戶端的 fuchsia.sysmem2/BufferCollection.SetConstraints
與透過 fuchsia.sysmem2/Node.SetDebugClientInfo 設定的資訊 (或
fuchsia.sysmem2/Allocator.SetDebugClientInfo),以及
Node
的樹狀結構。
在匯總作業期間,Symem 只會顯示單一行申訴 失敗,只有匯總失敗的確切原因 但背景脈絡並不容易雖然這通常足以 如果隻小幅變更,一切運作正常 因此在進行微幅調整前,通常沒有辦法要求您 新的緩衝區集合首次運作特別是 包含更複雜的節點樹狀結構 fuchsia.sysmem2/BufferCollection.AttachToken fuchsia.sysmem2/BufferCollectionToken.SetDispensable、 fuchsia.sysmem2/BufferCollectionTokenGroup 節點,和相關 節點的子樹狀結構,詳細記錄可能有助於診斷 以及邏輯配置失敗的原因 子樹狀結構的執行速度比預期更快。
額外記錄的用意是可接受從效能來看 假設該詳細記錄功能已啟用 盡量減少緩衝區集合上的錯誤如果未追蹤錯誤 我們不會傳送這則訊息
要求
<空白>
SetWeak
設定目前的 fuchsia.sysmem2/Node 以及所有子項 Node
建立錯誤後所建立,表示客戶的 Node
用戶端端 (或在這則訊息之後建立的子項) 並非單獨的
足以讓分配的 VMO 保持運作
從低強度 Node
取得的所有 VMO 均為低 sysmem 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
),但 Sysem (刻意) 完全不會發現
直到所有 Node
都準備好配置為止。初始
分配成功,至少須存在一項高強度Node
但之後用戶端收到 VMO 控制代碼之後
用戶端可以BufferCollection.Release
並關閉用戶端
導致這類失敗行為
這也意味著 fuchsia.sysmem2/Node.SetWeakOk,但不會
暗示 SetWeakOk
且 for_children_also
為 true,可以傳送
視需要單獨使用
要求
<空白>
SetWeakOk
這樣 sysmem 就會知道客戶已準備好注意
close_weak_asap
。
如要傳送,這則訊息必須早於 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated。
所有使用弱 fuchsia.sysmem2/BufferCollection 的參與者都必須
請在 WaitForAllBuffersAllocated
前或家長的情況下傳送這則訊息
Node
必須傳送 fuchsia.sysmem2/Node.SetWeakOk,
for_child_nodes_also
true,否則 WaitForAllBuffersAllocated
會
觸發緩衝區收集失敗。
此訊息是必要的,因為低度的 sysmem VMO 通常
因此年長客戶沒注意到需要注意
close_weak_asap
ZX_EVENTPAIR_PEER_CLOSED
,並關閉所有項目
sysmem 弱 VMO 處理 Aap。看到這個訊息並要求
的參與者表示他們認同
通訊協定,可避免舊用戶端傳送較弱的
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
: 遵守close_weak_asap
各自的弱 VMO 控制代碼, 低強度 VMO 帳號代碼由持有相應子項的參與者所持有Node
。設定for_child_nodes_also
時,子系Node
使用 sysmem(1) 的結構可能較弱 sysmem1Node
並未直接與SetWeakOk
或任何 直接得知close_weak_asap
的相關資訊。僅適用於 這個Node
的子系,使用的是 sysmem(1),而不是 直接從 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
」用戶端會得知其他參與者
當權杖由另一端
並產生 Syem 程式
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
] 要求有效,但無法回應,可能是因為硬體問題 如果參與者和系統不相容,就可能發生這種情形 限制 (概略來說是空的十字路口)。查看以下記錄檔 瞭解詳情。如果參與者可能受到施暴 非必要,請參閱 BufferCollectionTokenGroup。使用 fuchsia.sysmem2/BufferCollection.AttachToken,這將是 如果現有的緩衝區空間不足 來滿足附加符記上設定的限制 任何衍生自附加權杖的子樹狀結構。
要求
<空白>
回應
名稱 | 類型 |
---|---|
payload |
BufferCollection_WaitForAllBuffersAllocated_Result
|
BufferCollectionToken
定義於 fuchsia.sysmem2/collection.fidl
fuchsia.sysmem2/BufferCollectionToken 並非緩衝區集合,但 較適合識別特定潛在共用緩衝區集合 並可將潛在共用緩衝區集合發布到 在緩衝區收集尚未配置任何 緩衝區。
這個通訊協定中不使用 Epitaph 語言,
我們使用 BufferCollectionToken
的管道,而非單一管道
eventpair
(配對),因為這樣我們就能偵測錯誤狀況,例如
在建立期間未能對參與者進行信任。
CreateBufferCollectionTokenGroup
在一組符記中建立邏輯 OR,稱為 fuchsia.sysmem2/BufferCollectionTokenGroup。
大部分的 sysmem 用戶端和許多參與者都不需要留意這一點
或約 BufferCollectionTokenGroup
的訊息。不過在某些情況下
參與者想將一組委派代表加入
但如果限制條件無法順利合併
會回復到另一組 (可能重疊) 的委派代表
和/或採用較嚴苛的策略
fuchisa.sysmem2/BufferCollectionConstraints 的嚴格程度
允許所有參與委派的參與者傳送資料)。在這種情況下,
BufferCollectionTokenGroup
非常實用。
BufferCollectionTokenGroup
可用來在 N 之間建立「N OR」的 1
子項 fuchsia.sysmem2/BufferCollectionToken。子權杖
而未在匯總期間選取的任何維度都會失敗 (關閉),但
潛在參與者會在BufferCollection
管道用戶端端點會看到 PEER_CLOSED,讓參與者能夠:
清除未完成的推測使用 (這個
運作異常終止時,正常 BufferCollection
伺服器
分配邏輯緩衝區集合或之後緩衝區的非同步失敗
集合)。
請參閱通訊協定 BufferCollectionTokenGroup
的註解。
尚未套用的任何 rights_attenuation_mask
或 AttachToken
/SetDispensable
只要在工具中
BufferCollectionToken
,以便做為
BufferCollectionTokenGroup
。
目前所有的資料表欄位皆為必填。
- 要求
group_request
;伺服器結束 透過 sysmem 提供的BufferCollectionTokenGroup
管道。
要求
名稱 | 類型 |
---|---|
payload |
BufferCollectionTokenCreateBufferCollectionTokenGroupRequest
|
複製
根據這個資料欄建立其他 fuchsia.sysmem2/BufferCollectionToken 第一,參照同一個緩衝區集合
系統產生的符記是這個符記的子項, fuchsia.sysmem2/節點階層。
這個方法可用來新增參與者,方法是將 已建立權杖給其他參與者。
你可以使用這則單向訊息取代雙向訊息 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync FIDL 呼叫 不適合等待模型 Symem 回應 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync,或 用戶端程式碼的結構不正確,無法輕鬆複製所有需要的 符記
傳送一或多則 Duplicate
訊息後,以及
提供給其他參與者 (或其他參與者
fuchsia.sysmem2/Allocator 管道),用戶端必須傳送
fuchsia.sysmem2/Node.Sync,然後等待 Sync
回應。
Sync
呼叫可在權杖或 BufferCollection
上執行
取得此權杖後 BindSharedCollection
即可。兩者擇一都會
確保伺服器知道透過 Duplicate
建立的權杖
然後,其他參與者透過個別的
Allocator
個管道。
所有權杖都必須透過
fuchsia.sysmem2/Allocator.BindSharedCollection 或
fuchsia.sysmem2/Node.Release 的 BufferCollection
寫入
成功分配緩衝區
目前所有的資料表欄位皆為必填。
- 要求
rights_attenuation_mask
權利位元皆為零 該遮罩就不會出現在緩衝區 VMO 權利中 用戶端結尾是token_request
。可讓發起者 媒介參與者須強化 。無法讓參與者取得權限 沒想到參與者尚未加入的訊息這個鍵ZX_RIGHT_SAME_RIGHTS
可用於指定沒有註意力 。- 下列 Rights_attenuation_mask 的值對應的值不會吸引註意:
ZX_RIGHT_SAME_RIGHTS
(建議)- 0xFFFFFFFF (這種情況下,當注意力遮罩 計算)
- 0 (已淘汰 - 不使用 0:錯誤會移至記錄)
- 下列 Rights_attenuation_mask 的值對應的值不會吸引註意:
- 要求
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
,將缺少權利位元 可透過相對應的回傳 產生下一個符記發起人或中介商 考量參與者可用的權利。請注意 取得參與者原本沒有的權利。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
用戶端彙整在一起
只有透過不同路徑建立的 Pod如果想傳達
盡可能直接BufferCollectionToken
或 BufferCollection
。
信任來自 sysmem 以外來源的 buffer_collection_id
值
類似於從 Zircon 以外的來源信任 koid 值。
除非確實有必要,否則應避免同時使用兩者,
。在某些情況下,可以參考
由 buffer_collection_id
透過BufferCollection
目的在於達到效率,但傳入值聲稱
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
- true:呼叫節點與
node_ref
Node
是BufferCollectionTokenGroup
。也就是說 呼叫Node
和node_ref
Node
不會同時 則不受 sysmem 選擇 不是兩者這是因為只有一個子的子系 邏輯運算子選取BufferCollectionTokenGroup
而且只會有一個子項子樹狀結構 限制匯總 - false:呼叫
Node
之間的第一個父項節點 且node_ref
Node
不是BufferCollectionTokenGroup
。 目前,共同中的第一個父項節點是BufferCollectionToken
或BufferCollection
(不論是否Release
後)。也就是說,呼叫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]
呼叫端傳遞 不是 zx.Handle:EVENT 控制代碼的node_ref
,或沒有 實際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
用戶端意外關閉
結束 (省略 Release
) 將觸發緩衝區失敗
集合。如要在不關閉使用者的情況下關閉 BufferCollectionTokenGroup
管道,請按照下列步驟操作:
緩衝區收集失敗,請確認 AllChildrenPresent() 已發送
,並在關閉BufferCollectionTokenGroup
前傳送 Release
用戶端。
如果Release
的發生時間早於
請 [fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of
Releasewithout 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/Node 會至少包含一些偵錯用戶端資訊
也比單獨傳送相同的偵錯檔案
透過 fuchsia.sysmem2/Node.SetDebugClientInfo 取得用戶端資訊
已建立 fuchsia.sysmem2/Node。
啟用詳細記錄功能時也會使用 (請參閱 SetVerboseLogging
):
指出哪位客戶先關閉頻道,再導向子樹狀結構
失敗 (如果子樹狀結構的用途已結束,則可能是正常情況,但
如果不是預期情況,則可使用用戶端專屬管道名稱
協助診斷故障來源
顯示比例)。
目前所有的資料表欄位皆為必填。
- 要求
name
這可以是任意字串,但目前的 程序名稱 (請參閱fsl::GetCurrentProcessName
) 就是很好的預設值。 - 要求
id
這可以是任意 ID,但目前程序 ID (請參閱fsl::GetCurrentProcessKoid
) 是很好的預設值。
要求
名稱 | 類型 |
---|---|
payload |
NodeSetDebugClientInfoRequest
|
SetDebugTimeoutLogDeadline
如果沒有發現 sysmem,Sysmem 會記錄警示 所有用戶端的 fuchsia.sysmem2/BufferCollection.SetConstraints 。
用戶端可以呼叫這個方法,以在記錄列印時變更。如果 多個用戶端設定了期限,因此系統已指定 就會生效。
在大部分的情況下,預設值可正常運作。
目前所有的資料表欄位皆為必填。
- 要求
deadline
sysmem 開始嘗試記錄的時間 警告,除非所有限制在此日期前出現 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
呼叫。 - 要求
name
在此緩衝區集合下建立的 VMO 名稱。
要求
名稱 | 類型 |
---|---|
payload |
NodeSetNameRequest
|
SetVerboseLogging
這會啟用緩衝區集合的詳細記錄功能。
詳細記錄功能包括透過
每個用戶端的 fuchsia.sysmem2/BufferCollection.SetConstraints
與透過 fuchsia.sysmem2/Node.SetDebugClientInfo 設定的資訊 (或
fuchsia.sysmem2/Allocator.SetDebugClientInfo),以及
Node
的樹狀結構。
在匯總作業期間,Symem 只會顯示單一行申訴 失敗,只有匯總失敗的確切原因 但背景脈絡並不容易雖然這通常足以 如果隻小幅變更,一切運作正常 因此在進行微幅調整前,通常沒有辦法要求您 新的緩衝區集合首次運作特別是 包含更複雜的節點樹狀結構 fuchsia.sysmem2/BufferCollection.AttachToken fuchsia.sysmem2/BufferCollectionToken.SetDispensable、 fuchsia.sysmem2/BufferCollectionTokenGroup 節點,和相關 節點的子樹狀結構,詳細記錄可能有助於診斷 以及邏輯配置失敗的原因 子樹狀結構的執行速度比預期更快。
額外記錄的用意是可接受從效能來看 假設該詳細記錄功能已啟用 盡量減少緩衝區集合上的錯誤如果未追蹤錯誤 我們不會傳送這則訊息
要求
<空白>
SetWeak
設定目前的 fuchsia.sysmem2/Node 以及所有子項 Node
建立錯誤後所建立,表示客戶的 Node
用戶端端 (或在這則訊息之後建立的子項) 並非單獨的
足以讓分配的 VMO 保持運作
從低強度 Node
取得的所有 VMO 均為低 sysmem 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
),但 Sysem (刻意) 完全不會發現
直到所有 Node
都準備好配置為止。初始
分配成功,至少須存在一項高強度Node
但之後用戶端收到 VMO 控制代碼之後
用戶端可以BufferCollection.Release
並關閉用戶端
導致這類失敗行為
這也意味著 fuchsia.sysmem2/Node.SetWeakOk,但不會
暗示 SetWeakOk
且 for_children_also
為 true,可以傳送
視需要單獨使用
要求
<空白>
SetWeakOk
這樣 sysmem 就會知道客戶已準備好注意
close_weak_asap
。
如要傳送,這則訊息必須早於 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated。
所有使用弱 fuchsia.sysmem2/BufferCollection 的參與者都必須
請在 WaitForAllBuffersAllocated
前或家長的情況下傳送這則訊息
Node
必須傳送 fuchsia.sysmem2/Node.SetWeakOk,
for_child_nodes_also
true,否則 WaitForAllBuffersAllocated
會
觸發緩衝區收集失敗。
此訊息是必要的,因為低度的 sysmem VMO 通常
因此年長客戶沒注意到需要注意
close_weak_asap
ZX_EVENTPAIR_PEER_CLOSED
,並關閉所有項目
sysmem 弱 VMO 處理 Aap。看到這個訊息並要求
的參與者表示他們認同
通訊協定,可避免舊用戶端傳送較弱的
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
: 遵守close_weak_asap
各自的弱 VMO 控制代碼, 低強度 VMO 帳號代碼由持有相應子項的參與者所持有Node
。設定for_child_nodes_also
時,子系Node
使用 sysmem(1) 的結構可能較弱 sysmem1Node
並未直接與SetWeakOk
或任何 直接得知close_weak_asap
的相關資訊。僅適用於 這個Node
的子系,使用的是 sysmem(1),而不是 直接從 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
」用戶端會得知其他參與者
當權杖由另一端
並產生 Syem 程式
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
Symem 實作與 分配 / 邏輯分配方式如下:
和往常一樣,邏輯分配方式會考慮根層級和所有具有
連至不會傳輸 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
的修剪子樹狀結構,
只會嘗試一次根據首次成功後的緩衝區分配情形
限制匯總作業失敗,整體邏輯分配作業會失敗 (
無需重試 / 重新嘗試緩衝區分配。如果緩衝區分配成功
(或者,由於經修剪的子樹狀結構並未包含
表示邏輯分配成功
如果這種優先配置方式無法合理用於您的 Symem,歡迎聯絡 Sysmem 他們與我們討論可能 以達成您的需求
請避免大量建立BufferCollectionTokenGroup
邏輯分配,特別是整體子項數量眾多時
尤其是在可合理預期匯總
無法使用序數 0 子項,也可能包含後面的子項。
Sysmem 減輕評估過多問題的可能性
子項組合/選擇項目數量過多,
邏輯分配範圍超過一定 (相當高但非龐大) 上限
當做群組子項組合/選項的條件。進階 (及其他功能)
複雜) 緩解措施並非實際必要
值得增加的複雜性如果上限是 sysmem 使用者,請與 sysmem 人員聯絡
或預期流量會下滑
只要設定成「自動重新啟動」
和「在主機維護期間」選項即可
偏好在fuchsia.sysmem2ImageFormatConstraints
單一 fuchsia.sysmem2/BufferCollectionConstraints (如果可行的話)
參與者只要表達出與員工之間
單個 fuchsia.images2/PixelFormat,並選用 sysmem 的
PixelFormat
在所有參與者支援的範圍內使用。
類似 fuchsia.sysmem2/BufferCollectionToken 和
fuchsia.sysmem2/BufferCollection,關閉
BufferCollectionTokenGroup
管道未傳送
先透過 fuchsia.sysmem2/Node.Release 將緩衝區收集失敗
(如果使用
fuchsia.sysmem2/BufferCollectionToken.SetDispensable 或
fuchsia.sysmem2/BufferCollection.AttachToken
BufferCollectionTokenGroup
是這類節點底下某個子樹狀結構的一部分
因此無法將失敗情形傳播至父項)
這個通訊協定中不使用 Epitaph 語言,
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
用戶端彙整在一起
只有透過不同路徑建立的 Pod如果想傳達
盡可能直接BufferCollectionToken
或 BufferCollection
。
信任來自 sysmem 以外來源的 buffer_collection_id
值
類似於從 Zircon 以外的來源信任 koid 值。
除非確實有必要,否則應避免同時使用兩者,
。在某些情況下,可以參考
由 buffer_collection_id
透過BufferCollection
目的在於達到效率,但傳入值聲稱
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
- true:呼叫節點與
node_ref
Node
是BufferCollectionTokenGroup
。也就是說 呼叫Node
和node_ref
Node
不會同時 則不受 sysmem 選擇 不是兩者這是因為只有一個子的子系 邏輯運算子選取BufferCollectionTokenGroup
而且只會有一個子項子樹狀結構 限制匯總 - false:呼叫
Node
之間的第一個父項節點 且node_ref
Node
不是BufferCollectionTokenGroup
。 目前,共同中的第一個父項節點是BufferCollectionToken
或BufferCollection
(不論是否Release
後)。也就是說,呼叫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]
呼叫端傳遞 不是 zx.Handle:EVENT 控制代碼的node_ref
,或沒有 實際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
用戶端意外關閉
結束 (省略 Release
) 將觸發緩衝區失敗
集合。如要在不關閉使用者的情況下關閉 BufferCollectionTokenGroup
管道,請按照下列步驟操作:
緩衝區收集失敗,請確認 AllChildrenPresent() 已發送
,並在關閉BufferCollectionTokenGroup
前傳送 Release
用戶端。
如果Release
的發生時間早於
請 [fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of
Releasewithout 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/Node 會至少包含一些偵錯用戶端資訊
也比單獨傳送相同的偵錯檔案
透過 fuchsia.sysmem2/Node.SetDebugClientInfo 取得用戶端資訊
已建立 fuchsia.sysmem2/Node。
啟用詳細記錄功能時也會使用 (請參閱 SetVerboseLogging
):
指出哪位客戶先關閉頻道,再導向子樹狀結構
失敗 (如果子樹狀結構的用途已結束,則可能是正常情況,但
如果不是預期情況,則可使用用戶端專屬管道名稱
協助診斷 Symem 的
顯示比例)。
目前所有的資料表欄位皆為必填。
- 要求
name
這可以是任意字串,但目前的 程序名稱 (請參閱fsl::GetCurrentProcessName
) 就是很好的預設值。 - 要求
id
這可以是任意 ID,但目前程序 ID (請參閱fsl::GetCurrentProcessKoid
) 是很好的預設值。
要求
名稱 | 類型 |
---|---|
payload |
NodeSetDebugClientInfoRequest
|
SetDebugTimeoutLogDeadline
如果沒有發現 sysmem,Sysmem 會記錄警示 所有用戶端的 fuchsia.sysmem2/BufferCollection.SetConstraints 。
用戶端可以呼叫這個方法,以在記錄列印時變更。如果 多個用戶端設定了期限,因此系統已指定 就會生效。
在大部分的情況下,預設值可正常運作。
目前所有的資料表欄位皆為必填。
- 要求
deadline
sysmem 開始嘗試記錄的時間 警告,除非所有限制在此日期前出現 sysmem。
要求
名稱 | 類型 |
---|---|
payload |
NodeSetDebugTimeoutLogDeadlineRequest
|
SetName
為這個緩衝區集合中的 VMO 設定名稱。
如果名稱不適合在 ZX_MAX_NAME_LEN 中,請提供 Vmo 的名稱 系統會將圖片截斷以符合尺寸vmo 的名稱會加上 集合內的緩衝區索引 (如果後置字串符合 ZX_MAX_NAME_LEN).您在這裡指定的名稱 (不含截斷名稱) 將會 「檢查」項目
這個名稱只會影響在設定名稱後分配的 VMO;這場通話 無法重新命名現有的 VMO。如果多個客戶設定不同名稱 那麼優先順序較高的值勝出使用 優先順序與前一個名稱相同,名稱不會改變。
目前所有的資料表欄位皆為必填。
- 要求
priority
只有在此名稱是第一個SetName
時才會設定名稱 或priority
大於priority
在此緩衝區集合的所有Node
進行之前的SetName
呼叫。 - 要求
name
在此緩衝區集合下建立的 VMO 名稱。
要求
名稱 | 類型 |
---|---|
payload |
NodeSetNameRequest
|
SetVerboseLogging
這會啟用緩衝區集合的詳細記錄功能。
詳細記錄功能包括透過
每個用戶端的 fuchsia.sysmem2/BufferCollection.SetConstraints
與透過 fuchsia.sysmem2/Node.SetDebugClientInfo 設定的資訊 (或
fuchsia.sysmem2/Allocator.SetDebugClientInfo),以及
Node
的樹狀結構。
在匯總作業期間,Symem 只會顯示單一行申訴 失敗,只有匯總失敗的確切原因 但背景脈絡並不容易雖然這通常足以 如果隻小幅變更,一切運作正常 因此在進行微幅調整前,通常沒有辦法要求您 新的緩衝區集合首次運作特別是 包含更複雜的節點樹狀結構 fuchsia.sysmem2/BufferCollection.AttachToken fuchsia.sysmem2/BufferCollectionToken.SetDispensable、 fuchsia.sysmem2/BufferCollectionTokenGroup 節點,和相關 節點的子樹狀結構,詳細記錄可能有助於診斷 以及邏輯配置失敗的原因 子樹狀結構的執行速度比預期更快。
額外記錄的用意是可接受從效能來看 假設該詳細記錄功能已啟用 盡量減少緩衝區集合上的錯誤如果未追蹤錯誤 我們不會傳送這則訊息
要求
<空白>
SetWeak
設定目前的 fuchsia.sysmem2/Node 以及所有子項 Node
建立錯誤後所建立,表示客戶的 Node
用戶端端 (或在這則訊息之後建立的子項) 並非單獨的
足以讓分配的 VMO 保持運作
從低強度 Node
取得的所有 VMO 均為低 sysmem 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
),但 Sysem (刻意) 完全不會發現
直到所有 Node
都準備好配置為止。初始
分配成功,至少須存在一項高強度Node
但之後用戶端收到 VMO 控制代碼之後
用戶端可以BufferCollection.Release
並關閉用戶端
導致這類失敗行為
這也意味著 fuchsia.sysmem2/Node.SetWeakOk,但不會
暗示 SetWeakOk
且 for_children_also
為 true,可以傳送
視需要單獨使用
要求
<空白>
SetWeakOk
這樣 sysmem 就會知道客戶已準備好注意
close_weak_asap
。
如要傳送,這則訊息必須早於 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated。
所有使用弱 fuchsia.sysmem2/BufferCollection 的參與者都必須
請在 WaitForAllBuffersAllocated
前或家長的情況下傳送這則訊息
Node
必須傳送 fuchsia.sysmem2/Node.SetWeakOk,
for_child_nodes_also
true,否則 WaitForAllBuffersAllocated
會
觸發緩衝區收集失敗。
此訊息是必要的,因為低度的 sysmem VMO 通常
因此年長客戶沒注意到需要注意
close_weak_asap
ZX_EVENTPAIR_PEER_CLOSED
,並關閉所有項目
sysmem 弱 VMO 處理 Aap。看到這個訊息並要求
的參與者表示他們認同
通訊協定,可避免舊用戶端傳送較弱的
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
: 遵守close_weak_asap
各自的弱 VMO 控制代碼, 低強度 VMO 帳號代碼由持有相應子項的參與者所持有Node
。設定for_child_nodes_also
時,子系Node
使用 sysmem(1) 的結構可能較弱 sysmem1Node
並未直接與SetWeakOk
或任何 直接得知close_weak_asap
的相關資訊。僅適用於 這個Node
的子系,使用的是 sysmem(1),而不是 直接從 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
」用戶端會得知其他參與者
當權杖由另一端
並產生 Syem 程式
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 管道
這個通訊協定中不使用 Epitaph 語言,
GetBufferCollectionId
取得緩衝區集合 ID。這個 ID 也有:
fuchsia.sysmem2/Allocator.GetVmoInfo (以及 buffer_index
集合內)。
這種呼叫在無法傳達訊息時,主要就能派上用場
fuchsia.sysmem2/BufferCollectionToken 或
fuchsia.sysmem2/BufferCollection,但只能傳輸 VMO
控制代碼,可與 BufferCollection
用戶端彙整在一起
只有透過不同路徑建立的 Pod如果想傳達
盡可能直接BufferCollectionToken
或 BufferCollection
。
信任來自 sysmem 以外來源的 buffer_collection_id
值
類似於從 Zircon 以外的來源信任 koid 值。
除非確實有必要,否則應避免同時使用兩者,
。在某些情況下,可以參考
由 buffer_collection_id
透過BufferCollection
目的在於達到效率,但傳入值聲稱
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
- true:呼叫節點與
node_ref
Node
是BufferCollectionTokenGroup
。也就是說 呼叫Node
和node_ref
Node
不會同時 則不受 sysmem 選擇 不是兩者這是因為只有一個子的子系 邏輯運算子選取BufferCollectionTokenGroup
而且只會有一個子項子樹狀結構 限制匯總 - false:呼叫
Node
之間的第一個父項節點 且node_ref
Node
不是BufferCollectionTokenGroup
。 目前,共同中的第一個父項節點是BufferCollectionToken
或BufferCollection
(不論是否Release
後)。也就是說,呼叫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]
呼叫端傳遞 不是 zx.Handle:EVENT 控制代碼的node_ref
,或沒有 實際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
用戶端意外關閉
結束 (省略 Release
) 將觸發緩衝區失敗
集合。如要在不關閉使用者的情況下關閉 BufferCollectionTokenGroup
管道,請按照下列步驟操作:
緩衝區收集失敗,請確認 AllChildrenPresent() 已發送
,並在關閉BufferCollectionTokenGroup
前傳送 Release
用戶端。
如果Release
的發生時間早於
請 [fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of
Releasewithout 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/Node 會至少包含一些偵錯用戶端資訊
也比單獨傳送相同的偵錯檔案
透過 fuchsia.sysmem2/Node.SetDebugClientInfo 取得用戶端資訊
已建立 fuchsia.sysmem2/Node。
啟用詳細記錄功能時也會使用 (請參閱 SetVerboseLogging
):
指出哪位客戶先關閉頻道,再導向子樹狀結構
失敗 (如果子樹狀結構的用途已結束,則可能是正常情況,但
如果不是預期情況,則可使用用戶端專屬管道名稱
協助診斷故障來源
顯示比例)。
目前所有的資料表欄位皆為必填。
- 要求
name
這可以是任意字串,但目前的 程序名稱 (請參閱fsl::GetCurrentProcessName
) 就是很好的預設值。 - 要求
id
這可以是任意 ID,但目前程序 ID (請參閱fsl::GetCurrentProcessKoid
) 是很好的預設值。
要求
名稱 | 類型 |
---|---|
payload |
NodeSetDebugClientInfoRequest
|
SetDebugTimeoutLogDeadline
如果沒有發現 sysmem,Sysmem 會記錄警示 所有用戶端的 fuchsia.sysmem2/BufferCollection.SetConstraints 。
用戶端可以呼叫這個方法,以在記錄列印時變更。如果 多個用戶端設定了期限,因此系統已指定 就會生效。
在大部分的情況下,預設值可正常運作。
目前所有的資料表欄位皆為必填。
- 要求
deadline
sysmem 開始嘗試記錄的時間 警告,除非所有限制在此日期前出現 sysmem。
要求
名稱 | 類型 |
---|---|
payload |
NodeSetDebugTimeoutLogDeadlineRequest
|
SetName
為這個緩衝區集合中的 VMO 設定名稱。
如果名稱不適合在 ZX_MAX_NAME_LEN 中,請提供 Vmo 的名稱 系統會將圖片截斷以符合尺寸vmo 的名稱會加上 集合內的緩衝區索引 (如果後置字串符合 ZX_MAX_NAME_LEN).您在這裡指定的名稱 (不含截斷名稱) 將會 「檢查」項目
這個名稱只會影響在設定名稱後分配的 VMO;這場通話 無法重新命名現有的 VMO。如果多個客戶設定不同名稱 那麼優先順序較高的值勝出使用 優先順序與前一個名稱相同,名稱不會改變。
目前所有的資料表欄位皆為必填。
- 要求
priority
只有在此名稱是第一個SetName
時才會設定名稱 或priority
大於priority
在此緩衝區集合的所有Node
進行之前的SetName
呼叫。 - 要求
name
在此緩衝區集合下建立的 VMO 名稱。
要求
名稱 | 類型 |
---|---|
payload |
NodeSetNameRequest
|
SetVerboseLogging
這會啟用緩衝區集合的詳細記錄功能。
詳細記錄功能包括透過
每個用戶端的 fuchsia.sysmem2/BufferCollection.SetConstraints
與透過 fuchsia.sysmem2/Node.SetDebugClientInfo 設定的資訊 (或
fuchsia.sysmem2/Allocator.SetDebugClientInfo),以及
Node
的樹狀結構。
在匯總作業期間,Symem 只會顯示單一行申訴 失敗,只有匯總失敗的確切原因 但背景脈絡並不容易雖然這通常足以 如果隻小幅變更,一切運作正常 因此在進行微幅調整前,通常沒有辦法要求您 新的緩衝區集合首次運作特別是 包含更複雜的節點樹狀結構 fuchsia.sysmem2/BufferCollection.AttachToken fuchsia.sysmem2/BufferCollectionToken.SetDispensable、 fuchsia.sysmem2/BufferCollectionTokenGroup 節點,和相關 節點的子樹狀結構,詳細記錄可能有助於診斷 以及邏輯配置失敗的原因 子樹狀結構的執行速度比預期更快。
額外記錄的用意是可接受從效能來看 假設該詳細記錄功能已啟用 盡量減少緩衝區集合上的錯誤如果未追蹤錯誤 我們不會傳送這則訊息
要求
<空白>
SetWeak
設定目前的 fuchsia.sysmem2/Node 以及所有子項 Node
建立錯誤後所建立,表示客戶的 Node
用戶端端 (或在這則訊息之後建立的子項) 並非單獨的
足以讓分配的 VMO 保持運作
從低強度 Node
取得的所有 VMO 均為低 sysmem 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
),但 Sysem (刻意) 完全不會發現
直到所有 Node
都準備好配置為止。初始
分配成功,至少須存在一項高強度Node
但之後用戶端收到 VMO 控制代碼之後
用戶端可以BufferCollection.Release
並關閉用戶端
導致這類失敗行為
這也意味著 fuchsia.sysmem2/Node.SetWeakOk,但不會
暗示 SetWeakOk
且 for_children_also
為 true,可以傳送
視需要單獨使用
要求
<空白>
SetWeakOk
這樣 sysmem 就會知道客戶已準備好注意
close_weak_asap
。
如要傳送,這則訊息必須早於 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated。
所有使用弱 fuchsia.sysmem2/BufferCollection 的參與者都必須
請在 WaitForAllBuffersAllocated
前或家長的情況下傳送這則訊息
Node
必須傳送 fuchsia.sysmem2/Node.SetWeakOk,
for_child_nodes_also
true,否則 WaitForAllBuffersAllocated
會
觸發緩衝區收集失敗。
此訊息是必要的,因為低度的 sysmem VMO 通常
因此年長客戶沒注意到需要注意
close_weak_asap
ZX_EVENTPAIR_PEER_CLOSED
,並關閉所有項目
sysmem 弱 VMO 處理 Aap。看到這個訊息並要求
的參與者表示他們認同
通訊協定,可避免舊用戶端傳送較弱的
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
: 遵守close_weak_asap
各自的弱 VMO 控制代碼, 低強度 VMO 帳號代碼由持有相應子項的參與者所持有Node
。設定for_child_nodes_also
時,子系Node
使用 sysmem(1) 的結構可能較弱 sysmem1Node
並未直接與SetWeakOk
或任何 直接得知close_weak_asap
的相關資訊。僅適用於 這個Node
的子系,使用的是 sysmem(1),而不是 直接從 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
」用戶端會得知其他參與者
當權杖由另一端
並產生 Syem 程式
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
|
特定修飾符 (而不僅是旗標) 或 |
無預設 |
ENUMS
CoherencyDomain 彈性
類型:uint32
定義於 fuchsia.sysmem2/constraints.fidl
INACCESSIBLE
僅適用於沒有 CPU 存取權
緩衝區。
無法從 CPU 存取的裝置本機記憶體為 CoherencyDomain
INACCESSIBLE
,即使可能會造成裝置 (例如實體或
虛擬) 將資料從 INACCESSIBLE
緩衝區複製到緩衝區
所有容器都不會顯示該物件換句話說,INACCESSIBLE 並不表示安全,
但安全意味著 存取權異常
CPU
代表生產者必須確保取用者能夠讀取產生的資料
而無需執行額外的快取作業
即可。
RAM
代表生產者必須確保產生的資料完全存在
中,沒有髒汙的 CPU 快取行,且取用端必須撤銷
使用 CPU 讀取資料前 (或先清除及撤銷) CPU 快取
例如 CPU相較於 CPU
網域,RAM
網域的速度可能比 CPU
網域快。
存取權是透過 HW DMA 進行,因為這樣就不需要進行 CPU 快取運算
因為沒有任何參與者實際使用 CPU 讀取/寫入
名稱 | 值 | 說明 |
---|---|---|
CPU |
0 |
|
RAM |
1 |
|
INACCESSIBLE |
2 |
錯誤彈性
類型:uint32
在 fuchsia.sysmem2/error.fidl 中定義的
無論錯誤代碼為何,在 如果有的話,
Error 值不應儲存在 zx_status_t 中,因為正值 zx_status_t 中的名稱已遭到淘汰
名稱 | 值 | 說明 |
---|---|---|
無效 |
0 |
這不是這個錯誤列舉的有效錯誤值。伺服器 傳遞此值做為失敗代碼。系統不會將這個值視為 「成功」。在某些語言中,出現在本機預設初始化的錯誤 執行個體會有這個值,除非透過有效的值來初始化 為正數的錯誤代碼 |
未指定 |
1 |
發生不明錯誤。 如果沒有其他適用的錯誤代碼,且發生錯誤,就會使用這個錯誤代碼 而不一定是由透過 傳送這個錯誤的管道 用戶端應將這項錯誤視為一般錯誤來處理。 例如,如果其他用戶端管道中有 用戶端無預警地關閉用戶端 (無 fuchsia.sysmem2/Node.Release),因此會導致 位於同一樹狀結構或子樹狀結構中的節點在此範例中 是否與接收客戶的「錯誤」無關?- 沒有理由 更具體,因為接收用戶端可能找不到 至少不會直接處理錯誤。 再舉一個例子,如果系統呼叫正常的系統呼叫, 失敗的預期失敗情形,也沒有找出原因 「blame」用戶端。 用戶端一律不應要求 / 依賴特定錯誤原因 仍會導致 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 建立。 如果用戶端的節點隸屬於某個群組,而另一個屬於另一個群組,就可能發生這種情況 改為選取群組子項。 |
待處理 |
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
分配的緩衝區限制,以及圖片上的限制 (選用) 儲存在緩衝區中您可以為每位參與者指定這些限制條件。 Symem 服務會從多個 位參與者。
Ordinal | 欄位 | 類型 | 說明 |
---|---|---|---|
1 |
usage |
BufferUsage
|
匯總 fuchsia.sysmem2/BufferCollectionConstraints 時,這些 位元-OR 值 至少須指定一個 如果指定 |
2 |
min_buffer_count_for_camping |
uint32
|
參與者可同時並行的緩衝區數量 保留專供獨家使用,時間不僅限於一段時間 (開放訓練營)。 在此情況下,「短暫」是指完成所需時間 執行小規模的非阻斷程式碼 而非緩衝區的擁有權像是從儲存空間讀取資料、等待 避免用於未知的硬體或進行其他操作 即使每秒影格編碼或解碼作業 有時可能很快會完成 舉例來說,影片解碼器會指定 (至少) 的參考影格 + 目前已解碼 1 個影格。但不是 1 通常能執行非同步作業 且能快速提供先前 即使該影格可能成為 暫時性時間長度與下一個影格解碼。 參與者不得坐在超過此處指定的緩衝區數量 (除非 短暫的空檔) 否則處理程序可能會停滯 匯總 BufferCollectionConstraints 時,請新增這些值。 在測試情境中,用比 停留時間很長 (在這個例子中,一個畫面重新整理週期「大幅」 時 (最好) 就會標記為失敗。測試中 系統可能會為參與者提供足夠緩衝區 以並行的方式進行 |
3 |
min_buffer_count_for_dedicated_slack |
uint32
|
讓每位參與者所需的緩衝區數量下限 以便處理重疊處理作業 / 成效更佳。 匯總 參與者通常會在此處指定 0 或 1,通常為 0
如果 在測試情境中,欄位可能強制設為 0,而所有
都希望參與者可以繼續工作如果
正向進度需要一個緩衝區,該緩衝區應該
在 |
4 |
min_buffer_count_for_shared_slack |
uint32
|
與「 參與者可以指定 >如果參與者想確保 會有一些配件 但不必特別留意 選擇要使用 在測試情境中,欄位可能強制設為 0,而所有
都希望參與者可以繼續工作如果
正向進度需要一個緩衝區,該緩衝區應該
在 |
5 |
min_buffer_count |
uint32
|
特別挑逗的參與者可能會想開會
如未設定這個欄位,邏輯 |
6 |
max_buffer_count |
uint32
|
特別挑逗的參與者可能會想開會
如未設定這個欄位,邏輯 |
7 |
buffer_memory_constraints |
BufferMemoryConstraints
|
打算設定 如未設定,用戶端會指定「Don't Care」Re.任何緩衝區記憶體 限制。 |
8 |
image_format_constraints |
vector<ImageFormatConstraints>[64]
|
儲存的圖片格式參數的選用限制
集合緩衝區中這包括
fuchsia.images2/PixelFormat 和 匯總時,只有 參與者可以指定 在 SetConstraints 訊息中,未設定或長度為 0,表示沒有圖片格式
限制;如果沒有其他參與者,則可分配原始緩衝區
指定任何 |
BufferCollectionInfo 資源
在 fuchsia.sysmem2/results.fidl 中定義的
緩衝區集合及其緩衝區的相關資訊。
Ordinal | 欄位 | 類型 | 說明 |
---|---|---|---|
1 |
settings |
SingleBufferSettings
|
這些設定會套用至初始緩衝區中的所有緩衝區 分配速度。 這個欄位一律由 sysmem 設定。 |
2 |
buffers |
vector<VmoBuffer>[128]
|
VMO 會針對 集合。 這個向量的大小為 buffer_count (未傳送 buffer_count)。 )。 所有緩衝區 VMO 控制代碼的大小和存取權都相同。檔案大小 位於 settings.buffer_settings.size_bytes。 VMO 存取權限取決於 是與尋找緩衝區集合時指定的用戶端。舉例來說 表示唯讀用量的用戶端會收到沒有寫入的 VMO 權利。另外, 參數可強化權限, BufferCollectionToken.Duplicate() 呼叫。 這個欄位一律包含 VmoBuffer,即使參與者亦然 會指定用途,不需要 VMO 控制代碼。這允許 參與者,才能知道 vmo_usable_start 值 (如果是 參加者使用。 這個欄位將一律由 sysmem 設定 指定任何緩衝區使用 (但 fuchsia.sysmem2/VmoBuffer.vmo 這類情況下不會設定這個欄位中的子欄位)。 |
3 |
buffer_collection_id |
uint64
|
每次啟動的所有邏輯緩衝區集合中,這個數字都是獨一無二的。 所有 BufferCollectionToken 的 ID 號碼都相同, BufferCollection(s) 和 BufferCollectionTokenGroup(s) 相同的邏輯緩衝區集合 (衍生自相同的根符記 使用 fuchsia.sysmem2.Allocator.CreateSharedCollection 建立,或 CreateNonSharedCollection)。 相同的 ID 可從 BufferCollectionToken 擷取 BufferCollection 或 BufferCollectionTokenGroup GetBufferCollectionId (從 sysmem 到 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_WaitForAllBuffersAlChanged_Response resource
定義於 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
|
未設定的值,就會視為 0xFFFFFFFFFFFFFFFF 。 |
3 |
physically_contiguous_required |
bool
|
如果設為 False,緩衝區 VMO 的實體頁面可能不連續。時間 true,緩衝區 VMO 的實體頁面必須連續。A 罩杯 即使用戶端不要求實際連續 VMO,仍必須接受 實體連續的 VMO 或「物理」VMO。 |
4 |
secure_required |
bool
|
如果為 true,參與者需要安全記憶體。 匯總 |
5 |
cpu_domain_supported |
bool
|
如果為 true (或 如果選取 CPU 網域,參與者必須確保 CPU 可以讀取 或是將資料寫入緩衝區,而不進行快取作業 參與者。 換句話說,若製作人選擇將 DMA 資料直接傳送到裝置上的 RAM 手臂等非快取一致性架構 CPU 快取是乾淨的進入 DMA 寫入前的緩衝區,以及 請在 DMA 寫入之後、 緩衝區。一般使用者 在非快取一致性架構 (例如: 選項,取用端必須在 DMA 前清除 CPU 快取緩衝區 讀取。 如果參與者僅支援 CPU 而不做任何 DMA ,則只需撰寫及讀取 緩衝區 (當它們正常顯示時),就不需要執行任何 CPU 快取運算。 |
6 |
ram_domain_supported |
bool
|
如果設為 True,則參與者可在 sysmem 中選取 RAM 網域時使用。 如果選取 RAM 網域,則必須在 RAM 中提供生產端資料 (CPU 快取狀態可使 RAM 資料不會因 CPU 快取行將不正確的資料寫入 RAM),以及取用端 使用 CPU 進行讀取前,必須先撤銷 CPU 快取,然後再讀取 ( 製片商不能保證沒有過時的「乾淨」快取行)。 換句話說,如果生產端參與者使用 CPU 將資料寫入 手臂等非快取連貫架構是指生產者 傳送資料到 RAM 後,再向其他參與者指出緩衝區 準備就緒。如果取用端使用 CPU 讀取 手臂等非快取一致性架構 作廢 (通常在知識沒有快取的情況下清除+失效 ) 讀取緩衝區前的 CPU 快取資料。 如果僅使用 RAM 的參與者未對緩衝區執行任何 CPU 存取權,可以執行以下動作 只要在緩衝區中/從緩衝區進行 DMA 即可 (在應該的時候) 不需要 執行任何 CPU 快取作業 |
7 |
inaccessible_domain_supported |
bool
|
如果設為 true,參與者可在 sysmem 中選取 INACCESSIBLE 網域。 如果選取 INACCESSIBLE 網域,CPU 讀取和寫入資料 會遭到阻斷嘗試使用 CPU 讀取/寫入資料可能會導致 及/或程序終止。 如果選取 INACCESSIBLE 網域,參與者就只能操作 根據 HW 執行的指定行銷區域或平台專屬指定行銷區域 (類似平台) 收集資料 傳送至安全環境的要求 (執行所需的 CPU 快取作業) 類似於 RAM 網域參與者運作的方式)。 安全堆積僅支援 INACCESSIBLE 網域,且將無法分配
如果不是 選取 INACCESSIBLE 網域後,參與者 (位於 安全/DRM 環境) 不得試圖對應緩衝區, 不會嘗試執行任何 CPU 快取作業以致於 與 RAM 網域類似,且所有參與者都僅執行 DMA,但沒有執行 執行 CPU 存取的參與者。 |
8 |
permitted_heaps |
vector<Heap>[64]
|
參與者可接受哪些堆積。不支援
請注意,要配置哪個堆積記憶體,應保留這個欄位。A 罩杯
只有在所有參與者皆明確表示時,系統才會選取安全堆積
透過 |
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 中定義的
這種類型是 fidl::Persist()'ed in sysmem_config.persistent_fidl 檔案 並由 Symem 讀取 sysmem 網域設定 驅動程式。
一般而言,JSON[5] 比較適合設定,但我們會產生這項設定 信任,使用 FIDL 類型 (以避免重複並利用 FIDL) rust codegen),而 FIDL 類型沒有 JSON 結構定義。
目前沒有在執行階段變更這項設定的機制 或是從啟動到開機這項設定在每次執行組合工具時為靜態。
請參閱 src/lib/assembly/config_schema/src/platform_config/sysmem_config.rs 直接在資訊板資訊中指定 sysmem 設定的各個層面 或組合平台設定sysmem 設定的兩個部分未包含 (目前) 重疊。這裡的設定適用於 sysmem 設定的各個層面 可能過於冗長,無法直接納入董事會資訊或組裝平台 設定檔。另外,部分/大多數像素格式的費用項目 透過程式產生 (從這個註解開始)。
在透過組合工具進行匯總之前,會有多個 .persistent_fidl 每個檔案都會儲存各自的 Config 執行個體董事會資訊與組件 平台設定會列出輸入 Persistent_fidl 檔案,以及主機資訊 進行邏輯性作業所有檔案清單是 ,以便後續檔案覆寫/取代先前檔案中的資訊。
由於此類型僅適用於永久 fidl, 序列化執行個體的長度不繫結,我們就不會繫結至內部 向量元素數量
Ordinal | 欄位 | 類型 | 說明 |
---|---|---|---|
1 |
format_costs |
vector<FormatCostEntry>
|
這份有排序的 FormatCost 項目將納入考量 在所有參與者支援的格式之間中斷連結時,Syemem 就會生效 緩衝區集合中 在設定匯總期間,如果後續項目有相符的 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 組合的設定。在其餘項目中 與匯總參與者用量相近, 來決定費用 (如果兩者相同,較晚的項目勝出)。接著, 並會選擇費用最低的格式。如果出價依舊不相同 (維持費用不相上下), 不分隨機,並非隨機破損。
這並不是我們禁止您選用的格式 緩衝區收集的所有參與者都支援此功能。如果參與者 聲稱支援某種格式,但無法正確處理該格式, 必須修正才能正確處理該格式,或是變更設定來停止聲明著作權 該格式支援。
此機制能影響系統選擇的格式選項,提供更多 更有效率的格式,而且記憶體頻寬用量較低 特定用量位元集等,將可能產生的疑慮 專屬於指定主機板或整體平台設定的專屬 ID。
Ordinal | 欄位 | 類型 | 說明 |
---|---|---|---|
1 |
key |
FormatCostKey
|
必須設定。如果兩個項目在邏輯上相等的鍵 (在欄位之後) 就會套用預設值),後的項目會覆寫先前的項目 |
2 |
cost |
float32
|
必須設定。成本較低,但也請查看 FormatCostKey 欄位。 請先依格式和用量位元篩選項目。 每個項目都提供兩個項目 (且每個專案的所有參與者支援的格式各不相同) 緩衝區收集) 的費用不同、成本較低 格式)。 如為非測試情境,只能使用費用值 >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
|
像素_format 和 pixel_format_modifier 是指定像素的 適用 FormatCost 資料。 必須設定。 |
2 |
pixel_format_modifier |
fuchsia.images2/PixelFormatModifier
|
像素_format 和 pixel_format_modifier 是指定像素的 適用 FormatCost 資料。 未設定會等同於 LINEAR。 |
3 |
buffer_usage_bits |
BufferUsage
|
設定後,只有當緩衝區集合在 至少設定的用量位元 緩衝區集合具有匯總的 BufferUsage,此為聯集 每位參與者的 BufferUsage 位元包含額外項目的 FormatCost 項目 指定的位元數都會遭到忽略。剩下的幾個格式 最常使用的位元組合會決定該格式的費用 緩衝區收集。 接著,系統會為緩衝區集合選擇費用最低的格式 所有參與者都能取代的格式 緩衝區收集。 這個欄位的主要用意是允許「關閉」這種格式 對於特定使用組合而言,效果卻不佳。 這樣一來,在有問題的組合時,費用可能就會偏高 的用量位元上限。如果格式是 緩衝區參與者的唯一支援格式 集合。 未設定會等同於設定的 0 位元位元數,表示適用項目 除非套用了其他更特定用途的項目 在某些情況下,對於所有項目會略過這個欄位,這是合理的情況, 當只根據格式費用選擇格式 (忽略使用) 時, 而負責任的 AI 技術做法 有助於達成這項目標 |
FormatCosts
在 fuchsia.sysmem2/config.fidl 中定義的
這是永久 fidl 的根,採用格式費用檔案。格式 費用檔案會由組合工具讀取,然後合併為單一 sysmem 網域設定中的 sysmem_config.persistent_fidl 檔案 (請參閱「設定」部分) )。
一般而言,JSON[5] 比較適合設定,但我們會產生這項設定 信任,使用 FIDL 類型 (以避免重複並利用 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]
|
堆積的類型,使用根據 「註解結構定義」和「方法」 fuchsia.sysmem.heap.bind 檔案。 例如:
|
2 |
id |
uint64
|
堆積的 uint64 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. Thie 欄位必須設為
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 時,如果參與者是
以便處理最小可行的非零圖像配置
受限於 製作人應設定 從 sysmem 收到時,一律會設定此欄位,且 寬度和高度會是 0,因為至少要有一位參與者 請指定大小的下限,不得為零 (寬度與高度皆不得留空) 零)。 另請參閱 |
5 |
max_size |
fuchsia.math/SizeU
|
大小上限 (以像素為單位)。例如,「風景」可能會設定這個欄位 ( 或以子參與者加入) 合併為可合成的大小上限。 如果是傳送到 sysmem,則未設定為 0xFFFFFFFF,0xFFFFFFFF。 如果接收自 sysmem,則一律會設定這個欄位。對於寬度和 高度,如果沒有強制執行上限,該子欄位就會是 0xFFFFFFFF。 另請參閱 |
6 |
min_bytes_per_row |
uint32
|
每個資料列的最小位元組數,包括超出 連續的圖片資料 這有時也稱為「步距 (以位元組為單位)」或「換行」 位移」。如果是單一飛機格式,這是指每列的位元組數 比方針。如果是多飛機格式,這是指每列的位元組數 平面 0 的樣本數 (例如 Lulla 中每列的位元組數 範例)。多飛機適用 飛機 0 以外的平面中每列的位元組數是格式 特定但一律與平面之間有特定關係 列。 將 當 sysmem 收到這個結構時,這個欄位將永遠
設定 (當父項結構有) 時,且至少必須為
部分製作人可能傾向
|
7 |
max_bytes_per_row |
uint32
|
每個資料列的位元組數上限,包括超出 連續的圖片資料 傳送至 sysmem 時,必須 >= 隱含的值, 系統會將傳送到 sysmem 但未設定的值視為 0xFFFFFFFF。 從 sysmem 收到時,系統會一律設定這個欄位。如果最大值為 這個值會是 0xFFFFFFFF (而非 0),才能無限大。 |
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`] 的尺寸。 系統會將傳送到 sysmem 但未設定的值視為 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 視為 0xFFFFFFFF。 |
12 |
required_max_size |
fuchsia.math/SizeU
|
另請參閱 |
13 |
bytes_per_row_divisor |
uint32
|
在意圖時使用 傾向使用 雖然任何 |
14 |
start_offset_divisor |
uint32
|
製作者不建議將圖片的起始畫面設為零 除非實際需要,否則偏移 (與緩衝區基之間) 的偏移值 應能正確處理非零影像開始位移。 |
15 |
pixel_format_and_modifiers |
vector<PixelFormatAndModifier>[64]
|
(額外) fuchsia.sysmem2/PixelFormatAndModifier 相關限制如下 做為非限制的例子,如果參與者只想設定單一
如果設定 伺服器將 在 回應
另請參閱 |
16 |
require_bytes_per_row_at_pixel_boundary |
bool
|
若已設定且為 true,則產生的位元組_per_row_divisor ImageFormatConstraints 保證值為 個位元組_per_row 代表像素的整數。這麼做 每列末端的邊框間距;如果不將這個欄位設為 是,但可確保步距能夠以整數表示 比方針。 舉例來說,如果所選 |
NodeIsAlternativeForRequest 資源
定義於 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 不會將這個欄位設為非零的值,除非所有參與者都有 明確表示支援非零 vmo_usable_start (這個 這類機制不存在。未提及的參與者 明確表示支援非零 vmo_usable_start (全部 用戶端) 應默示將這個欄位設為 0,而不將這個欄位設為 0 實際上檢查的是這個欄位 |
3 |
close_weak_asap |
handle<eventpair>
|
如果 |
聯合國
Allocator_GetVmoInfo_Result 嚴格 資源
定義於 fuchsia.sysmem2/allocator.fidl
Ordinal | Variant | 類型 | 說明 |
---|---|---|---|
1 |
response |
Allocator_GetVmoInfo_Response
|
|
2 |
err |
Error
|
|
3 |
framework_err |
internal
|
Allocator_ValidBufferCollectionToken_Result 嚴格
定義於 fuchsia.sysmem2/allocator.fidl
Ordinal | Variant | 類型 | 說明 |
---|---|---|---|
1 |
response |
Allocator_ValidateBufferCollectionToken_Response
|
|
3 |
framework_err |
internal
|
BufferCollectionTokenGroup_CreateChildrenSync_Result 嚴格 資源
定義於 fuchsia.sysmem2/collection.fidl
Ordinal | Variant | 類型 | 說明 |
---|---|---|---|
1 |
response |
BufferCollectionTokenGroup_CreateChildrenSync_Response
|
|
3 |
framework_err |
internal
|
BufferCollectionToken_DuplicateSync_Result 嚴格 資源
定義於 fuchsia.sysmem2/collection.fidl
Ordinal | Variant | 類型 | 說明 |
---|---|---|---|
1 |
response |
BufferCollectionToken_DuplicateSync_Response
|
|
3 |
framework_err |
internal
|
BufferCollection_CheckAllBuffersAllocations_Result 嚴格
定義於 fuchsia.sysmem2/collection.fidl
Ordinal | Variant | 類型 | 說明 |
---|---|---|---|
1 |
response |
BufferCollection_CheckAllBuffersAllocated_Response
|
|
2 |
err |
Error
|
|
3 |
framework_err |
internal
|
BufferCollection_WaitForAllBuffersAlChanged_Result 嚴格 資源
定義於 fuchsia.sysmem2/collection.fidl
Ordinal | Variant | 類型 | 說明 |
---|---|---|---|
1 |
response |
BufferCollection_WaitForAllBuffersAllocated_Response
|
|
2 |
err |
Error
|
|
3 |
framework_err |
internal
|
Node_GetBufferCollectionId_Result 嚴格
定義於 fuchsia.sysmem2/collection.fidl
Ordinal | Variant | 類型 | 說明 |
---|---|---|---|
1 |
response |
Node_GetBufferCollectionId_Response
|
|
3 |
framework_err |
internal
|
Node_GetNodeRef_Result 嚴格 資源
定義於 fuchsia.sysmem2/collection.fidl
Ordinal | Variant | 類型 | 說明 |
---|---|---|---|
1 |
response |
Node_GetNodeRef_Response
|
|
3 |
framework_err |
internal
|
Node_IsAlternativeFor_Result 嚴格
定義於 fuchsia.sysmem2/collection.fidl
Ordinal | Variant | 類型 | 說明 |
---|---|---|---|
1 |
response |
Node_IsAlternateFor_Response
|
|
2 |
err |
Error
|
|
3 |
framework_err |
internal
|
Node_Sync_Result 嚴格
定義於 fuchsia.sysmem2/collection.fidl
Ordinal | Variant | 類型 | 說明 |
---|---|---|---|
1 |
response |
Node_Sync_Response
|
|
3 |
framework_err |
internal
|