Zircon 内核命令行选项

适用于所有机器的选项

aslr.disable=<bool>

默认值false

如果设置此选项,系统将不会使用地址空间布局随机化。

aslr.entropy_bits=<uint8_t>

默认值0x1e

对于使用 ASLR 的地址空间,此参数用于控制随机化中的熵位数。熵越高,地址空间越稀疏,并且会使用更多内存来存储页表。有效值的范围为 0-36。

kernel.cprng-reseed-require.hw-rng=<bool>

默认值false

启用后,如果硬件 RNG 在重新生成种子时失败,CPRNG 会 panic。

kernel.cprng-reseed-require.jitterentropy=<bool>

默认值false

启用后,如果 jitterentropy 在重新播种时失败,CPRNG 会 panic。

kernel.cprng-seed-require.hw-rng=<bool>

默认值false

启用后,如果硬件 RNG 在初始种子时失败,CPRNG 会 panic。

kernel.cprng-disable.jitterentropy=<bool>

默认值false

确定是否将 jitterentropy 用作熵源(用于测试)

kernel.cprng-disable.hw-rng=<bool>

默认值false

确定是否将硬件 RNG 用作熵源(用于测试)

kernel.cprng-seed-require.jitterentropy=<bool>

默认值false

启用后,如果 jitterentropy 未能成功完成初始种子,CPRNG 会 panic。

kernel.cprng-seed-require.cmdline=<bool>

默认值false

启用后,如果您未通过内核命令行提供熵输入,CPRNG 会 panic。

kernel.entropy-mixin=<hexadecimal>

提供要混入内核的 CPRNG 中的熵。该值必须是小写十六进制数字字符串。

系统会尽快从内存中清除原始值,并从所有诊断输出中隐去该值。

kernel.jitterentropy.bs=<uint32_t>

默认值0x40

为 jitterentropy 设置“内存块大小”参数。当 jitterentropy 执行内存操作(以增加 CPU 时间变化)时,将以此大小的块访问内存。

kernel.jitterentropy.bc=<uint32_t>

默认值0x200

为 jitterentropy 设置“内存块数”参数。当 jitterentropy 执行内存操作(以增加 CPU 时间变化)时,此参数会控制访问的块(大小为 kernel.jitterentropy.bs)的数量。

kernel.jitterentropy.ml=<uint32_t>

默认值0x20

为 jitterentropy 设置“memory loops”参数。当 jitterentropy 执行内存操作(以增加 CPU 时间变化)时,此参数会控制内存访问例程的重复次数。仅当 kernel.jitterentropy.raw 为 true 时,此参数才会用到。如果此参数的值为 0kernel.jitterentropy.rawfalse,则 jitterentropy 会以近似随机的方式选择循环次数。

kernel.jitterentropy.ll=<uint32_t>

默认值0x1

为 jitterentropy 设置“LFSR 循环”参数。当 jitterentropy 执行 CPU 密集型 LFSR 操作(以增加 CPU 时间变化)时,此参数会控制 LFSR 例程的重复次数。仅当 kernel.jitterentropy.raw 为 true 时,才会使用此参数。如果此参数的值为 0kernel.jitterentropy.rawfalse,则 jitterentropy 会以近似随机的方式选择循环次数。

kernel.jitterentropy.raw=<bool>

默认值true

如果为 true,则 jitterentropy 熵收集器将返回未经处理的原始样本。如果为 false,系统会使用 jitterentropy 处理原始样本,生成看起来更接近均匀随机的输出数据。请注意,即使将其设置为 false,CPRNG 也会重新处理样本,因此 jitterentropy 中的处理有点多余。

kernel.lockup-detector.critical-section-threshold-ms=<uint64_t>

默认值0xbb8

如果 CPU 在指定的关键部分停留的时间超过此阈值,系统会发出 KERNEL OOPS。

另请参阅 k lockup status锁死检测器

设为 0 时,关键部分锁定检测功能会被停用。

当 kernel.lockup-detector.heartbeat-period-ms 为 0 时,关键部分锁死检测功能会被停用。

kernel.lockup-detector.critical-section-fatal-threshold-ms=<uint64_t>

默认值0x2710

如果 CPU 在指定的关键代码段中停留的时间超过此阈值,系统将生成崩溃日志并重新启动,并在重新启动时指明重新启动原因为 SOFTWARE_WATCHDOG

另请参阅 k lockup status锁死检测器

设为 0 时,系统会停用关键代码段崩溃日志生成和重新启动。

当 kernel.lockup-detector.heartbeat-period-ms 为 0 时,关键部分锁死检测功能会被停用。

kernel.lockup-detector.heartbeat-period-ms=<uint64_t>

默认值0x3e8

辅助 CPU 应通过内核计时器发出心跳信号的频率。此值应足够大,不会影响系统性能,但应小于心跳间隔时间阈值。1000 是一个合理的值。

另请参阅锁死检测器

为 0 时,系统会停用心跳检测。

kernel.lockup-detector.heartbeat-age-threshold-ms=<uint64_t>

默认值0xbb8

辅助 CPU 上次心跳的最长时长(超过此时长后,系统会将其视为已锁死)。此值应大于心跳周期,但不应过小,以免错过短暂的锁定事件。3000 是一个合理的值。

