開始使用 Zircon

檢查 Zircon 原始碼

本指南假設 Fuchsia 專案已簽入 $FUCHSIA_DIR,且 fx 已設定。

使用預設工具鍊建構 Zircon

fx 指令會納入各種用來設定、建構和與 Fuchsia 互動的工具。fx set 指令用於指定產品和主機板架構。舉例來說,如要將 arm64 的建構目標設為 Zircon,請執行下列指令:

fx set bringup.arm64

Fuchsia 使用「產品」的概念建立一組建構目標。擴增產品是最小的產品,且功能組合最少。

下列指令會輸出其他產品設定清單:

fx list-products

下列指令會顯示已定義的主面板架構清單:

fx list-boards

如要執行建構,請執行下列指令:

fx build

建構結果儲存在 $FUCHSIA_DIR/out/default 中。

明確設定目標工具鍊

根據預設,Fuchsia 會使用 clang 工具鍊。您可以將 variants 引數與 fx set 搭配使用,藉此設為 gcc

fx set bringup.x64 --variant gcc

您也可以使用變化版本標記來啟用 Aaan。

為所有目標建構 Zircon

您可以使用 fx multi 為所有目標進行建構,並使用包含所有要建構規格的檔案。每個目標的輸出內容可在 $FUCHSIA_DIR/out/<product>.<board>.variant 中找到。多建構規格的一個範例為 bringup-cq,概略說明為 CQ 測試建構的內容。

提交前請先針對所有目標進行建構,確保建構作業在所有架構中都能正常運作。

血氧濃度

如果您只是在實際硬體上測試,但模擬器很方便快速地進行本機測試,且通常值得採用,可以略過此步驟。

如要瞭解如何搭配 zircon 建構和使用 QEMU,請參閱 QEMU

建構工具鍊 (選用)

如果預先建構的工具鍊二進位檔不適合您,則可以從正常上游來源建構自己的程式庫。

  • 根據預設,系統會使用 Clang 工具鍊建構 Zircon,或使用 variants = [ "clang" ]variants = [ "asan" ] 進行建構。
  • 根據預設,系統也會使用 Clang 工具鍊建構主機端程式碼,不過任何支援 C++14 的建構主機工具鍊應該都能正常運作。
  • 您也可以使用 GCC 工具鍊。

視需要建構 Zircon,或建構兩者之一。

GCC 工具鍊

我們使用 GNU binutils 2.301 和 GCC 8.2 (設定為 --enable-initfini-array --enable-gold),而在 x86-64 中使用 --target=x86_64-elf --enable-targets=x86_64-pep,針對 ARM64 則使用 --target=aarch64-elf

針對 binutils,我們建議使用 --enable-deterministic-archives,但這並不需要切換,就能取得正常運作的版本。

如果是 GCC,您必須在 make 指令列上傳送 MAKEOVERRIDES=USE_GCC_STDINT=provide。確保 stdint.h GCC 安裝是獨立運作 (來源中的 stdint-gcc.h),而不是使用 #include_next 且預期將另一個 stdint.h 檔案安裝在其他位置。

只需要 C 和 C++ 語言支援,而且不需要 libgcc 以外的目標程式庫,因此您可以使用多種 configure 切換按鈕來停用其他功能,並讓 GCC 的建構速度更快,並減少使用儲存空間,例如 --enable-languages=c,c++ --disable-libstdcxx --disable-libssp --disable-libquadmath。詳情請參閱 GCC 安裝說明文件。

您可能需要各種其他 configure 外接切換裝置或其他必要條件,才能在您的主機系統上進行建構。請參閱 GNU 說明文件。

Clang/LLVM 工具鍊

我們使用 Clang 的主幹快照,而且經常更新到新的快照。任何支援 x86_64aarch64 編譯的近期 Clang 版本應該都能正常運作。您需要一個也包含執行階段程式庫的工具鍊。我們通常也會針對主機和 *-fuchsia 目標使用相同的 Clang 版本。如要進一步瞭解我們如何建構 Clang,請參閱這篇文章

設定工具鍊的建構引數

如果您使用的是預先建構的工具鍊,可以略過這個步驟,因為建構作業會自動尋找。

設定指向工具鍊安裝位置的建構引數:

fx set bringup.x64 --variant clang --args clang_tool_dir = "<absolute path to>/clang-install/bin/"

或 GCC:

fx set bringup.x64 --variant gcc --args gcc_tool_dir = "<absolute path to>/gcc-install/bin/"

請注意,*_tool_dir 結尾應包含斜線。如果 PATH 中的 clanggcc 適用於 Zircon,您就可以直接使用空白的前置字串。

將檔案複製到 Zircon,以及從 Zircon 複製檔案

設定本機連結 IPv6 後,您就可以使用 fx cp 將檔案複製到裝置,或從裝置複製檔案。

包含額外的使用者空間檔案

Zircon 建構作業會建立啟動檔案系統映像檔,其中包含系統啟動所需的使用者空間元件 (裝置管理員、部分裝置驅動程式等)。核心可以納入第二個啟動檔案系統映像檔,後者是由 QEMU 或系統啟動載入程式做為 ramdisk 映像檔。

如要建立這類啟動檔案系統映像檔,請使用系統在建構作業中產生的 zbi 工具。這種方式能夠為任一來源目錄 (其中包含指定目錄中的每個檔案及其子目錄) 的啟動映像檔組合,或透過指定資訊清單檔案 (逐一指定要包含哪些檔案) 的資訊清單檔案來組成。

$BUILDDIR/tools/zbi -o extra.bootfs @/path/to/directory

echo "issue.txt=/etc/issue" > manifest
echo "etc/hosts=/etc/hosts" >> manifest
$BUILDDIR/tools/zbi -o extra.bootfs manifest

在已啟動的 Zircon 系統中,啟動檔案系統中的檔案會顯示在 /boot 底下,因此在上述資訊清單範例中,「hosts」檔案會顯示在 /boot/etc/hosts 上。

網路啟動

透過 Gigaboot 和 Zirconboot 這兩種機制來支援網路啟動。Gigaboot 是以 EFI 為基礎的系統啟動載入程式,zirconboot 是一種機制,可讓 Zirconboot 系統做為 Zircon 系統啟動載入程式。

在透過 EFI (例如 Acer 和 NUC) 啟動的系統上,上述任一選項均可使用。在其他系統上,「zirconboot」可能是網路啟動的唯一選項。

走 Gigaboot

GigaBoot20x6 系統啟動載入程式會使用簡易的網路啟動通訊協定 (透過 IPV6 UDP),不需要任何特殊的主機設定或具有特殊權限的存取權。

這項功能利用 IPV6 連結本機位址和多點傳送,讓裝置在啟動後就公告了可啟動性,主機可以找到該裝置,並將系統映像檔傳送給 Google。

$BUILDDIR/tools/bootserver $BUILDDIR/zircon.bin

# if you have an extra bootfs image (see above):
$BUILDDIR/tools/bootserver $BUILDDIR/zircon.bin /path/to/extra.bootfs

根據預設,啟動伺服器會繼續執行,每次觀測到網路啟動信標時,就會將核心 (如有提供,如果有的話) 傳送至該裝置。如果您通過 -1 選項,開機伺服器會在成功啟動後結束。

Via Zirconboot

Zirconboot 機制可讓 Zircon 系統做為 Zircon 的系統啟動載入程式。Zirconboot 使用與上述 Gigaboot 相同的啟動通訊協定。

如要使用 zirconboot,請透過核心指令列將 netsvc.netboot=true 引數傳遞至 zircon。zirconboot 啟動時,系統會嘗試透過在附加主機上執行的啟動伺服器,擷取並啟動 zircon 系統。

查看網路記錄

Zircon 的預設版本包含網路記錄服務,會透過連結本機 IPv6 UDP 進行多點傳送系統記錄。請注意,這是一項簡短的駭客攻擊 通訊協定日後將會有所變動。

目前,如果您在具有 -N 標記的 QEMU 上執行 Zircon,或是透過支援的乙太網路介面 (在 NUC 上的 ASIX USB Dongle 或 Intel 乙太網路) 執行 Zircon,記錄器工具就會觀察透過本機連結播送的記錄:

$BUILDDIR/tools/loglistener

偵錯

如需 zircon 環境中偵錯的隨機提示,請參閱偵錯

貢獻變更


  1. binutils 2.30 版本在 aarch64-elfx86_64-elf 設定中,有一些無害的 make check 錯誤。這些程式碼會在上游 binutils-2_30-branch Git 分支版本上修正,這是我們實際建構的內容。不過,2.30 發布版本可順利建構 Zircon,而測試套件本身的測試套件中只是發生了一些錯誤。