内核开发注意事项

低级内核开发

在内核开发中,需要监控或破坏内核是很常见的情况 在 gfxconsole 显示之前

要在 x64 机器上强制启用日志输出到旧版串行控制台,请将 "kernel.serial=legacy"。如需了解其他串行配置,请参阅 kernel.serial kernel_cmdline.md 中的文档。

要在图形控制台显示之前启用早期控制台,请使用 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

直接输出到控制台,而不是进行缓冲(在 内核冻结时,您可以在 build 中启用 ENABLE_KERNEL_LL_DEBUG,如下所示:

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

此外,还有一个内核 cmdline 参数 kernel.bypass-debuglog,可以设置 设置为 true,以强制输出到控制台,而不是进行缓冲。我们之所以 编译开关和 cmdline 参数是为了便于在内核中进行打印 之后 cmdline 将被强制转到控制台。编译开关设置 会替换 cmdline 参数(如果两者都有)。请注意,编译开关 和 cmdline 参数会停用由 irq 驱动的 uart Tx。

更改模块的编译器优化级别

您可以替换模块的默认 -On 级别,方法是在其 build 参数:

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,为其命名,并将其传递给 userboot 并包含类型为 handle_info PA_VMO_DEBUG_FILE(和参数 0)。然后,userboot 会自动传递 然后到 devmgr,devmgr 会将 VMO 导出为路径上的文件

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

熵收集器质量测试使用此机制 充满随机数据的相对较大(约 1 Mbit)的文件。