另请参阅锁死检测器

为 0 时,系统会停用心跳检测。

kernel.lockup-detector.heartbeat-age-fatal-threshold-ms=<uint64_t>

默认值0x2710

CPU 上次心跳的最长时长,如果超过此时长,系统会认为 CPU 已锁定,并触发生成崩溃日志,指明重新启动原因为 SOFTWARE_WATCHDOG,然后重新启动。

另请参阅锁死检测器

为 0 时,心跳崩溃日志生成和重新启动功能会被停用。

kernel.lockup-detector.diagnostic-query-timeout-ms=<uint64_t>

默认值0x64

在放弃之前,从无响应的 CPU 尝试获取诊断数据的最长时间。

设为 0 时,系统会停用查询诊断数据的功能。

kernel.oom.behavior=[reboot | jobkill]

默认值reboot

此选项可用于配置内存不足 (OOM) 情况时内核的行为。有效值为 jobkillreboot

如果设置为 jobkill,则在遇到 OOM 时,内核会尝试终止已将 ZX_PROP_JOB_KILL_ON_OOM 位设置为 1 的作业以恢复内存。

如果设置为 reboot,当遇到 OOM 时,内核会发出内存不足事件 (请参阅 zx_system_get_event()),等待一段时间,然后重新启动系统。等待时长的长度由 kernel.oom.reboot-timeout-ms 启动选项设置,预计在此等待期间,用户空间会在收到 OOM 信号后触发关闭。

kernel.oom.reboot-timeout-ms=<uint32_t>

默认值0xc350

此选项用于设置内核在发出内存不足 (OOM) 事件后重新启动系统之前要等待的时间。只有当 kernel.oom.behavior 设为 reboot 时,此选项才相关。

kernel.mexec-force-high-ramdisk=<bool>

默认值false

此选项仅用于测试。设置为 true 时,它会强制 mexec 系统调用将以下内核的 ramdisk 放置在高内存(64 位地址空间,偏移量大于等于 4 GiB)中。

kernel.mexec-pci-shutdown=<bool>

默认值true

如果为 false,此选项会在调用 mexec 时让 PCI 设备保持运行状态。

kernel.oom.enable=<bool>

默认值true

此选项会在内核中启用内存不足 (OOM) 监控,当 PMM 的可用内存低于 kernel.oom.outofmemory-mb 且无法回收任何内存时,系统会按 kernel.oom.behavior 执行操作。

您可以使用 k mem oom 命令手动触发 OOM,这会导致可用内存低于 kernel.oom.outofmemory-mb 阈值。可以使用 k mem oom <rate> 提供分配率,其中 <rate> 以 MB 为单位。这将导致系统每秒分配指定的内存量,这对于观察内存压力状态转换非常有用。

如需详细了解内存压力状态转换,请参阅 kernel.oom.outofmemory-mbkernel.oom.critical-mbkernel.oom.warning-mbzx_system_get_event()

您可以使用 k mem dump 命令查询当前的内存可用性状态。

kernel.oom.outofmemory-mb=<uint64_t>

默认值0x32

此选项用于指定可用内存阈值,如果没有可释放的可回收内存,内核将在达到此阈值时发出内存不足事件并执行 kernel.oom.behavior 指定的操作。

kernel.oom.critical-mb=<uint64_t>

默认值0x96

此选项用于指定可用内存阈值,当可用内存低于此阈值时,内核会发出严重内存压力事件,指示进程应释放内存。

kernel.oom.warning-mb=<uint64_t>

默认值0x12c

此选项用于指定可用内存阈值,当可用内存达到此阈值时,内核会发出警告内存压力事件,指示进程应减慢内存分配速度。

kernel.oom.debounce-mb=<uint64_t>

默认值0x1

此选项用于指定在根据空闲内存阈值 (kernel.oom.outofmemory-mbkernel.oom.critical-mbkernel.oom.warning-mb) 计算内存压力状态时使用的内存去抖值。内存可用性状态之间的转换会通过以下方式进行去抖:在离开某个状态之前,系统会等待该状态之外的空闲内存量至少达到 kernel.oom.debounce-mb

例如,假设 kernel.oom.critical-mb 设置为 100 MB,kernel.oom.debounce-mb 设置为 5 MB。如果系统当前有 90 MB 的可用内存,即处于“严重”状态,则可用内存必须增加到至少 105 MB(100 MB + 5 MB),状态才会从“严重”更改为“警告”。

kernel.oom.evict-at-warning=<bool>

默认值false

如果设置为 true,此选项会在内存压力处于“警告”状态时触发内核驱逐可回收内存。如果设置为 false,则会在“严重”内存压力状态下触发驱逐。

kernel.oom.evict-continuous=<bool>

默认值false

此选项会将内核驱逐配置为在后台持续运行,以尝试让系统避免出现内存压力,而不是仅在内存压力状态转换时触发一次性驱逐。

kernel.oom.hysteresis-seconds=<uint64_t>

默认值0xa

此选项用于指定内存压力状态转换之间的滞后时间(以秒为单位)。请注意,滞后效应仅适用于从空闲内存较少的状态转换到空闲内存较多的状态;反方向的转换不会延迟。

kernel.oom.imminent-oom-delta-mb=<uint64_t>

默认值0xa

