Zircon 内核命令行选项

所有机器通用的选项

aslr.disable=<bool>

默认值: false

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

aslr.entropy_bits=<uint8_t>

默认值: 0x1e

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

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

默认值: false

启用后,如果 HW RNG 无法重新播种,CPRNG 会发生 panic。

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

默认值: false

启用后,如果 jitterentropy 无法重新播种,CPRNG 会发生 panic。

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

默认值: false

如果启用此功能,并且 HW RNG 在初始种子设定时失败,CPRNG 会发生 panic。

kernel.cprng-disable.jitterentropy=<bool>

默认值: false

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

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

默认值: false

确定是否将硬件随机数生成器用作熵源(用于测试)

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

默认值: false

如果启用,并且 jitterentropy 无法进行初始播种,则 CPRNG 会发生 panic。

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

默认值: false

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

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

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

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

kernel.jitterentropy.bs=<uint32_t>

默认值: 0x40

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

通常不应使用这些默认值,而需要根据 go/fuchsia-per-device:jitter 专门针对每个 CPU 进行调整。

kernel.jitterentropy.bc=<uint32_t>

默认值: 0x200

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

这些默认值一般不应使用,需要根据 go/fuchsia-per-device:jitter 针对每个 CPU 进行专门调整。

kernel.jitterentropy.ml=<uint32_t>

默认值: 0x20

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

这些默认值一般不应使用,需要根据 go/fuchsia-per-device:jitter 针对每个 CPU 进行专门调整。

kernel.jitterentropy.ll=<uint32_t>

默认值: 0x1

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

这些默认值一般不应使用,需要根据 go/fuchsia-per-device:jitter 针对每个 CPU 进行专门调整。

kernel.jitterentropy.raw=<bool>

默认值: true

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

kernel.jitterentropy.entropy_per_1000_bytes=<uint32_t>

默认值: 0x32

为 jitterentropy 设置“每 1000 字节的熵”参数。此值用于估计收集器每输出 1,000 字节的数据所收集的熵位数。

使用默认参数(bs=64、bc=512、ml=32、ll=1、raw=true)时,每个字节的数据在 astro 上贡献大约 0.5 位的熵。安全系数为 0.1 时,1000 字节的数据可提供 0.5 * 0.1 * 1000 = 50 位的熵。

这些默认值一般不应使用,需要根据 go/fuchsia-per-device:jitter 针对每个 CPU 进行专门调整。

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) 情况时的行为。有效值为 jobkill 和 reboot。

如果设置为 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-mb、kernel.oom.critical-mb、kernel.oom.warning-mb 和 zx_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-mb、kernel.oom.critical-mb 和 kernel.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_monotonic 和 zx_clock_get_boot vDSO 调用将被强制为真正的系统调用,而不仅仅是在用户模式下执行 tick 计数器的转换。

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.enable-virtual=<bool>

默认值: false

如果设置为 true,则允许使用虚拟管理的内核堆,而不是直接从 physmap 管理的内核堆。虚拟堆可能会产生一些性能和内存用量开销,但不会因碎片化而耗尽。

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_ID 的 zx_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_INVALIDATE 的 zx_vmo_op_range()

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

默认值: false

如果值为 false,则 zx_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。

如果内核在用户模式暂停内核对调试串行端口的访问时发生内核崩溃(请参阅 zx_debug_suspend),则此选项会被忽略(即系统将重新启动),因为崩溃 shell 将无法访问。

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

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

请在您提交的所有内核崩溃 bug 中附上 last-panic.txt 和 vmzircon 文件。

如果存在 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-ms 和 kernel.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 的 use-after-free 检查器。 PMM 检查器可能非常耗费资源,因此仅适用于调试和开发 build。值必须为以下项之一: * true - 检查器始终处于启用状态。 * false - 检查工具永远不会启用。 * auto - 内核会根据环境及其性能特征决定是否启用检查器。在 Hypervisor 下运行是考虑的因素之一。 另请参阅“k pmm checker”。

kernel.pmm-checker.fill-size=[auto | <uint64>]

默认值: auto

