取出 Zircon 原始碼
本指南假設 Fuchsia 專案已簽出至 $FUCHSIA_DIR,且 fx 已設定完成。
使用預設工具鍊建構 Zircon
fx 指令會包裝用於設定、建構及與 Fuchsia 互動的各種工具。fx set 指令用於指定產品和主機板架構。舉例來說,如要將建構目標設為 Zircon,以便模擬 arm64,請執行下列指令:
fx set bringup.qemu-arm64
Fuchsia 使用「產品」的概念建立建構目標集合。啟動產品是最小的產品,功能最少。
下列指令會列印其他產品設定的清單:
fx list-products
下列指令會列印定義的開發板架構清單:
fx list-boards
如要執行建構作業,請執行下列指令:
fx build
建構結果會儲存在 $FUCHSIA_DIR/out/default 中。
明確設定目標工具鍊
根據預設,Fuchsia 會使用 clang 工具鍊。您可以使用 fx set 的 variants 引數,將這項設定設為 gcc:
fx set bringup.x64 --variant gcc
您也可以使用變數旗標啟用 asan。
為所有目標建構 Zircon
您可以使用 fx multi 為所有目標建構,並使用包含所有建構規格的檔案。每個目標的輸出內容都位於 $FUCHSIA_DIR/out/<product>.<board>.variant。多重建構規格的範例是 bringup-cq,這項規格會近似於為 CQ 測試建構的內容。
請先為所有目標建構,再提交,確保建構作業適用於所有架構。
QEMU
如果您只在實際硬體上測試,可以略過這個步驟,但模擬器很適合用於快速本機測試,一般來說值得保留。
如要瞭解如何使用 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。
建議使用 --enable-deterministic-archives 做為 binutils,但這個切換開關並非必要,也能建構出可運作的版本。
如果是 GCC,則必須在 MAKEOVERRIDES=USE_GCC_STDINT=provide 指令列中傳遞 MAKEOVERRIDES=USE_GCC_STDINT=provide。make這可確保 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 應有尾端斜線。如果 clang 或 gcc 適用於 Zircon 的 PATH,您只要使用空白前置字串即可。
將檔案複製到 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 則是一種機制,可讓最小的 Zircon 系統做為 Zircon 的系統啟動載入程式。
在透過 EFI 啟動的系統 (例如 Acer 和 NUC) 上,這兩種選項都可行。在其他系統上,zirconboot 可能是網路開機的唯一選項。
透過 Gigaboot
GigaBoot20x6 開機載入程式會使用簡單的網路開機通訊協定 (透過 IPV6 UDP),不需要任何特殊主機設定或使用權限。
這項功能會運用 IPV6 連結本機位址和多點播送,讓開機中的裝置宣傳其開機能力,主機則可找到該裝置並傳送系統映像檔。
$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
根據預設,bootserver 會繼續執行,並在每次觀察到 netboot 信標時,將核心 (和提供的啟動檔案系統) 傳送至該裝置。如果傳遞 -1 選項,bootserver 會在成功啟動後結束。
透過 Zirconboot
Zirconboot 是一種機制,可讓 zircon 系統做為 zircon 本身的開機載入程式。Zirconboot 採用的啟動通訊協定與上述 Gigaboot 相同。
如要使用 zirconboot,請透過核心指令列將 netsvc.netboot=true 引數傳遞至 zircon。zirconboot 啟動時,會嘗試從所連主機上執行的 bootserver 擷取 zircon 系統並啟動。
查看網路記錄
Zircon 的預設建構版本包含網路記錄服務,可透過連結本機 IPv6 UDP 多點播送系統記錄。請注意,這只是快速解決方法, 通訊協定日後一定會變更。
目前,如果您在 QEMU 上執行 Zircon,並使用 -N 標記,或是在具有支援乙太網路介面的硬體上執行 (ASIX USB Dongle 或 NUC 上的 Intel Ethernet),loglistener 工具會觀察透過本機連結播送的記錄:
$BUILDDIR/tools/loglistener
偵錯
如需在 Zircon 環境中偵錯的隨機提示,請參閱「偵錯」。
提供變更
- 請參閱 CONTRIBUTING.md。
-
binutils2.30 版本在aarch64-elf和x86_64-elf設定中發生一些無害的make check失敗情形。這些問題已在上游binutils-2_30-branchgit 分支中修正,而這正是我們實際建構的內容。但 2.30 版可正常建構 Zircon,只是本身的測試套件會發生一些錯誤。 ↩