此选项用于指定超出内存不足阈值(系统会在此阈值达到时发出即将发生内存不足事件的信号)的增量(以 MB 为单位)。此信号旨在用于捕获接近 OOM 的诊断内存信息,因为可能无法在 OOM 时刻准确捕获状态。

例如,如果 kernel.oom.outofmemory-mb 设置为 50,kernel.oom.imminent-oom-delta-mb 设置为 20,则当可用内存达到 70MB(即 50MB + 20MB)时,系统会发出即将耗尽内存事件信号,而当可用内存达到 50MB 时,系统会发出耗尽内存事件信号。

kernel.oom.trigger-on-alloc-failure=<bool>

默认值true

此选项用于控制因内存不足而导致的可能对用户可见的 PMM 分配失败是否会触发 OOM 响应。

kernel.phys.next=<string>

默认值physboot

内核存储文件系统 physload 将加载的文件的名称。

kernel.phys.verbose=<bool>

默认值true

此参数用于控制在内核的早期启动阶段向串行控制台记录日志的程度;如果为 false,则只会进行与错误相关的日志记录。

此选项的一个实用功能是用于基准测试:在 physboot 中花费的整个时间中,同步单线程 UART 写入可能相对较耗时(10 个字符/毫秒),因此最好将此类工作从整体时间测量中排除。

kernel.phys.backtrace-max=<uint32_t>

默认值0x40

如果内核的早期启动阶段发生崩溃,它可以在串行控制台上输出回溯;它会输出基于帧指针的回溯,如果构建为使用影子调用堆栈,还会输出基于影子调用堆栈的并行回溯。每次回溯最多只会输出这么多帧。(大多数回溯会在达到上限之前以最外层帧结束。)将限制设置为零会输出无限帧,这对于帧指针回溯可能会导致进入无限循环并出现一些 bug。

kernel.phys.print-stack-max=<uint32_t>

默认值0x400

当内核的早期启动阶段发生崩溃时,它可能会在串行控制台上输出堆栈内容。这是要转储的堆栈内存的大小上限(以字节为单位);实际转储的大小取决于堆栈深度。堆栈的每个 16 个字节都会在一行中输出,最多使用 75 个字符。

kernel.ppb.borrow-in-supplypages=<bool>

默认值false

此项设置用于控制 zx_pager_supply_pages 是否可以借用已借用的页面。如果为 true,如果有任何已借用的页面可用且所提供的页面尚未借出,zx_pager_supply_pages 会将所提供的页面内容复制到借用的页面中;否则,zx_pager_supply_pages 会将所提供的页面安装到 VMO 中。如果为 false,zx_pager_supply_pages 会将提供的页面安装到 VMO(无论这些页面是否已被借出)。

kernel.ppb.borrow-on-mru=<bool>

默认值false

此参数用于控制在非借阅页面移至 MRU 队列时,是否将非借阅页面替换为借阅页面(如果有任何借阅页面可用)。在正常情况下,此移动是延迟执行的,但在接近 OOM 时,随着驱逐的进行,所有应位于 MRU 队列中的页面都会移至 MRU 队列。

kernel.ppb.loan=<bool>

默认值false

这用于控制是否在连续的 VMO 上启用 ZX_VMO_OP_DECOMMIT。如果为 true,则可以对连续的 VMO 进行取消提交并返回 ZX_OK。这些页面会借给系统的其余部分,以供潜在借用。如果为 false,则取消提交将返回 ZX_ERR_NOT_SUPPORTED。

kernel.ppb.replace-on-unloan=<bool>

默认值false

这用于控制在借用的页面重新提交到其原始连续 VMO 时会发生什么情况。如果为 false,则系统会将页面从其借用来源中驱逐,这会导致相应内容发生故障并重新加载。如果为 true,系统会将内容复制到用于替换借用页面的新页面。

kernel.render-dlog-to-crashlog=<bool>

默认值false

设置为 true 后,系统会在内核 panic 期间将尽可能多的近期内核调试日志附加到生成的崩溃日志,以协助调试。

kernel.serial=[none | legacy | qemu | <type>,<base>,<irq>]

默认值none

这用于控制要使用的串行端口。如果提供,则会替换系统的 bootdata 中所述的串行端口。内核调试串行端口是预留资源,不得在内核之外使用。

如果设置为“none”,则内核调试串行端口将被停用且不会被预留,从而允许在内核之外使用默认串行端口。

配置字符串格式如下: 对于 MMIO UART: "kernel.serial=UART_MODEL,MMIO_ADDR,IRQ,FLAGS" 对于 PIO UART: "kernel.serial=UART_MODEL,IOPORT,IRQ"

kernel.vdso.always_use_next=<bool>

默认值false

如果设置此选项,内核将以“next”vDSO 而不是“stable”vDSO 作为默认 vDSO 提供给用户空间。

vdso.ticks_get_force_syscall=<bool>

默认值false

如果设置此选项,系统会强制将 zx_ticks_get vDSO 调用设为真正的系统调用,即使硬件周期计数器寄存器可从用户模式访问也是如此。

vdso.clock_get_force_syscall=<bool>

默认值false

如果设置此选项,系统会强制将 zx_clock_get_monotoniczx_clock_get_boot vDSO 调用转换为真正的系统调用,而不是仅在用户模式下对计数器进行转换。

