Zircon 内核命令行选项

所有机器通用的选项

aslr.disable=<bool>

默认值false

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

aslr.entropy_bits=<uint8_t>

默认值0x1e

对于使用 ASLR 的地址空间,此标志用于控制随机化中的熵位数。熵越高,地址空间就越稀疏,用于页表的内存也就越多。有效值的范围为 0-36。

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

默认值false

如果启用此功能,并且硬件 RNG 在重新播种时失败,则 CPRNG 会发生内核恐慌。

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

默认值false

如果启用,并且 jitterentropy 在重新播种时失败,则 CPRNG 会发生内核恐慌。

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

默认值false

如果已启用,并且硬件 RNG 在初始种子设定时失败,则 CPRNG 会发生内核恐慌。

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 会出现内核恐慌。

kernel.entropy-mixin=<十六进制>

提供要混合到内核 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 设置“内存循环”形参。当 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 在指定关键部分中停留的时间超过此阈值时,系统会发出内核 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 的最后一次检测信号的最大年龄(以秒为单位),超过此年龄则认为辅助 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 位以回收内存的作业。

如果设置为 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 位地址空间,偏移量 >= 4GiB)中。

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.eviction-delay-ms=<uint64_t>

默认值0x1388

此选项用于指定在内存压力状态发生变化而需要逐出时,内核延迟逐出的时长(以毫秒为单位)。这种延迟可让响应内存压力的用户空间组件先回收内存,从而避免因与内核逐出发生干扰而导致抖动。

kernel.oom.evict-with-min-target=<bool>

默认值true

此选项用于指定内核是否应在尝试达到目标空闲内存的同时,也驱逐最少量的内存。如果用户空间也释放内存以应对内存压力,则通过让内核逐出分担负载,可以确保一定的公平性。

kernel.oom.eviction-delta-at-oom-mb=<uint64_t>

默认值0xa

此选项用于指定内核将尝试同步逐出内存以避免进入内存不足状态的粒度(以 MB 为单位)。请注意,此值独立于 kernel.oom.evict-with-min-target,两者互不影响。

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 时,系统会发出内存不足的信号。

将此值设置为 0 将停用即将内存不足事件。

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

默认值true

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

kernel.phys.next=<string>

默认值physboot

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

kernel.phys.verbose=<bool>

默认值true

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

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

kernel.phys.backtrace-max=<uint32_t>

默认值0x40

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

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

默认值0x400

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

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,则在发生内核崩溃时,系统会将尽可能多的近期内核调试日志附加到生成的崩溃日志中,以帮助进行调试。

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

默认值来自 ZBI 商品

此属性用于控制所使用的串行端口。内核调试串行端口是预留资源,不得在内核之外使用。

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

如果未明确设置此选项,则会从类型为 ZBI_TYPE_KERNEL_DRIVER 且具有 ZBI_KERNEL_DRIVER_*_UART 子类型之一的最后一个 ZBI 项(原始 ZBI 中提供的或由引导加载程序 [或引导 shim] 附加的)派生出等效值。显式启动选项始终会替换 ZBI 项,即使是 none 也是如此。(ZBI_TYPE_CMDLINE 项相对于 ZBI_TYPE_KERNEL_DRIVER 项的顺序无关紧要。)

配置字符串格式如下: * 对于 MMIO UART: - kernel.serial=UART_MODEL,MMIO_ADDR,IRQ,FLAGS * 对于 PIO UART: - kernel.serial=UART_MODEL,IOPORT,IRQ * 对于此架构上常见 QEMU 虚拟机中使用的默认设置: - qemu * 对于 x86 上的传统 COM1 设置: - legacy

kernel.vdso.always_use_next=<bool>

默认值false

如果设置了此选项,内核将为用户空间提供“下一个”vDSO,而不是“稳定”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.userpager.overtime_printout_limit=<uint32_t>

默认值0x4

此选项用于配置在报告超时情况时要向调试日志发出的未完成请求的最大数量。如果存在大量未完成的请求,那么所有请求的详细信息可能都没有用,并且可能会使调试日志过载。

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 之前强制将内核中的打印内容发送到控制台。编译开关设置会覆盖命令行参数(如果两者都存在)。请注意,编译开关和命令行参数都会产生停用由 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_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

如果值为 falsezx_debug_read()zx_debug_write() 都会失败并显示 ZX_ERR_NOT_SUPPORTED

output-only 时,zx_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 时停止”,请传递内核命令行实参 kernel.halt-on-panic=true

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

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

请将 last-panic.txtzircon.elf 文件附加到您提交的任何内核 panic bug 中。

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

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

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 设备上消耗 5% 的 CPU。各个配置可能需要根据需要将此值调高(或调低)。

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 | slot]

默认值none

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

此选项用于选择要用于存储已压缩数据的所需存储策略。如果设置了 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 - 检测到损坏时,系统会发出非严重内核 OOPS。 * panic - 检测到损坏时,会发生严重的内核崩溃。

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

默认值false

