在本節中,您將瞭解 Zircon 核心物件如何讓 Fuchsia 遵循最低權限原則,隔離程序並只授予程序所需的功能。
沙箱
建立新程序時,該程序沒有任何功能。這個程序完全仰賴創作者透過一組 換句話說,空白程序沒有環境權限。
因此,程序通常會使用一些初始資源和功能建立。fuchsia.process.Launcher
通訊協定提供低階介面,可透過可執行檔和一組核心物件句柄,在系統上建立新程序。大多數軟體都會使用元件架構,這可簡化設定新程序的作業,讓您能以標準的初始功能集執行程式碼。您稍後會進一步瞭解元件。
程序收到的部分初始句柄是程序掛載至其命名空間的目錄。
命名空間
的程序包含其私人視圖,並控制程序可影響的 Fuchsia 系統範圍。這麼做可有效地定義該程序執行時的沙箱規則。
命名空間會填入各種資源物件,包括:
- 檔案:包含二進位資料的物件。
- 目錄:包含其他物件的物件。
- Socket:開啟時會建立連線的物件,例如命名的管道。
- 通訊協定和服務:在開啟時提供結構化服務的物件。
- Devices:提供硬體資源存取權的物件。
程序建立者會根據一組必要功能,填入命名空間的內容。處理程序無法將物件新增至自己的命名空間,因為這會讓該處理程序自行授予存取這些物件的功能。
練習:命名空間
在本練習中,您將探索元件命名空間的內容。
啟動模擬器
如果您尚未啟動執行個體,請啟動模擬器:
ffx emu start --headless
啟動完成後,模擬器會輸出以下訊息並傳回:
Logging to "$HOME/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log"
Waiting for Fuchsia to start (up to 60 seconds)........
Emulator is ready.
尋找目標元件
在上一節中,您已瞭解與元件相關聯的程序會使用 .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