Zircon 内核命令行选项

TODO(fxbug.dev/53594):移动 kernel_cmdline.md 到当前目录。

使用所有机器的通用选项

aslr.disable=\

默认值: false

该选项用来禁用ASLR(地址空间配置随机加载)。

aslr.entropy_bits=\

默认值: 0x1e

对于使用ASLR的地址空间,这控制了随机化过程中熵的位数。更高的熵意味着更松散的地址空间,同时分页表也会占用更多的内存。有效的参数值范围是:0至36。

kernel.cprng-reseed-require.hw-rng=\

默认值: false

此选项启用后,当HW RNG(硬件随机数生成器)在补种失败时,CPRNG(密码伪随机数生成器)返回错误。

kernel.cprng-reseed-require.jitterentropy=\

默认值: false

此选项启用后,当 jitterentropy 补种失败时,CPRNG 返回错误。

kernel.cprng-seed-require.hw-rng=\

默认值: false

此选项启用后,当 HW RNG 初始化种子失败时,CPRNG 返回错误。

kernel.cprng-seed-require.jitterentropy=\

默认值: false

此选项启用后,当 jitterentrop 在初始化种子失败时,CPRNG 返回错误。

kernel.cprng-seed-require.cmdline=\

默认值: false

此选项启用后,当命令行参数未提供熵的输入时,CPRNG 返回错误

kernel.entropy-mixin=\

该选项提供熵用以混入内核 CPRNG,选项值必须为小写十六进制数字的字符串。

原始值将尽快从内存中清除,并将从所有诊断输出中删除。

kernel.jitterentropy.bs=\

默认值: 0x40

为 jitterentropy 设置”memory block size”参数。当 jitterentropy 执行内存操作时(以增加CPU时序的差异),在此范围内的内存区块是可以被 jitterentropy 存取的。

kernel.jitterentropy.bc=\

默认值: 0x200

为 jitterentropy 设置”memory block count”参数。当 jitterentropy 执行内存操作时(以增加CPU时序的差异),此选项控制可以被 jitterentropy 存取的内存区块数量(kernel.jitterentropy.bs 定义的内存范围内)。

kernel.jitterentropy.ml=\

默认值: 0x20

为 jitterentropy 设置”memory loops”参数。当 jitterentropy 执行内存操作时(以增加CPU时序的差异),此选项控制内存访问例程的重复次数。此选项仅当参数 kernel.jitterentropy.rawtrue 时有效。如果此参数值为 0 或者 kernel.jitterentropy.rawfalse ,jitterentropy 以随机的方式选择循环数。

kernel.jitterentropy.ll=\

默认值: 0x1

为 jitterentropy 设置 “LFSR loops” 参数(默认值为 1)。 Sets the “LFSR loops” parameter for jitterentropy (the default is 1). 当 jitterentropy 正在执行CPU密集型LFSR操作(以增加CPU时序的变化)时,此选项将控制LFSR例程重复次数。 此选项仅当 kernel.jitterentropy.rawtrue 时有效。如果此参数值为 0 或者 kernel.jitterentropy.rawfalse ,jitterentropy 以随机的方式选择循环数。

kernel.jitterentropy.raw=\

默认值: true

当此选项值为 true(默认值) 时,熵控制器 jitterentropy 将会返回原始、未处理的样本。为 false 时,jitterentropy 会对原始样本进行处理,让输出数据看起来像是随机均匀的。值得注意的是,即使参数设为 false ,CPRNG 也会对样本进行再处理,所以,有时候 jitterentropy 内部的处理稍显多余。

kernel.lockup-detector.critical-section-threshold-ms=\

默认值: 0xbb8

当 CPU 在指定临界区停留时间超过此阈值时,会触发 KERNEL OOPS 事件。

更多信息,可以参见 k lockup statuslockup detector.

设置选项值设为0时,临界区锁定检测被禁用。

当选项 kernel.lockup-detector.heartbeat-period-ms 设置为 0 时,临界区锁定检测被禁用。

kernel.lockup-detector.critical-section-fatal-threshold-ms=\

