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 会发生紧急警报。

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

默认值false

启用后,如果抖动在重新种子时失败,CPRNG 会发出警报。

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

默认值false

启用后,如果 HW RNG 在初始播种时失败,CPRNG 会发生 panic。

kernel.cprng-disable.jitterentropy=<bool>

默认值false

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

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

默认值false

确定 HW RNG 是否用作熵源(用于测试)

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

默认值false

启用后,如果抖动熵在初始种子设定失败时失败,CPRNG 会紧急运行。

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

默认值false

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

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

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

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

core.jitterentropy.bs=<uint32_t>

默认值0x40

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

core.jitterentropy.bc=<uint32_t>

默认值0x200

设置抖动熵的“内存块计数”参数。当抖动在执行内存操作时(为了增加 CPU 时间的变化),可以控制访问多少个块(大小为 kernel.jitterentropy.bs)。

core.jitterentropy.ml=<uint32_t>

默认值0x20

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

core.jitterentropy.ll=<uint32_t>

默认值0x1

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

kernel.jitterentropy.raw=<bool>

默认值true

如果为 true,抖动熵熵收集器将返回未处理的原始样本。如果为 false,原始样本将由抖动熵进行处理,生成的输出数据看起来更接近均匀随机。请注意,即使设置为 false,CPRNG 仍会重新处理样本,因此抖动熵内部的处理在某种程度上是多余的。

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

默认值0xbb8

当 CPU 在指定关键区保留的时长超过此阈值时,将发出 KERNEL OOPS。

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

如果为 0,则停用关键部分锁定检测。

当 core.lockup-detector.heartbeat-period-ms 为 0 时,会停用关键区锁检测。

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

默认值0x2710

当 CPU 在指定关键区保留的时长超过此阈值时,系统会生成崩溃日志,系统将重新启动,按照原样显示重启原因为 SOFTWARE_WATCHDOG

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

如果为 0,系统会停用关键部分崩溃日志生成和重新启动功能。

当 core.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 在被视为被锁定之前的最后一次检测信号的最长存在时间,会触发崩溃日志的生成,该日志会指示重启原因为 SOFTWARE_WATCHDOG,随后重新启动。

另请参阅锁定检测器

如果为 0,系统会停用检测信号崩溃日志生成和重新启动功能。

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

默认值0x64

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

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

core.oom.behavior=[重新启动 | 作业终止]

默认值reboot

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

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

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

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,此选项会使 PCI 设备在调用 mexec 时保持运行状态。

kernel.oom.enable=<bool>

默认值true

此选项会开启内存不足 (OOM) 内核线程,当 PMM 的可用内存少于 kernel.oom.outofmemory-mb 时,该线程会终止进程或重新启动系统(根据 kernel.oom.behavior)。

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

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

可以使用 k pmm mem_avail_state info 命令查询当前内存可用性状态。

core.oom.outofmemory-mb=<uint64_t>

默认值0x32

此选项可指定可用内存阈值,在达到该阈值时,内存不足 (OOM) 线程将会触发内存不足事件,并开始终止进程或重新启动系统。

core.oom.clinic-mb=<uint64_t>

默认值0x96

此选项可指定可用内存阈值,内存不足 (OOM) 线程将在该阈值上触发关键内存压力事件,表明进程应释放内存。

core.oom.warning-mb=<uint64_t>

默认值0x12c

此选项可指定可用内存阈值,内存不足 (OOM) 线程将在该阈值上触发警告内存压力事件,指示进程应减慢内存分配速度。

core.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),相应状态才能从“严重”更改为“警告”。

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

默认值false

除了默认行为(即在“严重”和“OOM”状态下进行逐出)之外,此选项还会逐出处于“警告”压力状态的文件页面。

kernel.oom.evict-continuous=<bool>

默认值false

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

core.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 响应。

core.phys.next=<字符串>

默认值physboot

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

kernel.phys.verbose=<bool>

默认值true

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

