内核开发说明

内核底层开发

对于内核开发,在图形控制台出现之前监控或者破坏事情的情况是常见的。

在 x64 机器上通过参数 “kernel.serial=legacy” 强制日志输出到串行控制台。对于其他的串口配置哦,请查看 内核命令

在图形控制台出现前,使用 gfxconsole.early 命令选项,开启早期控制。更多的信息查看内核命令

如果启动后图形控制台出现,当开启 startup.keep-log-visible 会使内核日志一直保持显示。要取消图形控制台,你可以取消视频驱动,它是通过 driver.<drivername>.disable 绑定的。

在天湖(skylake,英特尔的芯片架构)系统上,全部的选项类似下面:

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

构建的参数类似下面的,开启 ENABLE_KERNEL_LL_DEBUG 直接输出到控制台而不是缓存它(用于内核的冻结事件)

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

这里有内核命令参数 kernel.bypass-debuglog,它可以设置 true 强制输出到控制台而不是缓冲它。我们同时使用编译开关和命令参数在命令行被强制解析到控制台之前,便于打印到内核。编译开关设置会覆盖命令行参数(如果两者都存在)。注意,编译开关和命令行参数都有禁用中断请求驱动uart传输的副作用。

更改编译器模块优化

你可以通过定义构建参数模块来覆盖默认的 -On

  1. opt_level := <n>

请求回溯

从用户进程内

为了调试的目的,系统故障日志可以通过请求回溯打印。它需要修改你的代码,但在缺少调试器或者平常的内部调试机制下,是有用的。

  1. #include <lib/backtrace-request/backtrace-request.h>
  2. void my_function() {
  3. backtrace_request();
  4. }

backtrace\_request 被调用,为了断点处理,它导致了一个调试器的异常使用。

来自内核线程

  1. #include <kernel/thread.h>
  2. void my_function() {
  3. thread_print_backtrace(get_current_thread(), __GET_FRAME(0));
  4. }

在启动期输出调试数据

为了在早期启动支持测试系统,这里有个机制是从内核输出数据文件到 /boot 文件夹的。为了输出数据文件,创建一个 VMO(虚拟内存对象),获取它的名字,使用 PA\_VMO\_DEBUG\_FILE 类型的句柄 handle\_info 传递它到 userboot

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

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