在本節中,您將瞭解 Zircon 核心物件如何讓 Fuchsia 遵循最低權限原則,隔離程序並只授予程序所需的功能。
沙箱
建立新程序時,該程序沒有任何功能。這個程序完全仰賴創作者透過一組換句話說,空白程序沒有環境權限。
因此,程序通常會使用一些初始資源和功能建立。fuchsia.process.Launcher
通訊協定提供低階介面,可透過可執行檔和一組核心物件句柄,在系統上建立新程序。大多數軟體都會使用元件架構,這可簡化設定新程序的作業,讓您能以標準的初始功能集執行程式碼。您稍後會進一步瞭解元件。
某些指派給程序的初始控點是該程序掛接至其命名空間的目錄。
命名空間
命名空間會填入各種資源物件,包括:
- 檔案:包含二進位資料的物件。
- 目錄:包含其他物件的物件。
- Socket:開啟時會建立連線的物件,例如命名的管道。
- 通訊協定和服務:在開啟時提供結構化服務的物件。
- Devices:提供硬體資源存取權的物件。
程序建立者會根據一組必要功能,填入命名空間的內容。處理程序無法將物件新增至自己的命名空間,因為這會讓該處理程序自行授予存取這些物件的功能。
練習:命名空間
在本練習中,您將探索元件命名空間的內容。
啟動模擬器
如果您尚未啟動執行個體,請啟動支援網路功能的 FEMU:
ffx emu start workstation_eng.x64 --headless
尋找目標元件
您在上一節中學到,與元件相關聯的程序是使用 .cm
擴充功能命名。請回想以下的程序清單範例:
TASK PSS PRIVATE SHARED STATE NAME
j: 1027 507.8M 507.4M root
p: 1061 564.4k 564k 36k bin/bootsvc
p: 1150 4264.4k 4264k 36k bin/component_manager
j: 1479 228.4k 228k
p: 1583 228.4k 228k 36k pwrbtn-monitor.cm
j: 1484 532.4k 532k
p: 1599 532.4k 532k 36k svchost.cm
j: 1544 402.4k 304k
p: 1633 402.4k 304k 232k netsvc.cm
j: 1681 296.4k 296k
p: 1733 296.4k 296k 36k console-launcher.cm
j: 1799 7232.4k 7232k
p: 1825 7232.4k 7232k 36k archivist.cm
...
j: 31294 1872.2K 1872K
p: 31331 1872.2K 1872K 20K http-client.cm
在本練習中,您將使用 http-client.cm
做為探索目標。
連線至目標元件
如要探索元件的命名空間,您必須決定系統中該元件的專屬 ID。這就是元件的名稱。
使用 ffx component show
指令列出元件的其他詳細資料,包括元件路徑名稱:
ffx component show http-client.cm
這個指令會輸出類似以下的內容:
$ ffx component show http-client.cm
Moniker: /core/network/http-client
URL: #meta/http-client.cm
Type: CML static component
...
您可以使用 ffx component explore
指令,在目標元件環境中開啟互動式殼層。請試著為 http-client
元件執行以下操作:
ffx component explore /core/network/http-client
在探索殼層中,使用 ls
指令列出根目錄的內容:
[explore shell] $ ls
bin
exposed
ns
out
runtime
svc
探索命名空間
您可以在環境內的 /ns
路徑下方找到元件的「命名空間」。
在「探索殼層」中,列出命名空間的內容:
[explore shell] $ ls /ns
config
pkg
svc
以下列出每個元素的簡短重點:
config/
:元件的設定資料pkg/
:元件套件的內容svc/
:元件可用的系統服務
在探索殼層中,列出傳入 /ns/svc
目錄的內容。這個目錄包含服務節點,代表提供給此元件的系統服務。
[explore shell] $ ls /ns/svc
fuchsia.logger.LogSink
fuchsia.net.name.Lookup
fuchsia.posix.socket.Provider
稍後,我們將更深入探討 FIDL 通訊協定和各種服務存取方式。
在探索殼層內,輸入 exit
即可返回開發機器上的殼層:
[explore shell] $ exit