默认值: 0x2710

当 CPU 在指定临界区停留超过此阈值时,系统会生成崩溃日志并重启,可以在重启原因中,查找 SOFTWARE_WATCHDOG 来定位该问题。

更多信息,可以参见 k lockup statuslockup detector.

设置选项值设为0时,临界区锁定检测被禁用。

当选项 kernel.lockup-detector.heartbeat-period-ms 设置为 0 时,临界区锁定检测被禁用。

kernel.lockup-detector.heartbeat-period-ms=\

Default: 0x3e8

该选项用来设置辅助CPU通过内核计时器发出心跳的频率。选项值要足够大,以免影响系统性能,同时要小于心跳周期的阈值。推荐使用 1000。

更多信息,可以参见 lockup detector

选项值为 0 时,心跳检测会被禁用。

kernel.lockup-detector.heartbeat-age-threshold-ms=\

默认值: 0xbb8

该选项指定了辅助 CPU 最后一次心跳的寿命阈值,超过该阈值,辅助 CPU 将被认定为已锁定。选项值应该大于心跳周期,同时足够小,以免错误短期锁定事件。 推荐使用 3000。

更多信息,可以参见 lockup detector

选项值为 0 时,心跳检测会被禁用。

kernel.lockup-detector.heartbeat-age-fatal-threshold-ms=\

Default: 0x2710

该选项指定了主 CPU 最后一次心跳的寿命阈值,超过该阈值,CPU 将会被认定为已锁定,超时会触发一个在重启日志中标记为 SOFTWARE_WATCHDOG 的崩溃日志。

更多信息,可以参见 lockup detector

选项值为 0 时,心跳崩溃日志生成和重启会被禁用。

kernel.oom.behavior=[reboot | jobkill]

默认值: reboot

此选项用以配置 内存溢出(OOM)时,内核需要执行的操作。有效的选项值为:jobkillreboot

当选项值设为 jobkill 时,内核会在 OOM 时尝试杀死拥有 ZX_PROP_JOB_KILL_ON_OOM bit set 的任务,用以恢复内存。

当选项值设为 jobkill 时,内核会在 OOM 时,内核会触发 out-of-memory 事件(参见 zx_system_get_event()),短暂的延迟后,将重启系统。

kernel.mexec-force-high-ramdisk=\

默认值: false

此选项原意是用作测试目的。当设为 true 时,会强制使用 mexec syscall 将后面内核的 ramdisk 放置到更高的地址空间去(对于 64 位地址空间,将偏移 >= 4GiB)。

kernel.mexec-pci-shutdown=\

默认值: true

若设置为 false,在调用 mexec 时,此选项使 PCI 设备保持运行状态。

kernel.oom.enable=\

默认值: true

此选项会启用 内存溢出(OOM)内核线程,在 PMM 少于 kernel.oom.outofmemory-mb 指定的空闲内存时,该线程将终止进程或重启系统。

使用命令 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 可查看当前内存可用状态。

kernel.oom.outofmemory-mb=\

默认值: 0x32

此选项指定了空闲内存的阈值,超出该阈值后,内存溢出(OOM)线程将触发内存溢出事件,用以终止进程或者重启系统。

kernel.oom.critical-mb=\

默认值: 0x96

此选项指定了空闲内存的阈值,超出该阈值后,内存溢出(OOM)线程将触发一个严重内存压力事件,从而表明进程此时应该释放内存。

kernel.oom.warning-mb=\

默认值: 0x12c

此选项指定了空闲内存的阈值,超出该阈值后,内存溢出(OOM)线程将触发一个警告内存压力事件,从而表明进程此时应该放缓申请内存分配。

kernel.oom.debounce-mb=\

默认值: 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 空闲内存,此时是 Critical 状态,想要从 Critical 切换到 Warning 状态,至少需要空闲内存增加到 105 MB(100 MB + 5 MB)。

kernel.oom.evict-at-warning=\

默认值: false

设置此选项时,在Warning 压力状态下,分页文件会被移出内存;而默认情况下,移出操作是在 Critical 和 OOM 状态下才会触发的。