kernel.userpager.overtime_wait_seconds=<uint64_t>

默认值0x14

此选项用于配置用户分页器故障在被视为超时并向调试日志输出一条信息消息后继续等待之前可能阻塞的时长。值为 0 表示等待时间永远不会被视为超时。

kernel.userpager.overtime_timeout_seconds=<uint64_t>

默认值0x12c

此选项用于配置用户分页器故障在被中止之前可以阻塞的时长。对于硬件页面错误,出错线程将因严重页面错误异常而终止。对于由系统调用触发的软件页面故障,系统调用将失败并返回 ZX_ERR_TIMED_OUT。值为 0 表示页面故障绝不会因超时而被中止。

kernel.heap-max-size-mb=<uint64_t>

默认值0x800

此选项用于配置堆的大小上限。仅当内核已编译为使用虚拟堆时才有效。

kernel.heap.alloc_fill_threshold=<uint64_t>

默认值0x0

设置后,内核堆将填充小于此大小(以字节为单位)的分配。

kernel.bufferchain.reserve-pages=<uint64_t>

默认值0x20

指定要为缓冲区链分配(通道消息)预留的每个 CPU 的页面数量。值越高,系统在负载下对 PMM 的争用就越少,但系统在空闲时使用的内存就越多。

TODO(https://fxbug.dev/42147481):确定此值的上限,以防止消耗过多内存。

kernel.bypass-debuglog=<bool>

默认值false

启用后,会强制将输出发送到控制台,而不是进行缓冲。我们同时提供编译开关和 cmdline 参数,是为了在解析 cmdline 之前在内核中方便输出,以便强制转到控制台。编译开关设置会覆盖 cmdline 参数(如果同时存在这两个参数)。请注意,编译开关和 cmdline 参数都会导致停用 irq 驱动的 UART Tx 的副作用。

kernel.debug_uart_poll=<bool>

默认值false

如果为 true,则会定期轮询 UART 并将其内容转发到控制台。

kernel.enable-debugging-syscalls=<bool>

默认值false

停用后,某些与调试相关的系统调用将会失败并返回 ZX_ERR_NOT_SUPPORTED。这三个方法是:

  • zx_debug_send_command()
  • zx_ktrace_control()
  • zx_ktrace_init()
  • zx_ktrace_read()
  • zx_ktrace_write()
  • zx_mtrace_control()
  • 包含 ZX_PROP_PROCESS_HW_TRACE_CONTEXT_IDzx_object_get_property()
  • zx_process_write_memory()
  • zx_system_mexec()
  • zx_system_mexec_payload_get()
  • zx_thread_write_state()(使用 ZX_THREAD_STATE_DEBUG_REGS 类型时)。
  • 包含 ZX_VMO_OP_CACHE_INVALIDATEzx_vmo_op_range()

kernel.enable-serial-syscalls=[false | true | output-only]

默认值false

如果为 false,则 zx_debug_read()zx_debug_write() 都将失败并返回 ZX_ERR_NOT_SUPPORTED

如果为 output-onlyzx_debug_read() 将失败并返回 ZX_ERR_NOT_SUPPORTED,但 zx_debug_write() 将正常运行。

如果为 true,则这两项都将正常运行。

kernel.entropy-test.src=[hw_rng | jitterentropy]

默认值hw_rng

运行熵收集器质量测试时,请使用提供的熵源。除非内核是使用 ENABLE_ENTROPY_COLLECTOR_TEST=1 构建的,否则系统会忽略此选项。

kernel.entropy-test.len=<uint64_t>

默认值0x100000

运行熵收集器质量测试时,收集所提供的字节数。

您可以通过将 ENTROPY_COLLECTOR_TEST_MAXLEN 定义为此值来增加最大值。

kernel.force-watchdog-disabled=<bool>

默认值false

设置后,系统会在启动顺序中尽快尝试停用引导加载程序已启用并传递的所有硬件监视器计时器,假定引导加载程序提供了足够的信息来了解如何停用 WDT。

kernel.halt-on-panic=<bool>

默认值false

如果设置此选项,系统会在发生内核 panic 时停止,而不是重新启动。如需启用 panic 时停止功能,请传递内核命令行参数 kernel.halt-on-panic=true

由于内核在启用 GPU 时无法可靠地绘制到帧缓冲区,因此如果内核崩溃或 panic,系统会默认重新启动。

如果内核崩溃并重启系统,内核 panic 的日志将显示在 /boot/log/last-panic.txt 中,可供查看、下载等。

请在提交的任何内核 panic bug 中附上 last-panic.txtzircon.elf 文件。

如果存在 last-panic.txt,则表示这是内核 panic 发生以来首次成功启动。

它不会“粘性”存在 - 如果您正常重启,它将会消失;如果您再次崩溃,它将会被替换。

ktrace.bufsize=<uint32_t>

默认值0x20

此选项用于指定为 ktrace 记录分配的兆字节数。

ktrace.grpmask=<uint32_t>

默认值0x0

此选项用于指定要发出的 ktrace 记录。该值是 zircon/ktrace.h 中的 KTRACE_GRP_* 值的位掩码。十六进制值可以指定为 0xNNN。

kernel.memory-limit-dbg=<bool>

默认值true

此选项可启用内存限制库中的详细日志记录。

kernel.memory-limit-mb=<uint64_t>

默认值0x0

此选项用于为系统内存设置上限(以兆字节为单位)。如果设置为零,则不设置上限。

例如,选择足够低的值可让用户模拟实际物理内存较少的系统。

kernel.page-scanner.enable-eviction=<bool>

默认值true

设置后,内核可以通过驱逐文件页和未锁定的可丢弃 VMO 或执行页面压缩来释放可回收内存。回收可以减少内存用量并防止内存不足的情况,但会使系统行为的某些时间可预测性消失。

kernel.page-scanner.page-table-eviction-policy=[always | never | on_request]

默认值always

为未访问的用户页表设置回收政策。

设为 on_request 时,仅在有请求时执行驱逐操作,例如在响应内存不足情形时。

如果为 never,则页面表永远不会被驱逐。

always 时,系统会定期驱逐未使用的页面表。该时段可由 kernel.page-scanner.page-table-eviction-period 控制。

kernel.page-scanner.page-table-eviction-period-ms=<uint32_t>

默认值0x2710

设置页面表扫描速率(以毫秒为单位)。在两次连续扫描之间未使用的任何页面表都属于要被驱逐的候选对象。

此选项仅在 kernel.page-scanner.page-table-eviction-policy=always 时有效。

kernel.page-scanner.min-aging-interval-ms=<uint32_t>

默认值0x7d0

设置连续老化事件之间的最短时间(以毫秒为单位)。此处值越高,活跃集就越稳定,发生过载行为的可能性就越小,收集网页访问信息所花的时间就越短。值越低,有效集就越小,回收机会就越多。

此值应小于或等于 kernel.page-scanner.max-aging-interval-ms

kernel.page-scanner.max-aging-interval-ms=<uint32_t>

默认值0x3a98

设置连续老化事件之间的最长时间(以毫秒为单位)。此时间是网页生命周期信息的潜在最差粗糙程度,如果系统行为快速变化,较高的值可能会导致没有足够的生命周期信息来执行回收。值越低,页面就会在最早的令牌桶中累积,从而导致页面丢失保真度信息,从而增加在发生回收时选择次优页面的几率。

此值应大于或等于 kernel.page-scanner.min-aging-interval-ms

kernel.page-scanner.accessed-scan-interval-ms=<uint32_t>

默认值0xbb8

设置收集网页访问信息之间的时间(以毫秒为单位)。值越低,年龄保真度越高,页面回收选择的准确性也会提高,但会增加收集所花费的 CPU 时间。

将此值设置为低于 kernel.page-scanner.min-aging-interval-ms 不会带来任何好处。

kernel.page-scanner.active-ratio-multiplier=<uint32_t>

默认值0x2

控制在触发过时之前,活跃网页与非活跃网页的允许比率。 该比率表示为乘数,以简化内核算法 should_age = active_page_count * active_ratio_multiplier > inactive_page_count。乘数越高,老化事件的频率就越高,因此活跃集中的网页就越少。将乘数设为 0 会停用基于活跃网页比例的过时功能。

活跃比例仅在 kernel.page-scanner.min-aging-interval-mskernel.page-scanner.max-aging-interval-ms 之间的时间段内触发过时,因此如果这两个时间间隔相等,则没有任何影响。

kernel.page-scanner.start-at-boot=<bool>

默认值true

此选项会导致内核活动内存扫描器在启动时被初始启用。您还可以使用内核控制台启用和停用它。如果停用扫描器,您可以获得更高的系统可预测性,因为它会移除基于时间和后台的内存回收。

扫描器执行的每项操作都可以单独配置和停用。如果所有操作均处于停用状态,则启用扫描器不会产生任何影响。

kernel.page-scanner.zero-page-scans-per-second=<uint64_t>

默认值0x4e20

此选项用于配置零页面扫描器每秒会考虑的候选网页的数量上限。

将其设置为零表示不会发生零页扫描。这可以为基准测试或其他工作负载提供额外的系统可预测性。

网页扫描器必须处于运行状态,此选项才能生效。您可以在启动时使用 kernel.page-scanner.start-at-boot 选项启用它。

此值的选择是为了确保在最糟糕的情况下,低端 ARM 设备上的 CPU 占用率不超过 5%。具体配置可能需要根据需要将此值调高(或调低)。

kernel.page-scanner.lru-action=[none | evict_only | compress_only | evict_and_compress]

默认值none

设置对 LRU 队列中的旧页面执行的任何回收操作。无论内存压力如何,这些操作都会发生。如果指定了 none 操作,则系统不会仅仅因为页面过时而回收页面。

支持的操作包括: - none - evict_only - compress_only - evict_and_compress

kernel.compression.random-debug-compress=<bool>

默认值false

启用此测试选项会导致虚拟机立即随机压缩网页,无论其年龄如何。这是为了便于测试压缩路径,而无需等待页面过时并将系统置于低内存状态。如果内核未启用调试断言构建,或者未设置压缩和存储策略,则启用此选项会出错。

kernel.compression.strategy=[none | lz4]

默认值none

支持的压缩策略包括: - none - lz4

此选项用于选择在需要压缩网页时要使用的压缩策略。如果设置了 none,则 kernel.compression.storage-strategy 也必须为 none。选择 none 会有效停用压缩。

kernel.compression.storage-strategy=[none | tri_page]

默认值none

支持的压缩存储策略包括: - none - tri_page

此选项用于选择要用于存储已压缩数据的所需存储策略。如果设置了 none,则 kernel.compression.strategy 也必须为 none

kernel.compression.threshold=<uint32_t>

默认值0x46

此选项用于控制必须达到的压缩阈值,压缩后的页面才能存储。未达到此阈值的网页将继续以未压缩的形式存储。

此选项是一个百分比,值为 100 表示网页只需压缩到至少原始大小,值为 0 表示网页需要压缩到零大小。

有效值介于 1 到 100 之间(包括这两个数值)。

kernel.compression.lz4.acceleration=<uint32_t>

默认值0xb

此选项用于控制向 LZ4 压缩实现提供的加速因子。如需了解如何解读此值,请参阅当前的 LZ4 实现。

kernel.compression.at_memory_pressure=<bool>

默认值false

此选项用于控制是否应根据内存压力执行页面压缩。

为了使此选项发挥作用,需要启用 kernel.page-scanner.enable-eviction,并设置 kernel.compression.strategy 和 kernel.compression.storage-strategy。

kernel.compression.reclaim_anonymous=<bool>

默认值false

此选项用于控制是否将匿名网页放入可回收的网页队列中,以及是否具有关联的年龄信息。启用此功能会为用于年龄跟踪的匿名网页增加一小部分开销,但对于“kernel.compression.at_memory_pressure”等选项来说,必须启用此功能才能生效。

kernel.compression.reclaim_zero_forks=<bool>

默认值false

此选项类似于“kernel.compression.reclaim_anonymous”,但适用于匿名页面的零分支。启用此选项会使“kernel.page-scanner.zero-page-scans-per-second”选项无效,如果未启用“kernel.compression.reclaim_anonymous”,则启用此选项会出错。

kernel.pmm-checker.action=[oops | panic]

默认值oops

此选项用于指定在 PMM 检查器检测到损坏时执行哪项操作。值必须为以下各项之一: * oops - 检测到损坏时,系统会发出非严重的 kernel OOPS。 * panic - 检测到损坏时,会发生严重的 kernel panic。

kernel.pmm-checker.enable=[true | false | auto]

默认值false

此标志用于控制是否启用 PMM 的释放后使用检查器。PMM 检查器的开销可能较高,适用于调试 build 和开发 build。值必须为以下各项之一: * true - 始终启用检查器。 * false - 检查工具始终处于停用状态。 * auto - 内核根据环境及其性能特征决定是否启用检查器。在 Hypervisor 下运行是需要考虑的一个因素。 另请参阅“k pmm 检查器”。

kernel.pmm-checker.fill-size=<uint64_t>

默认值0x1000

此选项用于指定启用 PMM 的“释放后使用”检查器后,每个空闲页的多少字节会被填充或检查。有效值为 8 的倍数,介于 8 和 PAGE_SIZE 之间(包括这两个数值)。

kernel.pmm.alloc-random-should-wait=<bool>

默认值false

启用一个测试选项,使 PMM 无论当前内存级别如何,都会随机使用 ZX_ERR_SHOULD_WAIT 失败可等待的页面分配。这是为了便于测试等待路径,而无需将系统置于低内存状态。如果内核未启用调试断言进行构建,则启用此选项是错误的。

kernel.portobserver.reserve-pages=<uint64_t>

默认值0x8

指定要为端口观察器(异步等待)分配预留的每个 CPU 的页面数量。值越高,系统在负载下对 PMM 的争用就越少,但系统在空闲时使用的内存就越多。

kernel.portpacket.reserve-pages=<uint64_t>

默认值0x1

指定要为端口数据包 (port_queue) 分配预留的每个 CPU 的页面数量。值越高,系统在负载下对 PMM 的争用就越少,但系统空闲时使用的内存就越多。

kernel.root-job.behavior=[halt | reboot | bootloader | recovery | shutdown]

默认值reboot

此选项用于指定在根作业终止或没有作业和进程时内核应执行的操作。

halt 时,会暂停系统。

reboot 时,系统会重新启动。

bootloader 时,系统会重新启动到引导加载程序。

recovery 时,系统会重新启动到恢复分区。

shutdown 时,系统会关闭。

kernel.root-job.notice=<string>

此选项允许在根作业终止或没有作业和进程时输出通知。

kernel.shell=<bool>

默认值false

指示内核在内核控制台中启动自己的 shell,而不是启动用户空间。

kernel.shell.script=<string>

指示内核运行包含 kernel.shell 命令的预设脚本。如果还指定了 kernel.shell,则在脚本完成后会显示内核 Shell 命令提示符,除非脚本关闭系统。由于内核命令行上的空格用于分隔不同的启动选项,因此脚本中的 + 字符会替换为空格,以允许使用参数的命令,而 ; 字符可用于分隔脚本中的命令。

kernel.smp.ht=<bool>

默认值true

此选项用于指定是否应启用超线程 (HT) 逻辑 CPU。

kernel.test.ram.reserve=<std::optional>

指定要预留的物理 RAM 范围以供测试。 此值应仅写为 SIZE(一个应与页面对齐的整数字节量),但在内核在早期启动中分配地址后,将会读回为 SIZE,ADDRESS。

kernel.port.max-observers=<uint64_t>

默认值0xc350

指定任何单个端口可以拥有的观察器数量上限。达到此限制后,超出限制的进程中会引发 Zircon 异常。此值应足够高,以确保行为良好的程序不会达到上限,但也应足够低,以便在行为异常的程序影响系统之前终止它们。

kernel.select=<string>

默认值zircon

要从 ZBI 中的 STORAGE_KERNEL 项启动的内核软件包的名称。

kernel.scheduler.prefer-little-cpus=<bool>

默认值false

在搜索用于放置任务的 CPU 时,应优先使用小核,而不是大核。启用此选项会以降低性能为代价来降低功耗。

已废弃 - 此选项计划在即将发布的版本中移除。请勿对其建立任何关键依赖项。

kernel.ubsan.action=[oops | panic]

默认值panic

使用 UndefinedBehaviorSanitizer 对内核进行插桩后,它检测到的问题会在串行控制台中报告。这些错误可能是严重的,也可能不是。值必须为以下值之一: * oops - 检测到的未定义行为会导致非严重的 kernel OOPS。 * panic - 检测到未定义的行为会导致严重的内核 panic。

仅适用于 arm64 机器的选项

kernel.arm64.disable_spec_mitigations=<bool>

默认值false

如果设置,则会停用所有推测性执行信息泄露缓解措施。

如果未设置,系统将使用每种缓解措施的默认值。

kernel.arm64.event-stream.enable=<bool>

默认值true

启用后,每个 ARM CPU 都会启用事件流生成器,该生成器会以特定速率为每个 CPU 设置隐藏事件标志。这会将 cpu 从它们可能处于的任何 WFE 状态中踢出。

kernel.arm64.event-stream.freq-hz=<uint32_t>

默认值0x2710

如果事件流已启用,则指定其尝试运行的频率。分辨率有限,因此驱动程序只能从 CPU 计时器计数器中选择最接近的 2 的幂。

kernel.arm64.debug.dap-rom-soc=<string>

如果设置,则会尝试在特定 SoC 的硬编码地址处初始化 dap 调试接口。目前接受的值为 amlogic-t931g、amlogic-s905d2、amlogic-s905d3g 和 amlogic-a311d。

kernel.smp.maxcpus=<uint32_t>

默认值0x10

此选项会限制要初始化的 CPU 数量。它不能大于特定架构的 SMP_MAX_CPUS

kernel.phys.psci-reset=[disabled | shutdown | reboot | reboot-bootloader | reboot-recovery]

默认值reboot

此选项用于确定在需要紧急警报和崩溃时,早期启动内核将使用哪种 PSCI 重置操作(如果有)。如果此值为“disabled”,则机器可能会在 panic 时进入无限循环。

kernel.arm64.phys.mmu=<bool>

默认值true

这样,便可以在内核的早期启动阶段使用 MMU 和缓存。

kernel.arm64.enable-asid=<bool>

默认值true

这样便可使用 ASID。如果底层硬件支持 16 位 ASID,则默认为 true。

kernel.arm64.alternate-vbar=[none | auto | arch3 | arch1 | psci | smccc10]

默认值auto

这会选择用于解决从 EL0 进入 EL1 时出现的 CPU 专用问题的备用异常矢量实现。值可以是: * none - 在早期 EL0 异常路径中未执行任何缓解措施。 * auto(默认)- 根据固件通过 SMCCC / PSCI 接口报告的可用性选择 SMCCC 函数标识符。然后,每个单独的 CPU 都会查询固件,以确定是否需要任何权宜解决方法。如果固件不是 SMCCC >= 1.1,并且报告它支持 SMCCC_ARCH_WORKAROUND_3 和/或 SMCCC_ARCH_WORKAROUND_1 函数标识符,则这与 none 的效果相同。如果固件支持该功能,则每个 CPU 都会根据固件对该 CPU 所需的操作,决定是否使用固件权宜解决方法。无论哪种方式,如果备选 Spectre 缓解措施与固件权宜解决方法重复,或者在不需要固件权宜解决方法时不需要,则会被停用。 * arch3 - 始终在每个 CPU 上使用 SMCCC_ARCH_WORKAROUND_3。如果固件不支持 SMCCC 1.1 或不支持 SMCCC_ARCH_WORKAROUND_3,这可能会产生不可预知的影响。这样一来,当固件支持该函数时,每个 CPU 都会执行固件指明应使用该函数的每个单独 CPU 的 auto 所选择的操作。这还会停用与 SMCCC_ARCH_WORKAROUND_3 重复的备选 Spectre 缓解措施。* arch1 - 始终在每个 CPU 上使用 SMCCC_ARCH_WORKAROUND_1。如果固件不支持 SMCCC 1.1 或不支持 SMCCC_ARCH_WORKAROUND_1,这可能会产生不可预知的影响。这样一来,当固件支持“1”函数但不支持“3”函数时,每个 CPU 都会执行 auto 为固件指明应使用该函数的每个单独 CPU 选择的操作。这还会停用与 SMCCC_ARCH_WORKAROUND_1 重复的备选 Spectre 缓解措施。* psci - 在每个 CPU 上,始终将 PSCI_VERSION 与 SMCCC 1.1 调用规范搭配使用。如果固件不支持 SMCCC 1.1,这可能会产生不可预知的影响。目前,auto 绝不会为任何 CPU 选择此行为。 * smccc10 - 在每个 CPU 上,始终将 PSCI_VERSION 与 SMCCC 1.0 调用规范搭配使用。这在所有系统上都是安全的,但开销比 SMCCC 1.1 选项高,并且在某些 CPU 上可能不需要。目前,auto 绝不会为任何 CPU 选择此行为。与具有异构核心的 SoC 一样,应为每个单独的 CPU 进行不同的选择,auto 以外的值应仅用于测试。

kernel.arm64.force-pct=<bool>

默认值false

默认情况下,内核会选择 ARM 虚拟计数器 (VCT) 作为系统的时间参考。只有在为其分配了实体计时器硬件的 IRQ(但未分配虚拟计时器硬件的 IRQ)时,它才会选择实体计数器 (PCT)。设置 force-pct 选项后,内核将始终选择使用 PCT 作为时间参考,即使 ZBI 中提供了 VCT IRQ 也是如此。请注意,如果在未定义 PCT IRQ 的目标上设置 force-pct,则会导致在早期启动期间发生 panic。

仅适用于 riscv64 机器的选项

kernel.smp.maxcpus=<uint32_t>

默认值0x10

此选项会限制要初始化的 CPU 数量。它不能大于特定架构的 SMP_MAX_CPUS

kernel.riscv64.enable-asid=<bool>

默认值true

这样便可使用 ASID。如果底层硬件支持 16 位 ASID,则默认为 true。

kernel.riscv64.phys.mmu=<bool>

默认值true

这样便可以在内核的早期启动阶段使用 MMU。

仅适用于 x86 计算机的选项

kernel.x86.disable_spec_mitigations=<bool>

默认值false

如果设置,则会停用所有推测性执行信息泄露缓解措施。

如果未设置,系统将使用每种缓解措施的默认值。

kernel.x86.hwp=<bool>

默认值true

此设置会在受支持的芯片上启用 HWP(硬件 P 状态)。借助此功能,Intel CPU 可以自动调整自己的时钟速度。

kernel.x86.hwp_policy=[bios-specified | performance | balanced | power-save | stable-performance]

默认值bios-specified

设置 CPU 的电源/性能权衡政策。支持 HWP(硬件 P 状态)的 x86 CPU 可以配置为自主扩缩频率,以便采用不同的政策。

目前支持的政策如下:

  • bios-specified:使用固件/BIOS 设置中指定的电源/性能权衡政策。如果没有可用的政策,则回退到 balanced
  • performance:尽可能提升效果。
  • balanced:平衡性能 / 节电。
  • power-save:降低功耗,但会降低性能。
  • stable-performance:使用可保持系统性能一致的设置。这对于基准测试可能很有用,例如,在基准测试中,保持可预测的性能比最大限度提高性能更重要。

kernel.x86.md_clear_on_user_return=<bool>

默认值true

MDS(微架构数据抽样)是一类推测性执行信息泄露 bug,允许恶意代码推断近期加载或存储的内容,而无需考虑特权级别 (CVE-2019-11091、CVE-2018-12126、CVE-2018-12130、CVE-2018-12127)。例如,这可以允许用户代码读取近期的内核加载/存储。

为避免此 bug,必须在信任级别转换时刷新所有可能泄露数据的微架构结构。此外,请务必确保信任级别不会在单个物理处理器核心上并发执行。

此选项用于控制是否将微架构结构从内核刷新到用户退出路径(如果可能)。这可能会对性能产生负面影响。

  • 如果设置为 true(默认值),则当处理器易受攻击时,系统会刷新结构。
  • 如果设为 false,系统不会对结构执行任何刷新操作。

kernel.x86.spec_store_bypass_disable=<bool>

默认值false

Spec-store-bypass (Spectre V4) 是一种推测性执行信息泄露漏洞,会影响许多 Intel 和 AMD x86 CPU。它以内存解析硬件为目标,以推断近期存储内容。此攻击仅会影响同一特权级别的进程内数据。

此命令行选项用于控制是否启用缓解措施。缓解措施会对性能产生负面影响。

  • 如果为 true,则在需要时在 CPU 上启用缓解措施。
  • 如果为 false(默认值),则表示未启用缓解措施。

kernel.x86.turbo=<bool>

默认值true

Turbo Boost 或核心性能提升机制可让处理器根据可用的热和电源预算,在运行时动态调整其性能。这可能会提高互动性能,但代价是性能波动。停用 Turbo 可能对某些工作负载有益;如果此命令行标志设置为 false,系统中的所有 CPU 都会停用 Turbo。

kernel.x86.enable_pcid=<bool>

默认值true

此选项用于控制是否使用 PCID(如果有足够的 CPU 支持)。如果此选项处于启用状态,但 CPU 支持不足,则此选项无效。

kernel.smp.maxcpus=<uint32_t>

默认值0x20

此选项会限制要初始化的 CPU 数量。它不能大于特定架构的 SMP_MAX_CPUS

kernel.wallclock=[auto | tsc | pit | hpet]

默认值auto

此选项可用于在 PC build 上强制选择特定挂钟。