Sysmem 總覽

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

提振精神

現代系統擁有特殊的硬體區塊,可對資料執行作業。部分區塊包括:

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

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

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

為了有效率地達到這個目的並避免複製,驅動程式和應用程式必須同意格式資料位於,以及資料位於記憶體中的位置。這項協議允許下一個單位的輸出內容直接使用。硬體單元對這些屬性設有嚴格限制,也偏好哪些資料版面配置可提供最佳效能。

Sysmem 是一項全域服務,可為應用程式的限制繫結並分配緩衝區,以便滿足所有限制。如果支援多種格式,可以根據預期成效選擇格式。

Sysmem 緩衝區通常用於表示圖像,Sysmem 則特別支援協調圖片格式。然而,sysmem 介面也可用於音訊或任何其他類型的資料。

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

分配程序 (簡化)

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

sysmem 傳回的資訊是緩衝區中圖片格式必須符合的一組限制條件。

此時,參與者可將緩衝區搭配已分配的格式使用,並須遵守參與者之間資料流動方面的特定管道限制。由於緩衝區中可以使用多種圖片大小,因此參與者必須合作選擇圖片大小,才能決定精確的圖片格式。這可讓管道即時切換圖片大小,而無需重新分配緩衝區。

如果需要將新的參與者新增至已在限制交涉和分配的現有集合中,新符記可以附加到緩衝區集合。新參與者必須符合已分配的緩衝區集合,才能滿足新參與者的限制,否則邏輯配置 (從新參與者的視角) 會失敗。為了讓新參與者成功加入,在初始分配期間,一位參與者可以標示符記「可贈性」。這樣做可讓權杖用於指定獨立限制,以便緩衝區收集作業稍後能夠因應有相同限制的新參與者。

緩衝區刪除

您必須先移除緩衝區的所有參照,sysmem 才會將其刪除並允許重複使用記憶體。其中包括:

詞彙解釋

緩衝區

緩衝區代表應用程式將搭配使用的單一圖片或其他記憶體。Sysmem 目前針對每個緩衝區使用一個 VMO。用戶端可以將記憶體對應至 CPU,也可以固定將其與硬體區塊搭配使用。

參與者

參與者是指任何想要存取緩衝區的應用程式或驅動程式庫。所有參與者都必須連線至 sysmem 才能協商記憶體格式。

圖片格式

「圖片格式」是用戶端將記憶體解讀為一組像素所需的完整屬性組合。例如,其中包含像素格式、寬度和高度大小、資料列間距 (以位元組為單位) 以及色域。

緩衝區設定

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

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

堆積

堆積代表系統中的一種特定類型的記憶體。系統可能會有多個堆積,而這些堆積的效能特性都不同。某些堆積可能只能透過系統中的部分硬體裝置使用。

部分堆積可能無法透過 CPU 存取。對於這些堆積,代表緩衝區的 VMO 無法直接使用,但會做為索引鍵使用。想要使用緩衝區的應用程式必須將其 VMO 控制代碼傳送至堆積驅動程式庫,堆積驅動程式庫可以傳回要使用哪些記憶體的相關資訊。

堆積示例:

  • 主要系統記憶體。
  • VRAM 和獨立的 GPU。
  • 僅供部分硬體使用的系統記憶體獨立區域。

限制

限制會指定參與者可以使用的 BufferSettings 組合。參與者通常會在一組限制中指定多個可能的緩衝區設定,讓 sysmem 能夠靈活挑選其中任一限制,並降低沒有任何設定滿足所有參與者限制的風險。

協商

「協商」是指 sysmem 查看參與者的所有限制,並選擇適用於所有參與者的緩衝區設定。如果多項設定可以運作,Symem 可利用相關資訊,瞭解用戶端如何使用緩衝區和系統架構來選擇最佳設定。

緩衝區集合

「緩衝區集合」是一組具有相同緩衝區設定的多個緩衝區。Sysmem 一次會分配整個緩衝區集合。多位參與者都可以對同一個緩衝區集合開放多個 FIDL 管道。

緩衝區收集權杖

分配記憶體之前,「權杖」會在協商程序的初始階段中使用。在最終繫結至緩衝區集合之前,可以複製權杖並在程序之間傳遞。