kernel.oom.hysteresis-seconds=\

默认值: 0xa

此选项指定了内存状态切换时,需要延后的时间(以秒为单位)。要注意的是,延后操作只有在 低内存状态高内存状态 切换时才有效,反之,则无效。

kernel.oom.imminent-oom-delta-mb=\

默认值: 0xa

此选项将触发 即将内存溢出(imminent-out-of-memory)事件信号的空闲内存值设为 内存溢出 阈值 + 该增量(以 MB 为单位)。该信号意在捕获接近 OOM 的内存信息,因为我们基本不可能精确地捕获 OOM 时的状态。

比如:当 kernel.oom.outofmemory-mb 设为 50,同时 kernel.oom.imminent-oom-delta-mb 设为 20时, 则系统空闲内存为 70 MB(也就是 50 MB + 20 MB)时,触发 即将内存溢出(imminent-out-of-memory)事件,当空闲内存降到 50 MB 时,触发 内存溢出 事件。

kernel.serial=[none | legacy | qemu | \,\,\]

默认值: none

TODO(53594)

kernel.ticks_get_force_syscall=\

默认值: false

设置此选项,则 zx_ticks_get vDSO 的调用会被强制设为一个真实的系统调用,即使用户模式下是可以访问硬件循环计数器寄存器的。

kernel.clock_get_monotonic_force_syscall=\

默认值: false

设置此选项,则 zx_clock_get_monotonic vDSO 的调用会被强制设为一个真实的系统调用,而不是在用户模式下,简单地执行 tick 计时器的转换。

kernel.userpager.overtime_wait_seconds=\

默认值: 0x14

此选项定义了在被认定为超时、在调试日志中打印相关信息并继续等待之前,用户分页错误将被阻塞多久。设为 0,则永远不会被认定为超时。

kernel.userpager.overtime_timeout_seconds=\

默认值: 0x12c

此选项定义了在被取消之前,用户分页错误将被阻塞多久。对于硬件分页错误,问题线程将伴随一个严重分页错误异常而终止。对于由系统调用触发的软件分页错误,该系统调用将因ZX_ERR_TIMED_OUT 而失败。 设为 0,则永远不会因超时而取消该分页错误。。

kernel.bufferchain.reserve-pages=\

默认值: 0x20

此选项定义了每个 CPU 为缓冲链配额(channel messages)预留的分页数量。当系统处于负载状态时,设置更高的数值有助于减少持久化内存模块(PMM)的竞争,当然,代价是在系统空闲时会占用更多的内存。

TODO(fxbug.dev/68456): 需要确定此值的上限,防止占用过多内存。

kernel.bypass-debuglog=\

默认值: false

此选项启用时,强制输出调试日志到控制台,而不是缓存该日志。之所以在编译开关和命令行参数两处都可以设置该参数,是为了在命令行被解析为强制输出到控制台之前,加速其在内核的输出。编译开关的设置将覆盖命令行参数的设置(如果二者同时设置了该参数)。请注意,这两处参数设置后,都有禁用 irq 驱动的 uart Tx 的副作用。

kernel.debug_uart_poll=\

默认值: false

设为 true 时,将定期轮询 UART 并将其内容转发到控制台。

kernel.enable-debugging-syscalls=\

默认值: false

此选项禁用时,指定的调试相关的系统调用将失败并返回 ZX_ERR_NOT_SUPPORTED。 指定的系统调用如下:

  • zx_debug_send_command()
  • zx_ktrace_control()
  • zx_ktrace_init()
  • zx_ktrace_read()
  • zx_mtrace_control()
  • zx_process_write_memory()
  • zx_system_mexec()
  • zx_system_mexec_payload_get()

kernel.enable-serial-syscalls=\

默认值: false

可选值如下:

  • false
  • true
  • output-only

设为false时,zx_debug_read()zx_debug_write()调用时会失败并返回ZX_ERR_NOT_SUPPORTED

设为output-only时,zx_debug_read()调用时会失败并返回ZX_ERR_NOT_SUPPORTEDzx_debug_write()可正常执行。

