Sysmem 總覽

Sysmem 是一項 FIDL 服務,可分配共用記憶體給 由多個應用程式和硬體區塊使用本文件將概略說明其主要功能,以及為系統提供的服務。

提振精神

現代系統有特殊硬體區塊,可執行相關作業 儲存的資料包括:

  • 使用 GPU 算繪電腦圖形。
  • 使用硬體轉碼器對影片編碼或解碼。
  • 使用相機和 DSP 拍攝高畫質相片。
  • 使用顯示器控制器的重疊引擎,將圖片合成至顯示器。
  • 使用 TPU 評估類神經網路。

我們通常會希望建立管道,在這些獨立硬體區塊之間傳遞資料。以下列舉部分範例:

  • 使用硬體轉碼器解碼影片,並將影片合成至螢幕 以及使用者介面上轉譯的內容
  • 將類神經網路套用至即時攝影機畫面。

為了有效率地達成此目標,並避免複製內容,駕駛與應用程式都必須同意 格式資料,以及資料在記憶體中的位置。這項協議可讓一個單元的輸出內容直接供下一個單元使用。硬體單元對這類屬性設有嚴格限制, 哪些資料配置能帶來最佳效能。

Sysmem 是全域服務,可由應用程式提供限制,並分配緩衝區,以便滿足所有限制。如果多種格式 便可根據預期成效選擇其中一種。

Sysmem 緩衝區通常用於呈現圖片,而 sysmem 特別支援協商圖片格式。不過,sysmem 介面也可用於音訊或任何其他類型的資料。

在分配緩衝區後,Sysmem 並不會管理資料流。 管道中的應用程式會負責協調 以確保同步處理。

分配程序 (簡化版)

  1. 參與者則會連線至 fuchsia.sysmem2.Allocator 服務
  2. 其中一個參與者 (稱為發起者) 會建立初始的緩衝區收集符記
  3. 該參與者複製權杖,並將複製的權杖傳送給其他參與者。
  4. 這些參與者也可以遞迴複製和傳送符記,直到所有參與者都收到符記為止。
  5. 每個參與者都會binds自己的權杖,以取得緩衝區集合。
  6. 每位參與者都會在緩衝區集合上設定限制
  7. Sysmem 選擇符合所有限制的格式。這可以 只有在每個參與者繫結其權杖並設定限制後才會發生 收藏了!
  8. Sysmem 會使用該格式分配多個緩衝區
  9. 參與者會從 sysmem 擷取緩衝區,以及已配置格式的相關資訊。

sysmem 傳回的資訊是該緩衝區中圖片格式必須滿足的限制組合。

此時,參與者可以使用已分配的格式使用緩衝區, 在不同管道間的資料流動受到特定管道限制 位參與者。由於緩衝區可能會使用多種圖片大小,因此參與者必須共同選擇圖片大小,才能決定確切的圖片格式。這樣一來,管道就能隨時切換圖片大小,而不需要重新配置緩衝區。

如果需要將新參與者加入已完成限制協商和分配程序的現有集合,則可將新的符記附加至緩衝區集合。新參與者的 都必須使用已分配的緩衝區集合滿足限制條件。 或邏輯分配 (從新參與者的角度起算) 失敗。 為提高新參與者成功加入的機會,初始分配期間出現的參與者可以將符記標示為「可省略」。這樣一來,權杖就能用於 獨立限制,以便緩衝區收集之後能 納入具有相同限制的新參與者。

緩衝區銷毀

緩衝區刪除作業為非同步性質。

如要等待舊集合的舊緩衝區完全刪除 (可選配截止期限),請參閱「AttachLifetimeTracking」一文。

緩衝區收集失敗時,緩衝區銷毀序列就會開始。在正常/成功情況下,當參與者 (通常是發起者) 關閉任何收集專屬管道,但未先傳送 Release 時,系統通常會觸發這項「失敗」情況。目前,特定集合專用的頻道 BufferCollectionToken, BufferCollectionBufferCollectionTokenGroup 個頻道。

當收藏品進入失敗狀態時,sysmem 伺服器會關閉所有收藏品專屬管道的伺服器端。所有已分配的 VMOs 都會保留,直到參與者完成清理作業為止 (請參閱下方清單)。

此時,所有參與者都應能快速察覺收集特定管道的伺服器端關閉 (ZX_CHANNEL_PEER_CLOSED 在用戶端端發出信號),無論是直接或間接透過其他信任度足夠的參與者。接著,每個參與者都會確保盡可能多地滿足下列清除條件清單。在極少數情況下,保留少量緩衝區一段時間可能會比較合理,例如在畫面上保留最後一個影格,直到使用新集合時才顯示新的影格。

必須先移除緩衝區的所有參照,sysmem 才能將其刪除 以便重複使用以下是符合規定的功能:

  • VMO 的句柄
  • VMO 的 CPU 對應
  • VMO 的子 VMOs
  • VMO 的Pin,供硬體使用。
  • 管道至包含該 VMO 的緩衝區集合。系統 不論該關閉是關閉廣告,伺服器都會將管道視為關閉 用戶端或伺服器這項項目不適用於先前傳送 SetWeak 的仍處於開啟狀態的管道。