此选项的一个用途是进行基准测试:与 physboot 中花费的整个时间相比,同步、单线程 UART 写入的成本可能相对较高(10 个字符/毫秒),因此最好将此类工作从整体时间测量中排除。

core.phys.backtrace-max=<uint32_t>

默认值0x40

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

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

默认值0x400

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

core.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(无论这些页面是否已借用)。

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

默认值false

此政策用于控制当非借出的页面被移动到 MRU 队列时,是否将非出借页面替换为已出借页面(如果有任何借出页面可用)。正常情况下,这种移动是延迟完成的,但在逐出的过程中,在接近 OOM 时,本应位于 MRU 队列的所有页面都会移至 MRU 队列。

core.ppb.loan=<bool>

默认值false

此政策用于控制是否为连续 VMO 启用 ZX_VMO_OP_DECOMMIT。如果为 true,则对连续 VMO 停用提交可以起作用并返回 ZX_OK。这些页面会被借给系统的其余页面以供借用。如果为 false,则取消提交将返回 ZX_ERR_NOT_SUPPORTED。

core.ppb.Replace-on-unloan=<bool>

默认值false

这可控制当借出的页面重新提交到其原始连续 VMO 时会发生什么。如果为 false,网页将从被借出的位置被逐出,要求相应内容故障恢复。如果为 true,则内容会被复制到新页面中,并且换入这个新页面以替换出借的网页。

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

默认值false

如果设置为 true,系统会在内核崩溃期间将尽可能多的最新内核调试日志附加到生成的崩溃日志,以帮助进行调试。

core.serial=[none | 旧版 | qemu | <type>,<base>,<irq>]

默认值none

这可控制所使用的串行端口。如果提供,它将替换系统启动数据所描述的串行端口。内核调试串行端口是预留资源,不得在内核外部使用。

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

core.vdso.always_use_next=<bool>

默认值false

如果设置了此选项,内核将为用户空间提供“下一个”vDSO,而不是“稳定”的 vDSO 作为默认 vDSO。

vdso.ticks_get_force_syscall=<bool>

默认值false

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

vdso.clock_get_monotonic_force_syscall=<bool>

默认值false

如果已设置此选项,zx_clock_get_monotonic 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.heap-max-size-mb=<uint64_t>

默认值0x800

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

kernel.heap.alloc_fill_threshold=<uint64_t>

默认值0x0

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

core.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()

core.enable-serial-syscalls=[false | true | 仅限输出]

默认值false

设置为 false 时,zx_debug_read()zx_debug_write() 都将失败,并显示 ZX_ERR_NOT_SUPPORTED

如果设置为 output-onlyzx_debug_read() 将失败并显示 ZX_ERR_NOT_SUPPORTED,但 zx_debug_write() 可正常运行。

true 时,两者都将正常运行。

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

默认值hw_rng

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

core.entropy-test.len=<uint64_t>

默认值0x100000

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

通过将 ENTROPY_COLLECTOR_TEST_MAXLEN 定义为此值,可增加最大值。

core.force-watchdog-disabled=<bool>

默认值false

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

core.halt-on-panic=<bool>

默认值false

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

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

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

请将您的 last-panic.txtzircon.elf 文件附加到您提交的所有内核崩溃 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

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

例如,选择足够低的值将允许用户模拟具有小于实际内存的物理内存的系统。

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

默认值true

设置后,网页扫描器会逐出用户分页器支持的网页。逐出可以减少内存用量并防止出现内存不足的情况,但会从系统行为中移除一些时间可预测性。

kernel.page-scanner.discardable-evictions-percent=<uint32_t>

默认值0x14

应该从可舍弃的 VMO(而不是由分页器支持的 VMO)满足的页面逐出百分比。例如,如果此值设置为 X 并且内核需要回收 N 页面以缓解内存压力,它将从可舍弃的 VMO 中逐出 (N * X / 100) 页面,并从分页器支持的 VMO 中逐出其余的 (N * (100 - X) / 100) 页面。