设为true时,zx_debug_read()zx_debug_write()均可以正常执行。

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

默认值: hw_rng

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

kernel.entropy-test.len=\

默认值: 0x100000

当运行熵收集器质量测试时,此参数指定了要收集的字节数。

可以通过定义 ENTROPY_COLLECTOR_TEST_MAXLEN 来定义此参数的最大值。

kernel.force-watchdog-disabled=\

默认值: false

此选项设为 true 时,系统将尝试在引导序列中尽快禁用引导加载程序设置和传递的任何硬件看门狗定时器,假设引导加载程序提供了足够的信息来了解如何禁用 WDT。

gfxconsole.early=\

默认值: false

此选项请求内核在启动初期打开一个图形控制台(如果可行的话),用来系统启动过程中,显示内核调试打印出的信息。当用户空间启动后,用户模式图形控制台驱动程序将接管。

早期内核控制台在一些平台上可能比较缓慢,所以,如非调试所需,禁用该选项有助于加速系统启动速度。

gfxconsole.font=[9x16 | 18x32]

默认值: 9x16

此选项要求图形控制台使用指定的字体。

kernel.halt-on-panic=\

默认值: false

此选项设为 true 时,当发生内核错误,系统将死机而非重启。

当 GPU 启用时,因为内核无法可靠地绘制图形到帧缓冲器,故而在内核崩溃或错误时,系统会默认重启。

如果内核崩溃,系统重启了,内核错误的日志信息会出现在 /boot/log/last-panic.txt中,方便查看、下载等操作。

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

如果存在一个last-panic.txt文件,则表明这是发生内核错误后第一次成功启动系统。

当然,错误日志并不是一个 “粘人的小妖精” — 如果你顺利地重启了系统,它就会自动消失的, 又或者你的内核再次崩溃了,该文件将被替换为新的日志。

ktrace.bufsize=\

默认值: 0x20

此选项指定了为 ktrace 记录分配的千字节(MegaBytes,MB)数。

ktrace.grpmask=\

默认值: 0xfff

此选项指定有哪些 ktrace 记录需要被输出。选项值是 zircon/ktrace.h 头文件中 KTRACE_GRP_* 值的掩码。 十六进制值类似于 0xNNN。

kernel.memory-limit-dbg=\

默认值: true

此选项会为内存限制库启用详细日志输出。

kernel.memory-limit-mb=\

默认值: 0x0

此选项指定了系统内存的上限,以 MB(MegaByte)为单位。设为 0 则无上限。

比如,设置一个足够小的值,则可以让用户模拟出一个小于真实物理内存的系统。

kernel.page-scanner.enable-eviction=\

默认值: true

此选项设为 true 时,允许页扫描程序删除用户分页器备份的分页。该操作可以减少内存使用并防止内存不足的情况,但会删除系统行为中一些时序可预测性。

kernel.page-scanner.discardable-evictions-percent=\

默认值: 0x0

TODO-SYLSD: NEED DISCUSSION 将删除分页时,可丢弃 VMO 的占删除分页总数的百分比,剩余分页从 pager-backed VMO 中删除。例如,如果参数值设为X,而内核为了缓解内存压力,需要回收的分页数为N,则删除可丢弃 VMO 数量为(N * X / 100),删除 pager-backed VMO 数量为(N * (100 - X) / 100)

注意,内核会尽量分配好两种分页被删除的比例,但实际数值可能并不精确。

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

默认值: always

对于扫描程序运行之间无法访问的用户分页表,设置处理策略。

设为on_request时,仅在请求时执行删除操作,例如对于内存值偏低时的响应。

设为never时,分页表用不删除。

设为on_request时,每次扫描程序运行时,都删除无用的(Unused)分页。

kernel.arm64.disable_spec_mitigations=\

默认值: false

设为 true 时,禁用所有推测执行信息泄漏缓解措施。

反之,将默认使用 per-mitigation。

kernel.arm64.event-stream.enable=\

默认值: true

