Fuchsia 命名空間

命名空間是 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 命名空間:

  1. 這個 API 可以「使用」命名空間中的物件,例如傳入的通訊協定和服務或其本身的套件內容。
  2. 它可以透過其傳出目錄,以命名空間的形式向其他元件publish物件。