请注意,内核会尽可能遵循可舍弃页面和由分页器支持的页面逐出之间的这种比率,但实际数字可能并不准确。

core.page-scanner.page-table-eviction-policy=[始终 | 永不 | on_request]

默认值always

针对未被访问的用户页面表设置回收政策。

如果为 on_request,则仅在收到请求时执行逐出,例如响应内存不足的情况。

如果设置为 never,则永远不会逐出页面表。

如果设置为 always,系统会定期逐出未使用的页表。此时间段可以通过 kernel.page-scanner.page-table-eviction-period 控制。

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

默认值0xa

设置页面表格的扫描速率(以秒为单位)。在两次连续扫描之间未使用的页面表都可能被逐出。

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

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

默认值0x2

设置连续老化事件之间的最短时间(以秒为单位)。此处的值越高,活跃集的稳定性越高,发生抖动(例如行为)的可能性越小,收集页面访问信息所需的时间也越短。值越小,活跃集越小,逐出的机会就越大。

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

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

默认值0xf

设置连续老化事件之间的最长时间(以秒为单位)。这段时间可能是页面存在时间信息的粗略程度最糟糕的情况,如果系统行为快速变化,则较高的值可能会导致没有足够的年龄信息来执行逐出操作。值越小,页面在最早的分桶中累积会丢失保真度信息,这会增加在逐出发生时选择次优页面的几率。

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

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

默认值0x3

设置收集页面访问信息之间的时间间隔(以秒为单位)。值越小,年龄保真度越高,但页面回收选择的准确性也会更高,但代价是收集占用的 CPU 时间会增加。

将其设置为低于 kernel.page-scanner.min-aging-interval 没有好处。

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-intervalkernel.page-scanner.max-aging-interval 之间的时段内触发老化,因此,如果间隔相等,则不会产生任何影响。

kernel.page-scanner.eviction-interval-seconds=<uint32_t>

默认值0xa

此选项可指定每隔一段时间(以秒为单位),即可在后台执行内核逐出来尝试避免系统出现内存压力的情况。只有在使用 kernel.oom.evict-continuous 启用持续逐出的情况下,此操作才会生效。如果此值小于页面队列轮替 / 老化间隔(默认为 10 秒),系统会忽略该值,并将逐出间隔设置为等于页面队列轮替间隔。

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

默认值true

此选项会使内核活动内存扫描程序在启动时首次启用。您也可以使用内核控制台启用和停用它。如果停用该扫描程序,您可以获得额外的系统可预测性,因为它消除了基于时间和后台内存逐出的现象。

扫描器执行的每项操作都可以单独配置和停用。如果所有操作均已停用,则启用扫描程序将不起作用。

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

默认值0x4e20

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

将值设为 0 意味着不进行零页扫描。这可以为基准化分析或其他工作负载提供额外的系统可预测性。

要让此选项生效,网页扫描器必须正在运行。可以在启动时使用 kernel.page-scanner.start-at-boot 选项启用它。

该值被选为在最坏的情况下,在低端设备上消耗 5% 的 CPU。各个配置可能希望根据需要调高(或更低)此数值。

core.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

启用一个测试选项,使虚拟机随机立即压缩页面,无论页面存在时间如何。这有助于测试压缩路径,而无需等待页面老化以及使系统进入低内存状态。如果未在启用调试断言的情况下构建内核,或者未设置压缩和存储策略,则启用此选项会出错。

core.compression.strategy=[none | lz4]

默认值none

支持的压缩策略如下: - none - lz4

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

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

默认值none

支持的压缩存储策略如下: - none - tri_page

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

core.compression.threshold=<uint32_t>

默认值0x46

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

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

有效值介于 1 到 100 之间(包括 1 和 100)。

core.compression.lz4.acceleration=<uint32_t>

默认值0xb

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

core.compression.at_memory_pressure=<bool>