设为 true 时,每个 ARM cpu 都将启用一个事件流生成器,每个 cpu 以一个特定的比例设置隐藏事件标记。具体效果是 CPU 会退出他们可能处于的任何 WFE 状态。

kernel.arm64.event-stream.freq-hz=\

默认值: 0x2710

如果参数 kernel.arm64.event-stream.enable 被启用,指定此参数则可以设置器运行的频率。分辨率是有限的,因此驱动程序只能从 CPU 计时器计数器中选择最接近的 2 次方。

kernel.arm64.debug.dap-rom-soc=\

此选项启用时,则尝试在特定芯片系统(SoC,System on Chip)的硬编码地址处初始化 dap 调试孔。 此时可接受参数为 amlogic-t931g、amlogic-s905d2 和 amlogic-s905d3g。

x86 设备专用参数

kernel.x86.disable_spec_mitigations=\

默认值: false

设为 true 时,禁用所有推测执行信息泄漏缓解措施。

反之,将默认使用 per-mitigation。

kernel.x86.hwp=\

默认值: true

此设置在支持的芯片上启用 HWP(hardware P-states)。此功能可让 Intel CPU 自动调整自己的时钟速度。

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

默认值: bios-specified

设置 CPU 的功率/性能权衡策略。 具有 HWP(hardware P-states)支持的 x86 CPU 可以配置为自主调整其频率以支持不同的策略。

目前支持的策略有:

  • bios-specified: 使用 firmware/BIOS 设置中定义的功率/性能权衡策略。 如果没有可用策略,则回滚为 balanced
  • performance: 最佳性能。
  • balanced: 平衡 性能/省电
  • power-save: 以低性能换取低能耗
  • stable-performance: 使用保持系统性能一致的设置。这对于基准测试可能很有用,例如,保持性能可预测比最大化性能更重要。

kernel.x86.md_clear_on_user_return=\

默认值: true

MDS(微架构数据采样)是一系列推测执行信息泄漏漏洞,允许恶意代码推断最近加载或存储的内容,而不考虑权限级别(CVE-2019-11091、CVE-2018-12126、CVE- 2018-12130,CVE-2018-12127)。例如,这可以允许用户代码读取最近的内核加载/存储。

为避免此错误,需要在信任级别转换时刷新所有可能泄漏数据的微体系结构结构。 此外,重要的是不要在单个物理处理器内核上同时执行信任级别。

如果可能,此选项将控制是否将内核上的微架构结构 flush 到用户程序出口路径。 同时,它可能会对性能产生负面影响。

  • 此选项设为 true 时(默认),如果处理器易受攻击,则 flush 结构。
  • 反之,则不执行操作。

kernel.x86.pti.enable=\

默认值: 0x2

分页表隔离将用户分页表配置为不映射内核文本或数据。 这可能会对性能产生负面影响。 这是漏洞 Meltdown (AKA CVE-2017-5754) 的缓解措施。

  • 设为 1 时,强制分页表隔离。
  • 设为 0 时,强制禁用分页表隔离。此操作会造成安全风险。
  • 设为 2 或不设置 (默认), 这可以在易受 Meltdown 影响的 CPU 上启用分页表隔离。

kernel.x86.spec_store_bypass_disable=\

默认值: false

Spec-store-bypass (Spectre V4) 是一个推测执行信息泄漏漏洞,影响了许多 Intel 和 AMD x86 CPU。 它针对内存消歧硬件来推断最近存储的内容。 攻击只影响相同权限级别的进程内数据。

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

  • 设为 true 时, 在需要的 CPU 上,启用缓解措施。
  • 设为 false (默认)时,禁用缓解措施。

kernel.x86.turbo=\

默认值: true

Turbo Boost 或 Core Performance Boost 是允许处理器在运行时根据可用的热能和电能预算动态改变其性能的机制。 这可以以性能可变性为代价提供改进的交互性能。 某些工作负载可能会从禁用 Turbo 中受益; 如果此命令行标志设置为 false,则系统中的所有 CPU 都将禁用 turbo。

TODO: 未完待续