此选项指定在启用 PMM 的释放后使用检查器时,每个空闲页面要填充或检查的字节数。有效值为 8 的倍数,介于 8 和 PAGE_SIZE 之间(含边界值)。默认的“auto”值表示 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=<stdbind::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 - 检测到未定义的行为会导致严重的内核崩溃。

kernel.debug.boot-spin=<bool>

默认值: false

注意:此功能仅用于内核调试,在生产内核 build 中不可用。在没有断言和其他调试功能的已编译内核中,此选项将不起作用。

设置后,内核本身中的一些首批代码(在 physboot 移交后)将只要某个全局变量为零就会旋转。必须从附加到内核的调试器(例如通过 QEMU 的 -s)设置变量,才能继续启动。这样一来,您就可以轻松地让虚拟启动 CPU 在附加调试程序的情况下运行启动加载程序和前期启动代码,然后在调试程序中以交互方式中断自旋,以设置断点或逐步执行启动代码。

kernel.allow_debug_uart_suspend=<bool>

默认值: false

此选项可启用以下功能:在进入更深层次的挂起状态时,管理 UART 硬件及其时钟的挂起和恢复,前提是硬件需要内核的帮助才能挂起和恢复调试 UART。默认情况下,此功能处于停用状态,但如果硬件需要此行为,并且此功能足够稳定,可以在 build 配置中启用。

仅适用于 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

此选项决定了前期启动内核在需要发生 panic 和崩溃时将使用哪种 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 选择的操作(如果固件支持该函数)。这也会停用与 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,但虚拟计时器硬件没有,则只会选择物理计数器 (PCT)。设置 force-pct 选项后,内核将始终选择使用 PCT 作为时间参考,即使 ZBI 中提供了 VCT IRQ 也是如此。请注意,在未定义 PCT IRQ 的目标上设置 force-pct 会导致在前期启动期间发生 panic。

kernel.arm64.pci=<bool>

默认值: true

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

kernel.arm64.smccc-qcom=<bool>

默认值: false

启用符合 QCOM 协议的内核辅助 Yielding SMCCC 调用。

内核将自动代表调用方恢复被抢占的 SMCCC 产生调用。

kernel.arm-smmu-mode=<string>

默认值: disabled

此选项决定了内核如何处理在启动时通过 ZBI 参数告知它的 SMMU 实例。该格式是一个逗号分隔列表,以默认模式开头,后跟零个或多个 <base-address>=<mode> 段,这些段可用于替换特定 SMMU 实例的默认模式,具体由 SMMU 寄存器的基本物理地址标识。有三个有效值可用于模式: * disabled - 忽略 SMMU 硬件。 其寄存器区域未预留(允许用户模式声明寄存器),并且 SMMU 硬件的状态与通过引导加载程序链移交给 Zircon 时的状态相同。创建 ZX_IOMMU_TYPE_ARM_SMMU 类型的 IOMMU 实例的请求将替换为 StubIommu 实例。泄露的 PMT 页面将照常隔离。 * passthru - SMMU 硬件已声明,并且寄存器区域已预留。 用户模式将无法访问此硬件。BTI 必须提供有效的流标识符,并用于配置允许对关联流 ID 的所有内存执行所有操作的上下文。 系统不会执行/强制执行地址转换和每页权限。 在 BTI 的上下文被锁定并拒绝访问后,泄露的 PMT 页面将返回到主页面池。当隔离状态解除时,BTI 的透传模式会恢复。 * enforced - 声明 SMMU 硬件并预留寄存器区域。用户模式将无法访问此硬件。BTI 必须提供有效的流标识符,这些标识符将用于为该 BTI 配置独立的设备地址空间。系统将进行地址转换,并强制执行固定内存的每页权限。在移除固定内存的 PTE 后,泄露的 PMT 页面将返回到主页面池,并在此过程中撤消对这些页面的硬件访问权限。

仅在 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(微架构数据采样)是一系列推测执行信息泄露漏洞,无论权限级别如何,恶意代码都可以通过这些漏洞推断最近加载或存储的内容(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;如果此命令行 flag 设置为 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 上选择特定挂钟。