Sysmem 是一項 FIDL 服務,可分配共用記憶體給 由多個應用程式和硬體區塊使用本文件將概略說明其主要功能,以及為系統提供的服務。
提振精神
現代系統有特殊硬體區塊,可執行相關作業 儲存的資料包括:
- 使用 GPU 算繪電腦圖形。
- 使用硬體轉碼器對影片編碼或解碼。
- 使用相機和 DSP 拍攝高畫質相片。
- 使用顯示器控制器的重疊引擎,將圖片合成至顯示器。
- 使用 TPU 評估類神經網路。
我們通常會希望建立管道,在這些獨立硬體區塊之間傳遞資料。以下列舉部分範例:
- 使用硬體轉碼器解碼影片,並將影片合成至螢幕 以及使用者介面上轉譯的內容
- 將類神經網路套用至即時攝影機畫面。
為了有效率地達成此目標,並避免複製內容,駕駛與應用程式都必須同意 格式資料,以及資料在記憶體中的位置。這項協議可讓一個單元的輸出內容直接供下一個單元使用。硬體單元對這類屬性設有嚴格限制, 哪些資料配置能帶來最佳效能。
Sysmem 是全域服務,可由應用程式提供限制,並分配緩衝區,以便滿足所有限制。如果多種格式 便可根據預期成效選擇其中一種。
Sysmem 緩衝區通常用於呈現圖片,而 sysmem 特別支援協商圖片格式。不過,sysmem 介面也可用於音訊或任何其他類型的資料。
在分配緩衝區後,Sysmem 並不會管理資料流。 管道中的應用程式會負責協調 以確保同步處理。
分配程序 (簡化版)
- 參與者則會連線至 fuchsia.sysmem2.Allocator 服務
- 其中一個參與者 (稱為發起者) 會建立初始的緩衝區收集符記。
- 該參與者複製權杖,並將複製的權杖傳送給其他參與者。
- 這些參與者也可以遞迴複製和傳送符記,直到所有參與者都收到符記為止。
- 每個參與者都會binds自己的權杖,以取得緩衝區集合。
- 每位參與者都會在緩衝區集合上設定限制
- Sysmem 選擇符合所有限制的格式。這可以 只有在每個參與者繫結其權杖並設定限制後才會發生 收藏了!
- Sysmem 會使用該格式分配多個緩衝區。
- 參與者會從 sysmem 擷取緩衝區,以及已配置格式的相關資訊。
sysmem 傳回的資訊是該緩衝區中圖片格式必須滿足的限制組合。
此時,參與者可以使用已分配的格式使用緩衝區, 在不同管道間的資料流動受到特定管道限制 位參與者。由於緩衝區可能會使用多種圖片大小,因此參與者必須共同選擇圖片大小,才能決定確切的圖片格式。這樣一來,管道就能隨時切換圖片大小,而不需要重新配置緩衝區。
如果需要將新參與者加入已完成限制協商和分配程序的現有集合,則可將新的符記附加至緩衝區集合。新參與者的 都必須使用已分配的緩衝區集合滿足限制條件。 或邏輯分配 (從新參與者的角度起算) 失敗。 為提高新參與者成功加入的機會,初始分配期間出現的參與者可以將符記標示為「可省略」。這樣一來,權杖就能用於 獨立限制,以便緩衝區收集之後能 納入具有相同限制的新參與者。
緩衝區銷毀
緩衝區刪除作業為非同步性質。
如要等待舊集合的舊緩衝區完全刪除 (可選配截止期限),請參閱「AttachLifetimeTracking」一文。
緩衝區收集失敗時,緩衝區銷毀序列就會開始。在正常/成功情況下,當參與者 (通常是發起者) 關閉任何收集專屬管道,但未先傳送 Release
時,系統通常會觸發這項「失敗」情況。目前,特定集合專用的頻道
BufferCollectionToken
,
BufferCollection
和
BufferCollectionTokenGroup
個頻道。
當收藏品進入失敗狀態時,sysmem 伺服器會關閉所有收藏品專屬管道的伺服器端。所有已分配的 VMOs 都會保留,直到參與者完成清理作業為止 (請參閱下方清單)。
此時,所有參與者都應能快速察覺收集特定管道的伺服器端關閉 (ZX_CHANNEL_PEER_CLOSED
在用戶端端發出信號),無論是直接或間接透過其他信任度足夠的參與者。接著,每個參與者都會確保盡可能多地滿足下列清除條件清單。在極少數情況下,保留少量緩衝區一段時間可能會比較合理,例如在畫面上保留最後一個影格,直到使用新集合時才顯示新的影格。
必須先移除緩衝區的所有參照,sysmem 才能將其刪除 以便重複使用以下是符合規定的功能:
- VMO 的句柄。
- VMO 的 CPU 對應。
- VMO 的子 VMOs。
- VMO 的Pin,供硬體使用。
- 管道至包含該 VMO 的緩衝區集合。系統
不論該關閉是關閉廣告,伺服器都會將管道視為關閉
用戶端或伺服器這項項目不適用於先前傳送
SetWeak
的仍處於開啟狀態的管道。
在使用非偏好和較不常見的模型下,所有參與者可能會全部關閉
特定集合專屬的管道 (優先加入或沒有 Release
)
在配置後不久,就會提早觸發收集失敗 (因為為零)
但參與者可能會繼續
即使集合「失敗」,仍持續使用 VMO 一段時間。之後,他們會使用其他機制來決定何時要清理 VMOs (請參閱上述清單)。
非偏好模型在技術上可行,但可能會讓集合生命週期不夠明確,並讓 sysmem 檢查資料不夠明確/不夠實用。不過,在某些罕見情況下,這個非首選模型可能會用於配合其他通訊協定/介面所施加的限制。如果考慮
請先考慮請參與者傳送 Release
關閉特定集合的管道,然後得知收集失敗
間接透過另一位 (信任的使用者) 間接進行;如此一來
仍符合上述偏好模式。如果唯一的原因
考慮這個模型是允許漸進式緩衝區處理
請考慮改用 SetWeak。
進階用法
備用限制和/或選擇性參與者
已使用 BufferCollectionTokenGroup
複雜情況中,全體參與者仍是可選 / 盡可能選擇盡力,或
備用限制與首選廣告之間較不嚴格的限制
較嚴格的限制 (例如基於效能考量)。
在分配期間,系統只會選取群組下方直接的一個子符記 (以及從該符記開始的子樹狀結構),並優先選取群組的第一個子符記等等。
系統允許群組底下權杖下的群組 (等)。
系統會在分配期間嘗試使用群組子項選項組合的總數上限;如果達到上限,歡迎與我們聯絡,討論其他選項。
這是進階用途,與大多數參與者無直接關聯。詳情請見
BufferCollectionTokenGroup
的說明文件。
隔離失敗和/或遲交的參與者加入
SetDispensable
和 AttachToken
訊息可用於建立失敗隔離子樹 (由符記重複父項定義),並在原始子樹執行個體失敗後,可能稍後以新的子樹執行個體取代子樹,而不會導致根節點失敗。
發起人建立的第一個權杖是 建立根目錄之後建立的集合管道 系統仍會將該符記視為樹狀結構的根節點 (不同通訊協定、 但具有相同的「節點」)。
取代子樹時,新的子樹參與者會看到看似正常的分配序列,但實際上是「加入」已在進行中的緩衝區集合。
您不必事前使用 AttachToken
,
SetDispensable
。
目前 AttachToken
要求集合必須已具備足夠的緩衝區,才能滿足新連結的參與者執行個體。
此為進階用法,與多數參與者沒有直接關聯。詳情請見
SetDispensable
和 AttachToken
的文件。
詞彙解釋
緩衝區
緩衝區代表應用程式的單張圖片或其他記憶體 相輔相成Sysmem 目前針對每個緩衝區使用一個 VMO。用戶端可以 將記憶體對應至 CPU,或將其固定至 CPU 使用 封鎖。
參與者
參與者是指要存取緩衝區的任何應用程式或驅動程式庫。所有語言 參與者必須連線至 sysmem 來交涉記憶體格式
圖片格式
圖片格式是指 用戶端就能將記憶體解讀為一組像素。例如,它包含像素格式、寬度和高度大小、行間位元組的列間距,以及色彩空間。
緩衝區設定
緩衝區設定是緩衝區屬性的完整說明。包括快取資訊,以及參與者可能需要存取記憶體的其他屬性。圖片: 緩衝區設定也會提供圖片格式。
緩衝區設定不包含特定記憶體位址,因此多個不同的緩衝區可能會有相同的緩衝區設定。
堆積
堆積代表系統中的特定記憶體類型。A 罩杯 系統可能可以有多個效能特性的堆積 應用程式部分堆積可能只能透過部分硬體使用 系統上的裝置
部分堆積可能無法從 CPU 存取。對於這些堆積而言,VMO 代表緩衝區無法直接使用,而是用作金鑰。 想要使用緩衝區的應用程式必須將其 VMO 句柄傳送至堆積驅動程式,而堆積驅動程式則可傳回要使用的記憶體相關資訊。
堆積範例:
- 主要系統記憶體。
- 獨立 GPU 上的 VRAM。
- 系統記憶體的雕刻區域,僅供部分機器使用 硬體
限制
限制會指定參與者可使用的 BufferSettings 組合。參與者通常會在單一限制組合中指定多個可能的緩衝設定,讓 sysmem 彈性地挑選任何一個設定,並降低無法滿足所有參與者限制的風險。
協商
「交涉」是 sysmem 檢視所有 並選擇適用於所有參與者的緩衝區設定。如果有多個設定可用,sysmem 可利用客戶如何使用緩衝區和系統架構的資訊,選擇最佳設定。
緩衝區收集
緩衝區集合是一組多個緩衝區,且 使用相同的緩衝區設定Sysmem 分配整個緩衝區集合 一次。多個參與者可能會開啟相同緩衝區集合的 FIDL 管道。