命名空間是 Fuchsia 中檔案存取和服務探索的骨幹。
定義
命名空間是提供給元件的檔案、目錄、通訊端、服務、裝置,以及其他已命名物件的複合階層。
我們來解開一下吧。
物件已命名:命名空間包含的物件可供列舉和存取,與列出目錄或開啟檔案類似。
複合階層:命名空間是物件的「樹狀結構」,由其他命名空間中的物件子樹狀結構「組合」成複合式結構,其中每個部分都已依照慣例指派路徑前置字串。
每個元件的命名空間:每個元件都會收到專屬的命名空間,以符合其需求。也可以發布本身的物件 以納入其他命名空間。
命名空間也可以獨立於元件建立及使用,不過本文件著重說明一般元件繫結的用法。
實際運作中的命名空間
您可能已經花了時間探索 Fuchsia 命名空間,因為它們無所不在。如果您在指令列殼層提示中輸入 ls /
,將會看到可從殼層命名空間存取的部分物件清單。
不同於其他作業系統,Fchsia 沒有「根檔案系統」。如先前所述,命名空間是為每個元件定義,而非全域或每個程序。
這會帶來一些有趣的影響:
- 沒有全域的「根」命名空間。
- 每個元件都有效具有專屬的私人「根」「根」,因此不具有「在根層級環境執行」的概念。
- 元件會收到專為其特定需求打造的命名空間。
- 物件路徑在命名空間界線內可能不具意義。
- 處理程序可能一次存取數個不同的命名空間。
- 您也可以使用用來控管檔案存取權的機制,按照個別元件控管服務和其他已命名物件的存取權。
物體
命名空間中的項目稱為物件。這些版本有多種版本,包括:
- 檔案:包含二進位資料的物件
- 目錄:包含其他物件的物件
- Sockets:開啟時建立連線的物件,例如具名管道
- 服務:在開啟時提供 FIDL 服務的物件
- 裝置:提供硬體資源存取權的物件
存取物件
如要存取命名空間中的物件,您必須先擁有另一個物件。一般而言,元件會在命名空間移轉期間,針對其命名空間範圍內的物件接收管道控制代碼。
您也可以採用適當的 FIDL 通訊協定,以空洞的方式建立新物件。
如果有物件的管道,您可以向其傳送一個包含物件相對路徑運算式的 FIDL 訊息,為其中一個子物件開啟管道。這就像在目錄中開啟檔案一樣
請注意,您只能存取已有權存取的物件。缺乏環境授權。
現在我們要定義物件名稱和路徑的建構方式。
物件名稱
物件名稱是本機專屬標籤,物件可在容器 (例如目錄) 內放置。請注意,名稱是容器子物件表格的屬性,而非物件本身的屬性。
舉例來說,cat
會指定位於 Open()
要求某些未指定收件者中的毛茸茸物件。
物件基本上沒有名稱,但其他人可能稱其為許多名稱。
物件名稱會以二進位八特字串 (任意位元組序列) 表示,並適用下列限制:
- 長度下限為 1 位元組。
- 長度上限為 255 個位元組。
- 不包含 NUL (零值的位元組)。
- 不含「
/
」。 - 不等於
.
或..
。 - 一律使用位元組的相等式比較 (表示區分大小寫)。
物件名稱是容器 Open()
方法的有效引數。請參閱 FIDL 通訊協定。
在預期情況下,物件名稱會編碼並解讀為 UTF-8 圖形字元序列,使用者可理解的序列,但命名空間本身並不會強制規定這個屬性。
因此,用戶端必須負責決定如何向使用者顯示含有無效、無法顯示或模糊字元序列的名稱。
物件相對路徑運算式
物件相對路徑運算式是一種物件名稱或以 /
分隔的物件名稱序列,用來指定要掃遍的一系列巢狀物件,以尋找容器中的物件 (例如目錄)。
舉例來說,house/box/cat
會指定位於包含 box
的毛小孩,該物件位於其包含的物件中,稱為 house
,位於 Open()
要求的某些未指定收件者中。
物件相對路徑運算式一律會更深入地遍歷命名空間。值得注意的是,命名空間不會直接支援從容器向上週遊 (例如透過 ..
),但用戶端可以部分模擬這項功能 (請見下文)。
物件相對路徑運算式具有下列其他限制:
- 長度下限為 1 位元組。
- 長度上限為 4095 個位元組。
- 開頭或結尾不是
/
。 - 所有區隔都是有效的物件名稱。
- 一律使用位元組的相等式比較 (表示區分大小寫)。
物件相對路徑運算式是容器 Open()
方法的有效引數。請參閱 FIDL 通訊協定。
用戶端解讀路徑運算式
用戶端解譯路徑運算式是物件相對路徑運算式的概略化,但包含可由用戶端程式碼模擬的選用功能,提升與預期具有類似檔案介面的介面的相容性。
在技術上,這些功能並不在 Fuchsia 命名空間通訊協定的範圍之內,但這些功能經常使用,因此我們在此說明。
- 用戶端可以指定自身的其中一個命名空間來做為「根」。這個命名空間表示
/
。 - 用戶端可以在前面加上單一
/
來建構相對於其指定根命名空間的路徑。 - 用戶端可透過名為
..
路徑區段的方式,透過稱為用戶端「標準化」的程序,將區隔折疊 (假設容器的路徑已知),藉此建立從容器向上掃遍的路徑。 - 系統可能會將這些功能合併。
舉例來說,/places/house/box/../sofa/cat
會指定位於某些用戶端指定「根」容器的 places/house/sofa/cat
中的毛小孩。
包含這些選用功能的用戶端解譯路徑運算式並非容器 Open()
方法的有效引數;這些運算式必須在與命名空間通訊之前由用戶端翻譯。請參閱 FIDL 通訊協定。
例如,fdio
會在檔案操縱 API (例如 open()
、stat()
、unlink()
等) 中實作 ..
路徑的用戶端解釋。
命名空間移轉
元件啟動後 (例如程序開始),系統會接收資料表,將一或多個命名空間路徑前置字串對應至物件控制代碼。
資料表中的路徑前置字串會依照慣例,將相關物件的預期重要性編碼。舉例來說,pkg
前置字串應與目錄物件相關聯,而目錄物件中包含元件本身的二進位檔和資產。
下節將進一步說明。
命名空間慣例
本節將說明在 Fuchsia 上執行的一般元件,命名空間的傳統配置。
元件命名空間的精確內容和組織會因元件的角色、類型、身分、範圍、與其他元件的關係及權限而有很大的差異。如要瞭解命名空間如何使用命名空間建立元件的沙箱,請參閱「沙箱」一文。
如要進一步瞭解元件可能會接收的命名空間,請參閱有關您要實作的元件類型的說明文件。
常見物件
以下是元件命名空間可能包含的一些常見物件:
- 元件套件中的唯讀執行檔和資產。
- 私人本機永久儲存空間。
- 私人臨時儲存空間。
- 系統、元件架構或啟動該元件的用戶端提供給元件的服務。
- 裝置節點 (用於驅動程式和特殊權限元件)。
- 設定資訊。
典型目錄結構
pkg/
:目前程式套件的內容,與簽署套件時相同bin/
:套件中的可執行二進位檔lib/
:套件中的共用資料庫data/
:套件中的資料等資料
data/
:本機永久儲存空間 (讀取/寫入,僅限元件存取)tmp/
:暫存儲存空間 (讀取/寫入,僅限元件存取)svc/
:提供給元件的通訊協定和服務fuchsia.process.Launcher
:啟動程序fuchsia.logger.Log
:記錄訊息vendor.topic.Interface
:供應商定義的服務
dev/
:裝置樹狀結構 (視需要向特殊權限元件顯示相關部分)class/
……
config/
:元件的設定資料build-info/
:建構資訊檔案的標準路徑。ssl/
:SSL 憑證的標準路徑tzdata/
:時區資料檔案。第一個子路徑應為資料格式名稱,例如tzif2/...
或icudata/...
。
命名空間參與者
以下提供幾個與 Fuchsia 命名空間通訊協定互動及支援 Fuchsia 命名空間通訊協定的摘要的詳細資訊。
檔案系統
檔案系統使得命名空間中的檔案可以使用。
檔案系統只是元件,會從他人的命名空間發布類似檔案的物件。
通訊協定
「通訊協定控制代碼」是由實作 FIDL 通訊協定所支援的管道物件,可使用命名空間進行探索。通訊協定名稱會對應至命名空間中 /svc
分支內的路徑,元件可以從該命名空間存取實作。
例如,預設的 Fuchsia 記錄通訊協定為 fuchsia.logger.Log
,而命名空間中的路徑為 /svc/fuchsia.logger.Log
。
如要進一步瞭解通訊協定和元件,請參閱通訊協定功能。
服務
服務 可透過命名空間存取。
服務控制代碼是包含相關 FIDL 通訊協定的目錄。您可以使用命名空間找出這些通訊協定的實作。服務名稱會對應至命名空間中 /svc
分支內的路徑,元件可以從該命名空間存取實作。
如要進一步瞭解服務和元件,請參閱服務功能一文。
元件
元件會使用及擴充命名空間。
元件是可執行的程式物件,已在某些拓撲中執行個體化,並具有指定的命名空間。
元件可以透過兩種方式加入 Fuchsia 命名空間:
- 這個 API 可以「使用」命名空間中的物件,例如傳入的通訊協定和服務或其本身的套件內容。
- 它可以透過其傳出目錄,以命名空間的形式向其他元件publish物件。