默认值false

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

如需让此选项产生任何效果,需要启用 kernel.page-scanner.enable-eviction,并同时设置 kernel.compression.strategy 和 kernel.compression.storage-strategy。

core.compression.reclaim_anonymous=<bool>

默认值false

此选项可控制匿名页面是否被置于可回收页面队列中并具有关联的存在时间信息。启用此功能会增加匿名页面的年龄跟踪开销,但为了使“kernel.compression.at_memory_pressure”等选项有效,则必须启用此功能。

core.compression.reclaim_zero_forks=<bool>

默认值false

此选项与“kernel.compression.reclaim_anonymous”类似,但适用于匿名页面的零分支。启用此设置会使“kernel.page-scanner.zero-page-scans-per-second”选项不起作用,在不启用“kernel.compression.reclaim_anonymous”的情况下启用此功能会导致出错。

core.pmm-checker.action=<字符串>

默认值oops

支持的操作: - oops - panic

此选项指定当 PMM 检查工具检测到损坏时要执行的操作。

如果设为 oops,则会在检测到损坏时发出非严重内核 OOPS。

如果设为 panic,检测到损坏时就会发生严重内核崩溃。

kernel.pmm-checker.enable=<bool>

默认值false

这用于控制是否启用 PMM 的“释放后使用”检查工具。 PMM 检查工具可能成本高昂,并且适用于调试 build 和开发 build。另请参阅“k pmm 检查工具”。

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

默认值0x1000

此选项指定在启用 PMM 的“释放后使用”检查工具后,可填充或检查的每个免费页面的字节数。有效值是 8 和 PAGE_SIZE 之间的 8 的倍数(含 8 和 PAGE_SIZE)。

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

默认值false

启用一个测试选项,无论当前内存级别如何,该测试选项都会导致使用 ZX_ERR_SHOULD_WAIT 的可等待页面分配随机失败。这有助于测试等待路径,而无需将系统置于低内存状态。如果在构建内核时未启用调试断言,则启用此选项会出错。

core.portobserver.reserve-pages=<uint64_t>

默认值0x8

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

core.portpacket.reserve-pages=<uint64_t>

默认值0x1

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

core.root-job.behavior=[halt | 重新启动 | 引导加载程序 | 恢复 | 关闭]

默认值reboot

此选项指定当根作业被终止或者没有作业和进程时,内核应执行的操作。

如果设为 halt,系统将停止运行。

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

如果设为 bootloader,系统会重新启动系统以进入引导加载程序。

recovery 时,将重新启动系统以进入 recovery 分区。

设为 shutdown 时,系统会关闭系统。

kernel.root-job.notice=<string>

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

kernel.shell=<bool>

默认值false

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

core.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。

core.port.max-observers=<uint64_t>

默认值0xc350

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

core.experimental.serial_migration=<bool>

默认值false

