檢查 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_64
和 aarch64
編譯的近期 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
中的 clang
或 gcc
適用於 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 環境中偵錯的隨機提示,請參閱偵錯。
貢獻變更
- 請參閱 CONTRIBUTING.md