Sysmem 是一項 FIDL 服務,會分配共用記憶體供多個應用程式和硬體區塊使用。本文件將概略介紹其主要功能,以及提供給系統的內容。
提振精神
現代系統擁有特殊的硬體區塊,可對資料執行作業。部分區塊包括:
- 使用 GPU 轉譯電腦圖形。
- 使用硬體轉碼器編碼或解碼影片。
- 使用相機和 DSP 拍攝高畫質相片。
- 使用顯示控制器的重疊引擎,將圖片組合至螢幕。
- 使用 TPU 評估類神經網路。
我們通常希望建立管道,在各不同的硬體區塊之間傳遞資料。以下列舉部分範例:
- 使用硬體轉碼器解碼影片,並將影片與在 GPU 上轉譯的使用者介面內容組合成螢幕。
- 將類神經網路套用至攝影機即時影像。
為了有效率地達到這個目的並避免複製,驅動程式和應用程式必須同意格式資料位於,以及資料位於記憶體中的位置。這項協議允許下一個單位的輸出內容直接使用。硬體單元對這些屬性設有嚴格限制,也偏好哪些資料版面配置可提供最佳效能。
Sysmem 是一項全域服務,可為應用程式的限制繫結並分配緩衝區,以便滿足所有限制。如果支援多種格式,可以根據預期成效選擇格式。
Sysmem 緩衝區通常用於表示圖像,Sysmem 則特別支援協調圖片格式。然而,sysmem 介面也可用於音訊或任何其他類型的資料。
分配緩衝區後,Sysmem 不會管理資料流。管道中的應用程式負責相互協調,確保同步處理作業。
分配程序 (簡化)
- 參與者會連線至 fuchsia.sysmem.Allocator 服務
- 一位參與者 (稱為「發起者」) 會建立初始緩衝區收集權杖。
- 參與者會「複製」符記,並將重複的憑證傳送給其他參與者。
- 這些參與者也可以遞迴地複製及傳送符記,直到所有參與者收到權杖為止。
- 每位參與者都會繫結自身權杖,以便取得緩衝區收集。
- 每位參與者都會針對緩衝區收集設定限制
- Sysmem 選擇可符合所有限制條件的格式。只有在每位參與者繫結其權杖並設定集合限制後,才會發生這種情形。
- Sysmem 會使用該格式分配多個緩衝區。
- 參與者從 sysmem 擷取緩衝區,以及已分配格式的相關資訊。
sysmem 傳回的資訊是緩衝區中圖片格式必須符合的一組限制條件。
此時,參與者可將緩衝區搭配已分配的格式使用,並須遵守參與者之間資料流動方面的特定管道限制。由於緩衝區中可以使用多種圖片大小,因此參與者必須合作選擇圖片大小,才能決定精確的圖片格式。這可讓管道即時切換圖片大小,而無需重新分配緩衝區。
如果需要將新的參與者新增至已在限制交涉和分配的現有集合中,新符記可以附加到緩衝區集合。新參與者必須符合已分配的緩衝區集合,才能滿足新參與者的限制,否則邏輯配置 (從新參與者的視角) 會失敗。為了讓新參與者成功加入,在初始分配期間,一位參與者可以標示符記「可贈性」。這樣做可讓權杖用於指定獨立限制,以便緩衝區收集作業稍後能夠因應有相同限制的新參與者。
緩衝區刪除
您必須先移除緩衝區的所有參照,sysmem 才會將其刪除並允許重複使用記憶體。其中包括:
詞彙解釋
緩衝區
緩衝區代表應用程式將搭配使用的單一圖片或其他記憶體。Sysmem 目前針對每個緩衝區使用一個 VMO。用戶端可以將記憶體對應至 CPU,也可以固定將其與硬體區塊搭配使用。
參與者
參與者是指任何想要存取緩衝區的應用程式或驅動程式庫。所有參與者都必須連線至 sysmem 才能協商記憶體格式。
圖片格式
「圖片格式」是用戶端將記憶體解讀為一組像素所需的完整屬性組合。例如,其中包含像素格式、寬度和高度大小、資料列間距 (以位元組為單位) 以及色域。
緩衝區設定
緩衝區設定是緩衝區屬性的完整說明,其中包括快取資訊,以及其他參與者可能需要存取記憶體的屬性。緩衝區設定也會有圖片格式。
緩衝區設定不包含特定的記憶體位址,因此多個不同的緩衝區可能會有相同的緩衝區設定。
堆積
堆積代表系統中的一種特定類型的記憶體。系統可能會有多個堆積,而這些堆積的效能特性都不同。某些堆積可能只能透過系統中的部分硬體裝置使用。
部分堆積可能無法透過 CPU 存取。對於這些堆積,代表緩衝區的 VMO 無法直接使用,但會做為索引鍵使用。想要使用緩衝區的應用程式必須將其 VMO 控制代碼傳送至堆積驅動程式庫,堆積驅動程式庫可以傳回要使用哪些記憶體的相關資訊。
堆積示例:
- 主要系統記憶體。
- VRAM 和獨立的 GPU。
- 僅供部分硬體使用的系統記憶體獨立區域。
限制
限制會指定參與者可以使用的 BufferSettings 組合。參與者通常會在一組限制中指定多個可能的緩衝區設定,讓 sysmem 能夠靈活挑選其中任一限制,並降低沒有任何設定滿足所有參與者限制的風險。
協商
「協商」是指 sysmem 查看參與者的所有限制,並選擇適用於所有參與者的緩衝區設定。如果多項設定可以運作,Symem 可利用相關資訊,瞭解用戶端如何使用緩衝區和系統架構來選擇最佳設定。
緩衝區集合
「緩衝區集合」是一組具有相同緩衝區設定的多個緩衝區。Sysmem 一次會分配整個緩衝區集合。多位參與者都可以對同一個緩衝區集合開放多個 FIDL 管道。
緩衝區收集權杖
分配記憶體之前,「權杖」會在協商程序的初始階段中使用。在最終繫結至緩衝區集合之前,可以複製權杖並在程序之間傳遞。