此标志用于控制是否启用 PMM 的释放后使用检查器。 PMM 检查器可能非常耗费资源,因此仅适用于调试和开发 build。值必须为以下项之一: * true - 检查器始终处于启用状态。 * false - 检查器从不启用。 * auto - 内核会根据环境及其性能特征决定是否启用检查器。在 Hypervisor 下运行是考虑的因素之一。 另请参阅“k pmm checker”。

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.stack.canary-percent-free=<uint64_t>

默认值0x0

此属性用于控制在内核堆栈上放置 Canary 的偏移量。如果 Canary 损坏,则表示堆栈在使用期间至少达到了该深度,这可用作堆栈使用量接近限制的预警。偏移量使用百分比定义,以应对内核堆栈大小的可变性。例如,值为 0 会将 Canary 放置在堆栈的末尾,这意味着它会在堆栈溢出时同时损坏。

Canary 检测在堆栈释放(即线程终止)时执行,如果 Canary 损坏,则会生成内核 OOPS。

kernel.portobserver.reserve-pages=<uint64_t>

默认值0x8

指定每个 CPU 要预留的页面数量,以用于端口观察器(异步等待)分配。当系统处于负载状态时,较高的值会减少对 PMM 的争用,但当系统处于空闲状态时,会消耗更多内存。

kernel.portpacket.reserve-pages=<uint64_t>

默认值0x1

指定每个 CPU 要预留的内存页数,以用于端口数据包 (port_queue) 分配。当系统处于负载状态时,较高的值会减少对 PMM 的争用,但当系统处于空闲状态时,会消耗更多内存。

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

默认值reboot

此选项用于指定当根作业被终止或没有作业和进程时,内核应采取的操作。

当值为 halt 时,将停止系统。

当值为 reboot 时,将重新启动系统。

如果值为 bootloader,则将系统重新启动到引导加载程序。

当值为 recovery 时,会将系统重启到 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.select.userboot=<string>

默认值userboot

要在内核创建的第一个(也是唯一一个)用户进程中运行的程序:由 kernel.select 选择的软件包中的 ELF 静态 PIE 文件。第一个用户进程启动时会获得一个渠道句柄,通过该渠道,它会收到一条包含初始句柄的消息,这些初始句柄持有初始进程本身和系统的所有特权和基本功能。

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

默认值false

在搜索放置任务的 CPU 时,优先选择小核心,而不是大核心。启用此选项会牺牲性能来换取更低的功耗。

已弃用 - 此选项计划在即将发布的版本中移除。不要对其产生任何严重依赖。

kernel.scheduler.enable-new-wakeup-accounting=<bool>

默认值false

此选项会停用对之前调度行为的模拟,该行为会降低新唤醒的线程抢占当前正在运行的线程的可能性。虽然之前的行为对新唤醒的线程不如改进后的行为公平,但模拟之前的行为可降低某些类型的潜在竞态条件导致系统出现问题的可能性。在所有产品上完全采用改进的唤醒行为之前,需要先修复这些竞态条件。

TODO(https://fxbug.dev/322207536):在解决堆栈中更高级别的竞态条件后,停止在解除阻塞时重置开始时间和结束时间。

kernel.ubsan.action=[oops | panic]

默认值panic

如果内核已通过 UndefinedBehaviorSanitizer 进行检测,则检测到的问题会在串行控制台上报告。这些错误可能是致命的,也可能不是。 值必须为以下项之一: * oops - 检测到的未定义行为会导致非致命的内核 OOPS。 * 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>

如果已设置,则尝试在特定芯片上系统的硬编码地址处初始化 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 都会执行 auto 为每个 CPU 选择的操作,前提是固件表示该 CPU 应该使用该函数。这还会停用与 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 上始终使用具有 SMCCC 1.1 调用约定的 PSCI_VERSION。如果固件不支持 SMCCC 1.1,则可能会产生不可预测的影响。目前,auto 永远不会为任何 CPU 选择此行为。 * smccc10 - 在每个 CPU 上,始终使用具有 SMCCC 1.0 调用约定的 PSCI_VERSION。此选项在所有系统上都是安全的,但与 SMCCC 1.1 选项相比,开销更大,并且可能并非所有 CPU 都需要此选项。目前,auto永远不会为任何 CPU 选择此行为。 与具有异构核心的 SoC 一样,应为每个 CPU 选择不同的值,除 auto 以外的值仅应在测试中使用。

kernel.arm64.force-pct=<bool>

默认值false

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

kernel.arm64.pci=<bool>

默认值true

启用内核模式 PCI 支持和内核 PCI 系统调用。

仅在 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 或 Core Performance Boost 是一种机制,可让处理器在运行时根据可用的散热和电力预算动态调整其性能。这可能会提高互动性能,但会牺牲性能稳定性。某些工作负载可能会受益于停用 Turbo;如果此命令行标志设置为 false,则系统中的所有 CPU 都会停用 Turbo。

kernel.x86.enable_pcid=<bool>

默认值true

此选项用于控制在 CPU 支持足够的情况下是否使用 PCID。 如果启用此选项,但 CPU 支持不足,则此选项不会生效。

kernel.smp.maxcpus=<uint32_t>

默认值0x20

此选项可限制要初始化的 CPU 数量。对于特定架构,该值不得大于 SMP_MAX_CPUS

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

默认值auto

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