核心開發注意事項

低階核心開發

在核心開發作業上,在 gfxconsole 出現前並不常見需要監控或中斷工作。

如要在 x64 機器上強制啟用舊版序列控制台的記錄輸出功能,請傳遞「kernel.serial=legacy」。如需其他序列設定,請參閱 kernel_cmdline.md 中的 kernel.Serial 說明文件。

如要在圖形主控台顯示前啟用早期主控台,請使用 gfxconsole.early cmdline 選項。詳情請參閱 kernel_cmdline.md。啟用 startup.keep-log-visible 可確保如果在啟動後 gfxconsole 啟動時,核心記錄仍會顯示。如要完全停用 gfxconsole,您可以透過 driver.<driver name>.disable 停用其繫結的視訊驅動程式。在 Skylake 系統中,所有選項看起來會像這樣:

$ tools/build-x86/bootserver build-x86/zircon.bin -- gfxconsole.early driver.intel-i915-display.disable

如要直接輸出至主控台,而非緩衝處理 (在核心凍結時相當實用),您可以在建構作業中啟用 ENABLE_KERNEL_LL_DEBUG,如下所示:

fx set ... --args='kernel_extra_defines=["ENABLE_KERNEL_LL_DEBUG"]'

您還可以將核心 cmdline 參數 core.bypass-debuglog 設為 true,設為 true 以強制輸出至主控台,而非進行緩衝處理。之所以同時有編譯開關和 cmdline 參數,是因為在剖析 cmdline 以強制前往主控台前,先在核心中進行列印。編譯切換設定會覆寫 cmdline 參數 (如果兩者同時存在)。請注意,編譯開關和 cmdline 參數都會停用 irq 導向 uart Tx 的副作用。

變更模組的編譯器最佳化層級

只要在建構引數中定義,即可覆寫模組的預設 -On 級別:

opt_level := <n>

要求回溯追蹤記錄

在使用者的程序中

為了進行偵錯,系統當機記錄器可依要求列印反向追蹤記錄。這個檔案需要修改來源,但如果沒有偵錯工具或一般的內建偵錯機制,這項功能就非常實用。

#include "src/lib/debug/backtrace-request.h"

void my_function() {
  backtrace_request_all_threads();
}

呼叫 backtrace\_request 時,會導致偵錯工具用於處理中斷點的例外狀況。如果未附加偵錯工具,系統當機記錄器會處理例外狀況並輸出反向追蹤記錄,然後繼續執行執行緒。

從核心執行緒

#include <kernel/thread.h>

void my_function() {
  thread_print_backtrace(get_current_thread(), __GET_FRAME(0));
}

在啟動時匯出偵錯資料

為了在早期啟動期間支援測試系統,有一個機制可將資料檔案從核心匯出至 /Boot 檔案系統。如要匯出資料檔案,請建立 VMO、命名,然後透過 PA_VMO_DEBUG_FILE 類型 (和引數 0) 的 handle_info 將其傳送至使用者啟動程序。接著,使用者啟動程序會自動傳遞至 devmgr,而 devmgr 會將 VMO 匯出為路徑中的檔案

/boot/kernel/<name-of-vmo>

熵收集器品質測試會運用這項機制,匯出內含隨機資料的大型 (約 1 Mbit) 檔案。