TODO(https://fxbug.dev/42170495)

用于协助串行驱动程序从内核实现迁移到 ulib/uart 实现的临时标记。

core.select=<string>

默认值zircon

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

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

默认值false

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

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

选项仅在 arm64 机器上可用

core.arm64.disable_spec_mitigations=<bool>

默认值false

如果此政策已设置,系统会停用所有推测执行信息泄露缓解措施。

如果此政策未设置,系统将使用许可默认值。

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

默认值true

启用后,每个 ARM CPU 都会启用一个事件流生成器,该生成器会以特定速率设置隐藏事件标志。这样做会将 CPU 从可能所在的 WFE 状态踢出。

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

默认值0x2710

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

core.arm64.debug.dap-rom-soc=<字符串>

如果设置了此字段,则会尝试在特定系统芯片的某个硬编码地址中初始化 DAP 调试孔。目前接受的值包括 amlogic-t931g、amlogic-s905d2、amlogic-s905d3g 和 amlogic-a311d。

core.smp.maxcpus=<uint32_t>

默认值0x10

此选项会限制要初始化的 CPU 数量。对于特定架构,此值不能超过 SMP_MAX_CPUS

core.phys.psci-reset=[disabled | 关闭 | 重新启动 | 重新启动-bootloader | 重新启动-recovery]

默认值reboot

此选项用于确定在前期启动内核需要 panic 和崩溃时将使用哪种类型的 PSCI 重置操作(如果有)。如果为“已停用”,机器可能会在 panic 时进入无限循环。

core.arm64.phys.mmu=<bool>

默认值true

这样一来,就可以在内核的前期启动阶段使用 MMU 和缓存。

core.arm64.enable-asid=<bool>

默认值true

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

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

默认值auto

这会选择备用异常矢量实现,用于解决从 EL0 进入 EL1 时出现的特定于 CPU 的问题。值可以是: * none - 在早期 EL0 异常路径中不执行任何缓解措施。 * auto(默认)- 根据固件通过 SMCCC / PSCI 接口报告的可用性选择 SMCCC 函数标识符。然后,每个单独的 CPU 都会查询固件,确定是否需要解决方案。如果固件不是报告其支持 SMCCC_ARCH_WORKAROUND_3 和/或 SMCCC_ARCH_WORKAROUND_1 函数标识符的 SMCCC(>= 1.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 上始终使用 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 以外的值只能在测试中使用。

仅适用于 riscv64 机器的选项

core.smp.maxcpus=<uint32_t>

默认值0x10

此选项会限制要初始化的 CPU 数量。对于特定架构,此值不能超过 SMP_MAX_CPUS

core.riscv64.enable-asid=<bool>

默认值true

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

仅适用于 x86 机器的选项

core.x86.disable_spec_mitigations=<bool>

默认值false

如果此政策已设置,系统会停用所有推测执行信息泄露缓解措施。

如果此政策未设置,系统将使用许可默认值。

core.x86.hwp=<bool>

默认值true

此设置会在支持的芯片上启用 HWP(硬件 P 状态)。此功能可让 Intel CPU 自动扩缩自己的时钟速度。

core.x86.hwp_policy=[bios-specified | 性能 | 平衡 | 省电 | 稳定性能]

默认值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-12138、CVE-2127),该 bug 都允许恶意代码推断近期加载或存储的内容。例如,这可能会允许用户代码读取最近的内核加载/存储。

为了避免此 bug,必须在信任级别转换时清空所有可能泄露数据的微架构结构。此外,信任级别不能并发在单个物理处理器核心上执行,这一点非常重要。

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

  • 如果设置为 true(默认值),则在处理器存在漏洞时系统会刷新结构。
  • 如果设置为 false,则不会对结构执行刷新。

kernel.x86.spec_store_bypass_disable=<bool>

默认值false

Spectre-bypass (Spectre V4) 是一种推测性执行信息泄露漏洞,会影响许多 Intel 和 AMD x86 CPU。它以内存消除歧义硬件为目标,来推断最近存储的内容。攻击只会影响相同特权级别的进程内数据。

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

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

core.x86.turbo=<bool>

默认值true

Turbo Boost 或 Core Performance Boost 机制允许处理器根据可用的散热和电气预算动态地在运行时改变其性能。这有助于提高交互性能,但代价是性能波动。某些工作负载可能会因停用 Turbo 而受益;如果此命令行标志设置为 false,则会为系统中的所有 CPU 停用 Turbo。

core.x86.enable_pcid=<bool>

默认值true

此选项用于控制是否使用 PCID(如果有足够的 CPU 支持)。如果启用此选项,并且没有足够的 CPU 支持,则此选项无效。

core.smp.maxcpus=<uint32_t>

默认值0x20

此选项会限制要初始化的 CPU 数量。对于特定架构,此值不能超过 SMP_MAX_CPUS

kernel.enable_suspend=<bool>

默认值false

使内核进入 S3(挂起到 RAM)ACPI 电源状态。

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

默认值auto

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