在使用非偏好和較不常見的模型下,所有參與者可能會全部關閉 特定集合專屬的管道 (優先加入或沒有 Release) 在配置後不久,就會提早觸發收集失敗 (因為為零) 但參與者可能會繼續 即使集合「失敗」,仍持續使用 VMO 一段時間。之後,他們會使用其他機制來決定何時要清理 VMOs (請參閱上述清單)。

非偏好模型在技術上可行,但可能會讓集合生命週期不夠明確,並讓 sysmem 檢查資料不夠明確/不夠實用。不過,在某些罕見情況下,這個非首選模型可能會用於配合其他通訊協定/介面所施加的限制。如果考慮 請先考慮請參與者傳送 Release 關閉特定集合的管道,然後得知收集失敗 間接透過另一位 (信任的使用者) 間接進行;如此一來 仍符合上述偏好模式。如果唯一的原因 考慮這個模型是允許漸進式緩衝區處理 請考慮改用 SetWeak

進階用法

備用限制和/或選擇性參與者

已使用 BufferCollectionTokenGroup 複雜情況中,全體參與者仍是可選 / 盡可能選擇盡力,或 備用限制與首選廣告之間較不嚴格的限制 較嚴格的限制 (例如基於效能考量)。

在分配期間,系統只會選取群組下方直接的一個子符記 (以及從該符記開始的子樹狀結構),並優先選取群組的第一個子符記等等。

系統允許群組底下權杖下的群組 (等)。

系統會在分配期間嘗試使用群組子項選項組合的總數上限;如果達到上限,歡迎與我們聯絡,討論其他選項。

這是進階用途,與大多數參與者無直接關聯。詳情請見 BufferCollectionTokenGroup 的說明文件。

隔離失敗和/或遲交的參與者加入

SetDispensableAttachToken 訊息可用於建立失敗隔離子樹 (由符記重複父項定義),並在原始子樹執行個體失敗後,可能稍後以新的子樹執行個體取代子樹,而不會導致根節點失敗。

發起人建立的第一個權杖是 建立根目錄之後建立的集合管道 系統仍會將該符記視為樹狀結構的根節點 (不同通訊協定、 但具有相同的「節點」)。

取代子樹時,新的子樹參與者會看到看似正常的分配序列,但實際上是「加入」已在進行中的緩衝區集合。

您不必事前使用 AttachTokenSetDispensable

目前 AttachToken 要求集合必須已具備足夠的緩衝區,才能滿足新連結的參與者執行個體。

此為進階用法,與多數參與者沒有直接關聯。詳情請見 SetDispensableAttachToken 的文件。

詞彙解釋

緩衝區

緩衝區代表應用程式的單張圖片或其他記憶體 相輔相成Sysmem 目前針對每個緩衝區使用一個 VMO。用戶端可以 將記憶體對應至 CPU,或將其固定至 CPU 使用 封鎖。

參與者

參與者是指要存取緩衝區的任何應用程式或驅動程式庫。所有語言 參與者必須連線至 sysmem 來交涉記憶體格式

圖片格式

圖片格式是指 用戶端就能將記憶體解讀為一組像素。例如,它包含像素格式、寬度和高度大小、行間位元組的列間距,以及色彩空間。

緩衝區設定

緩衝區設定是緩衝區屬性的完整說明。包括快取資訊,以及參與者可能需要存取記憶體的其他屬性。圖片: 緩衝區設定也會提供圖片格式。

緩衝區設定不包含特定記憶體位址,因此多個不同的緩衝區可能會有相同的緩衝區設定。

堆積

堆積代表系統中的特定記憶體類型。A 罩杯 系統可能可以有多個效能特性的堆積 應用程式部分堆積可能只能透過部分硬體使用 系統上的裝置

部分堆積可能無法從 CPU 存取。對於這些堆積而言,VMO 代表緩衝區無法直接使用,而是用作金鑰。 想要使用緩衝區的應用程式必須將其 VMO 句柄傳送至堆積驅動程式,而堆積驅動程式則可傳回要使用的記憶體相關資訊。

堆積範例:

  • 主要系統記憶體。
  • 獨立 GPU 上的 VRAM。
  • 系統記憶體的雕刻區域,僅供部分機器使用 硬體

限制

限制會指定參與者可使用的 BufferSettings 組合。參與者通常會在單一限制組合中指定多個可能的緩衝設定,讓 sysmem 彈性地挑選任何一個設定,並降低無法滿足所有參與者限制的風險。

協商

「交涉」是 sysmem 檢視所有 並選擇適用於所有參與者的緩衝區設定。如果有多個設定可用,sysmem 可利用客戶如何使用緩衝區和系統架構的資訊,選擇最佳設定。

緩衝區收集

緩衝區集合是一組多個緩衝區,且 使用相同的緩衝區設定Sysmem 分配整個緩衝區集合 一次。多個參與者可能會開啟相同緩衝區集合的 FIDL 管道。

緩衝區收集權杖

在記憶體分配前,會在協商程序的初始階段使用符記。符記可複製並在程序之間傳遞,最後再繫結至緩衝區集合。