24.1 FreeBSD 内核选项概述
内核配置选项路径
amd64 内核配置选项位于 sys/amd64/conf
Arm64 内核配置选项位于 sys/arm64/conf
RISC-V 内核配置选项位于 sys/riscv/conf
内核配置文件说明(基于 amd64)
介绍 freebsd-src/main/sys/amd64/conf:
DEFAULTS:FreeBSD/amd64 的默认内核配置文件,只有不到 30 行FIRECRACKER:面向 Firecracker VM 的内核配置文件,参见 amd64: Add FIRECRACKER kernel configurationGENERIC:FreeBSD/amd64 通用内核配置文件,所有 amd64 镜像默认基于此。350 余行。GENERIC-KASAN:调试开发用。参见 amd64: Add MD bits for KASAN。用于 KASAN(Kernel Address SANitizer,内核地址清理器),参见 kasan(9),只有不到十行GENERIC-KCSAN:调试开发用。KCSAN(Kernel Concurrency Sanitizer,内核并发清理器)。30 余行,参见 Port the NetBSD KCSAN runtime to FreeBSDGENERIC-KMSAN:调试开发用。不到十行。KMSAN(Kernel Memory SANitizer,内核内存清理器)参见 KMSAN(9)GENERIC-MMCCAM:调试开发用。使用 MMCCAM 代替 MMC 栈。不到二十行。参见 MMC stack on top of CAM framework。GENERIC-NODEBUG:该文件仅在 main 分支中存在,用于基准测试。三十余行。基于 GENERIC 配置文件,但是删掉了 WITNESS (4)(跟踪每个线程获取和释放的锁)和 INVARIANTS(9)(内核表达式验证宏)。因为 CURRENT 的 GENERIC 默认启用 了上述调试功能,而它们会对系统性能产生影响——通过include "std.debug"引入,参见 sys/amd64/conf: unify MINIMAL and GENERIC debug、sys/conf/std.debug。GENERIC.hints:一些 hints 参数。二十余行。用于设置驱动的参数。LINT:LINT 文件,参见 Eliminate building LINT makefiles,用于验证代码风格格式等。不到五行。LINT-NOINET:LINT 文件,不到五行,禁用了 INET(4)(IPv4)。LINT 文件,参见 Eliminate building LINT makefiles。LINT-NOINET6:LINT 文件,不到五行,禁用了 INET(6)(IPv6)。LINT 文件,参见 Eliminate building LINT makefiles。LINT-NOIP:LINT 文件,不到三十行,禁用了 IP 协议相关(IPv4、IPv6、TLS 等)。LINT 文件,参见 Eliminate building LINT makefiles。LINT-NOVIMAGE:调试开发用。LINT 文件,不到五行,禁用了 VIMAGE (9)(实际上是 VNET(9) 的别名,网络子系统虚拟化基础设施)。参见 sys: add LINT-NOVIMAGEMINIMAL:FreeBSD/amd64 中最常用的最简内核配置选项。160 余行。MINIMAL-NODEBUG:等同于 GENERIC-NODEBUG,只不过是MINIMAL版本的。不到 15 行。
内核选项说明文件
sys/amd64/conf/NOTES:amd64 机器相关的内核配置说明文件。不到 200 行。
sys/x86/conf/NOTES:i386 和 amd64 共用的机器相关配置。650 余行。
sys/arm64/conf/NOTES:arm64(aarch64)机器相关的内核配置说明文件。不到 270 行。
sys/arm/conf/NOTES:armv7/32 位 arm 机器相关的内核配置说明文件。不到 100 行。
sys/riscv/conf/NOTES:riscv64(64 位 RISC-V)机器相关的内核配置说明文件。100 行。
sys/powerpc/conf/NOTES:powerpc/powerpc64/powerpc64le 机器相关的内核配置说明文件。不到 100 行。
sys/conf/NOTES:机器无关的说明,近 2900 行。
附录:man config(5) 中文
man config(5) 页面提供了许多关键信息,我们将其全文整理引用如下:
名称
config - 内核配置文件格式
描述
内核配置文件用于指定 FreeBSD 内核的配置。它由 config(8) 处理,用于创建可使用 make(1) 构建内核的构建环境。
词法结构
内核配置文件由一系列规范指令组成。
规范指令以行首的关键字开始,后跟附加参数。
规范指令可以用分号 ; 或换行符终止。长输入行可以通过以空白字符开始第二行及后续行来拆分成较短的行。
大小写敏感,machine 和 MACHINE 是不同的标记。
双引号字符 " 开始一个带引号的字符串。直到下一个引号字符的所有字符构成带引号字符串的值。可以通过使用序列 \" 将 " 字符插入到带引号的字符串中。
数字使用 C 风格语法指定。
# 字符开始注释;从 # 字符到当前行末尾的所有字符都将被忽略。
标记之间的空白字符将被忽略,但在带引号的字符串内除外。注释行后的空白字符将被忽略。
配置指令
内核配置指令可以以任意顺序出现在内核配置文件中。指令按出现顺序处理,后续指令行会覆盖先前指令的效果。
关键字及其含义列表如下:
cpu cputype
cpu cputype指定内核将在哪种 CPU 上运行。一个配置文件中可以有多个 cpu 指令。允许的 CPU 名称列表是体系结构特定的,在文件 sys/conf/options.<架构> 中定义。
device name [, name [...]] 与 devices name [, name [...]]
device name [, name [...]] 与 devices name [, name [...]]配置指定的设备以包含到内核映像中。所有体系结构通用的设备在文件 sys/conf/files 中定义。特定于体系结构 arch 的设备在文件 sys/conf/files.<架构> 中定义。
env filename
env filename指定包含内核环境定义的文件名。
内核将使用在引导时由 loader(8) 为其准备的环境来增强这个编译到内核中的环境。在 loader(8) 环境中指定的环境变量将优先于在 filename 中指定的环境变量,而在动态环境中指定的环境变量将优先于这两者。
可以在静态环境中指定 loader_env.disabled=1 来禁用 loader(8) 环境。禁用 loader(8) 环境应谨慎进行,并充分考虑它是否提供了系统正常引导所需的环境变量。
可以在 loader(8) 环境中指定 static_env.disabled=1 来禁用静态环境的使用。如果在 loader(8) 环境处理之后的任何环境中指定此选项,则无效。此选项不能与 loader_env.disabled 同时使用。
此指令对于在那些不从 loader(8) 启动的嵌入式环境中设置内核可调参数很有用。
所有 env 和 envvar 指令将被处理并以相反的出现顺序添加到静态环境中,以便后指定的变量正确覆盖先指定的变量。请注意,在 filename 中,给定变量的初次出现将是内核看到的第一个变量,有效地遮蔽了 filename 内同一变量的任何后续出现。
envvar setting
envvar setting指定要添加到内核编译时环境中的单个环境设置。setting 必须采用 名称=值 的形式。名称和值中都支持可选的引号。
所有 env 和 envvar 指令将被处理并以相反的出现顺序添加到静态环境中,以便后指定的变量正确覆盖先指定的变量。
files filename
files filename指定一个文件,该文件包含特定于该内核配置文件的文件列表(类似于 files.<架构>)。
hints filename
hints filename指定一个文件,用于从中加载静态设备配置规范。从 FreeBSD 5.0 开始,内核在引导时读取系统的设备配置(参见 device.hints(5))。此指令配置内核使用 filename 中列出的静态设备配置。
此静态设备配置中提供的提示将被按照遇到的顺序覆盖。编译到内核的环境中的提示优先于编译到内核的提示,而为内核准备的 loader(8) 环境中的提示优先于编译到内核的环境中的提示。
若动态环境可用,所有编译到内核的提示如果没有在动态环境中被覆盖,则将被添加到动态环境中。然后,动态环境将用于所有提示的搜索。
可以在编译到内核的环境或 loader(8) 环境中指定 static_hints.disabled=1 来禁用这些提示文件的使用。如果在 loader(8) 环境处理之后的任何环境中指定此选项,则无效。
文件 filename 必须符合 device.hints(5) 指定的语法。可存在多条 hints 行。生成的提示将是按相反顺序连接的文件,以便后面文件中的提示正确覆盖前面文件中的提示。
ident name
ident name将内核名称设置为 name。至少需要一条 ident 指令。
include filename
include filename从文件 filename 读取后续文本,并在 filename 成功处理后返回到当前文件。
includeoptions filename
includeoptions filename指定一个文件,该文件包含特定于该内核配置文件的附加选项列表。这对于需要添加自定义选项的构建环境非常有用,并且通常与 makeoption 指令一起使用。
machine arch [cpuarch]
machine arch [cpuarch]指定正在编译内核的机器的体系结构。arch 的合法值包括:
arm64- 64 位 ARM 应用体系结构arm- ARM 体系结构amd64- AMD x86-64 体系结构i386- 基于 Intel x86 的 PC 体系结构powerpc- IBM PowerPC 体系结构riscv- RISC-V 体系结构
如果指定了参数 cpuarch,它会将 config(8) 指向机器的 CPU 体系结构。当未指定 cpuarch 时,假定它与 arch 相同。arch 对应于 MACHINE。cpuarch 对应于 MACHINE_ARCH。
内核配置文件只能有一条 machine 指令,除非第二个指令与第一个指令中的 machine 参数完全匹配。
makeoption options 与 makeoptions options
makeoption options 与 makeoptions options将选项添加到生成的 makefile 中。
options 参数是一个或多个选项规范的逗号分隔列表。每个选项规范的形式为:
并将适当的 make(1) 变量定义插入到生成的 makefile 中。如果只指定了 make(1) 变量的名称,则假定值为空字符串。
请注意,由于公共 makefile 在处理配置文件后覆盖了 CFLAGS 变量,因此无法直接通过 makeoptions 自定义 CFLAGS。尽管如此,可以使用变量 CONF_CFLAGS 指定自定义编译器标志。在公共 makefile 设置了后者之后,其内容将附加到 CFLAGS,可覆盖它们的编译标志。
示例:
maxusers number
maxusers number此可选指令用于配置某些内核数据结构的大小。参数 number 可以是 0(默认值)或大于等于 2 的整数。值为 0 表示内核应根据可用物理内存的大小配置其数据结构。如果请求自动配置,内核将为此可调参数设置一个介于 32 和 384 之间的值(对于 32 位系统),或者根据可用内存为 64 位系统设置更高的值。
如 tuning(7) 中所述,也可以在引导时使用 loader(8) 设置此可调参数。
nocpu cputype
nocpu cputype从先前选定的 CPU 列表中移除指定的 CPU。此指令可用于取消使用 include 包含的文件中 cpu 指令的效果。
nodevice name [, name [...]] nodevices name [, name [...]]
nodevice name [, name [...]] nodevices name [, name [...]]从先前选定的设备列表中移除指定的设备。此指令可用于取消使用 include 包含的文件中 device 或 devices 指令的效果。
nomakeoption name nomakeoptions name
nomakeoption name nomakeoptions name从内核构建中移除先前定义的 make(1) 选项 name。此指令可用于取消使用 include 包含的文件中 makeoption 指令的效果。
nooption name [, name [...]] nooptions name [, name [...]]
nooption name [, name [...]] nooptions name [, name [...]]从先前定义的选项列表中移除指定的内核选项。此指令可用于取消使用 include 包含的文件中 option 或 options 指令的效果。
option optionspec [, optionspec [...]] options optionspec [, optionspec [...]]
option optionspec [, optionspec [...]] options optionspec [, optionspec [...]]将编译时内核选项添加到内核构建中。每个选项规范的形式为:
如果未指定值,则假定为 NULL。所有体系结构通用的选项在文件 sys/conf/options 中指定。特定于体系结构 arch 的选项在文件 sys/conf/options.<架构> 中指定。
文件
sys/compile/NAME- 根据内核配置创建的编译目录sys/conf/Makefile.arch- 体系结构 arch 的 Makefile 片段sys/conf/files- 所有体系结构通用的设备sys/conf/files.arch- 体系结构 arch 的设备sys/conf/options- 所有体系结构通用的选项sys/conf/options.arch- 体系结构 arch 的选项
参见
kenv(1)
make(1)
device.hints(5)
loader.conf(5)
config(8)
kldload(8)
loader(8)
Samuel J. Leffler 和 Michael J. Karels, Building 4.4BSD Kernels with Config.
历史
config(8) 实用程序首次出现在 4.1BSD 中,随后在 4.4BSD 中进行了修订。
内核配置机制在 FreeBSD 4.0 和 FreeBSD 5.0 中进一步演进,转向支持动态内核配置的体系结构。
FreeBSD ports 15.0 - 2025 年 6 月 13 日
附录:man device.hints(5) 中文
名称
device.hints - 设备资源提示
描述
在系统即将启动时由引导加载程序 loader(8) 读取 device.hints 文件,将其内容传递给内核。device.hints 文件包含各种变量,用于控制内核的引导行为。这些变量通常是设备提示(device hints),但也可以包含任何内核可调参数值。
该文件每行包含一个变量。以 # 字符开头的行是注释,将被引导加载程序忽略。
文件被引导加载程序读取后,您可以使用 show 命令检查变量,并可以使用引导加载程序的 set 和 unset 命令添加新变量、修改现有变量或删除变量(参见 loader(8))。
待系统启动后,您可以使用 kenv(1) 命令转储这些变量。
设备提示
设备提示变量由设备驱动程序用于设置设备。它们最常被 ISA 设备驱动程序用于指定驱动程序在何处探测相关设备,以及它将尝试使用哪些资源。
设备提示行的格式如下:
其中:
driver是设备驱动程序的名称unit是单元编号keyword是提示的关键字
关键字可以是:
at
指定设备所连接的总线
port
指定设备要使用的 I/O 端口的起始地址
portsize
指定设备使用的端口数量
irq
要使用的中断线路号
drq
DMA 通道号
maddr
指定设备使用的物理内存地址
msize
指定设备使用的物理内存大小
flags
设置设备的各个标志位
disabled
可设置为 1 来禁用设备
设备驱动程序可能需要一行到多行带有这些关键字的提示行,并且可能通过 resource_int_value(9) 接受此处未列出的其他关键字。请查阅各个设备驱动程序的联机手册以了解可用的关键字及其可能的值。
文件
/boot/device.hints- 设备资源提示文件/sys/ARCH/conf/GENERIC.hints- GENERIC 内核的示例资源提示/sys/ARCH/conf/NOTES- 关于内核配置文件和设备资源提示的说明
示例
设置 ISA 总线上 uart(4) 驱动程序的资源
禁用 ACPI 驱动程序
设置可调参数变量
参见
kenv(1)
loader.conf(5)
loader(8)
resource_int_value(9)
历史
device.hints 文件首次出现在 FreeBSD 5.0 中。
FreeBSD ports 15.0 - 2019 年 11 月 19 日
最后更新于
这有帮助吗?