# 24.3 机器无关的内核选项注解

本章系统阐述 FreeBSD 内核中与硬件架构无关的通用配置选项。机器无关选项构成了内核的核心抽象层，实现了跨硬件平台的可移植性，是 FreeBSD 多架构支持的基石，体现了操作系统设计中的模块化与抽象原则。以下是相关的参考信息和说明：

* 原文：[freebsd-src/main/sys/conf/NOTES](https://github.com/freebsd/freebsd-src/blob/main/sys/conf/NOTES)
* 版本：[random: allow disabling of entropy harvesting from keyboard & mice](https://github.com/freebsd/freebsd-src/commit/d6f10a5d013fdcc92847644ffbaf65cbf491bb39)

> **技巧**
>
> 可直接剪切并粘贴下面的条目到内核配置文件中。
>
> > 以 `device`、`options`、`machine`、`ident`、`maxusers`、`makeoptions`、`hints` 等开头的行应放入将要运行 [config(8)](https://man.freebsd.org/cgi/man.cgi?config\(8\)) 的内核配置文件中。
> >
> > 以 `envvar hint.` 开头的行应放入你的 hints 文件中。参见 `/boot/device.hints`，[config(8)](https://man.freebsd.org/cgi/man.cgi?config\(8\)) 中的 `hints` 指令。
> >
> > 如果你想进行内核测试构建，请使用 `make LINT` 创建旧式的 LINT 文件。
> >
> > 此文件是机器无关的内核配置说明。机器相关的说明，请参见 `/sys/架构/conf/NOTES`。

> **技巧**
>
> NOTES 约定和风格指南：
>
> 大段注释应以仅包含注释字符的一行开始和结束。
>
> 描述特定对象时，如果存在块注释，应先写块注释。接下来按顺序写 device、options 和 hints 条目。所有 device 和 option 行都必须有注释，且注释不能只是重复 device 或 option 名称。如可能，注释应简明并放在同一行。设备和子系统的详细说明应放在 man 页中。
>
> `options` 与选项名之间用一个空格加一个制表符分隔。`device` 与设备名之间用两个空格加一个制表符分隔。option 或 device 后的注释应在注释字符后加一个空格。要注释掉禁用代码的负选项（因此不应在 LINT 构建中启用），在 `options` 前加 `#!`。

```ini
ident		LINT
```

这是内核的“标识”，通常应与内核的名称相同。

```ini
maxusers	10
```

参数 `maxusers` 可通过 `subr_param.c` 中定义的公式，用于控制多个内部系统表的静态大小。

省略此参数或将其设置为 `0`，系统将根据物理内存自动调整大小。

```ini
#hints		"LINT.hints"		# 查找设备的默认位置
```

静态编译设备连接信息，而不是使用 `/boot/device.hints`。

```ini
#env		"LINT.env"
```

使用以上方法将值编译进内核，以便内核可以通过 `getenv()`（或者用户空间的 `kenv(1)`）访问。文件格式为 `variable=value`，详见 [kenv(1)](https://man.freebsd.org/kenv\(1\))。

```ini
makeoptions	CONF_CFLAGS=-fno-builtin  # ①② 禁止使用 memcmp 等函数
#makeoptions	DEBUG=-g		# ③ 为内核构建包含 gdb(1) 调试符号的版本
#makeoptions	KERNEL=foo		# ④ 构建内核 "foo" 并安装到 "/foo"
#makeoptions	MODULES_OVERRIDE="ext2fs sound/sound sound/driver/maestro3" # ⑤ 只构建 ext2fs 模块以及我需要的声音系统部分。
makeoptions	DESTDIR=/tmp # 将目标安装目录临时设置为 /tmp
```

* ①：`makeoptions` 参数可将变量传递给构建区域生成的 Makefile。
* ②：`CONF_CFLAGS` 提供了一些额外的编译器标志，这些标志会在大多数其他标志之后添加到 `${CFLAGS}` 中。在这里，我们使用它来禁止使用非最优的 gcc 内建函数（例如 `memcmp`）。
* ③：`DEBUG` 是一个特殊标志。

下面的做法等同于执行 `config -g KERNELNAME`，会生成 `kernel.debug`，该内核带有调试信息 `-g`，同时还会生成一个普通的 `kernel`。使用 `make install.debug` 可以安装调试内核，但通常没有必要，因为调试符号不会被内核加载，在内核中也没有用处。

* ④：重命名 `KERNEL`，即更改内核的默认名称。
* ⑤：`MODULES_OVERRIDE` 可以用来限制构建的模块列表，仅编译指定的模块。

```ini
options 	MAXDSIZ=(1024UL*1024*1024)
options 	MAXSSIZ=(128UL*1024*1024)
options 	DFLDSIZ=(1024UL*1024*1024)
```

FreeBSD 进程在使用系统资源时会受到一定限制。更多细节，请参见：getrlimit(2)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/getrlimit(2)>。每个资源限制都有两个值：“软限制（soft limit）”和“硬限制（hard limit）”。

可以在系统正常运行时修改软限制，而硬限制只能在启动时设定。它们的默认值定义在 `sys/架构/include/vmparam.h` 中。有两种方式可以修改上述限制：

1. 在内核编译时设置值。下面的选项是一种将该限制提高到 1 GB 的方法。通过修改相关参数，还可以进一步提高这些值。
2. 在 `/boot/loader.conf` 中设置可调节参数：`kern.maxswzone`、`kern.maxbcache`、`kern.maxtsiz`、`kern.dfldsiz`、`kern.maxdsiz`、`kern.dflssiz`、`kern.maxssiz` 和 `kern.sgrowsiz`。

`/boot/loader.conf` 中的设置会覆盖内核配置文件中的任何值。有关更多细节，请参见 `sys/kern/subr_param.c` 中的函数 `init_param1`。建议使用 `/boot/loader.conf.local` 进行本地配置扩展，避免直接修改 `/boot/loader.conf`。

```ini
options 	BLKDEV_IOSIZE=8192
```

`BLKDEV_IOSIZE` 可设置用户块设备 I/O 使用的默认块大小。

> **注意**
>
> 当通过带有非零分区块大小的标签指定块设备时，该值会被标签覆盖。默认值为 `PAGE_SIZE`。

```ini
options 	DFLTPHYS=(64*1024) # DFLTPHYS 表示原始（raw）I/O 块设备访问的安全大小，默认值 64K
options 	MAXPHYS=(128*1024) # MAXPHYS 表示原始（raw）I/O 块设备访问的最大大小，默认值 128K
```

对于已知可靠的设备，读写操作会被分割成 MAXPHYS 大小的块；对于其他设备，则使用 DFLTPHYS 大小的块。某些应用在使用较大原始 I/O 访问块时性能更好。

> **注意**
>
> 某些虚拟内存（VM）参数是从这些值推导出来的，将它们设置得过大可能会导致内核无法启动。

```ini
options 	INCLUDE_CONFIG_FILE     # 将此文件内置进内核
```

你可将此配置文件实际存储到内核二进制文件中。详见 config(8)。

```ini
options 	BOOTVERBOSE=1
options 	BOOTHOWTO=RB_MULTIPLE
```

各种启动参数的编译时默认值。

```ini
options 	BOOT_TAG=\"\"
```

`dmesg` 启动标签的编译时默认值。

默认启动标签；可以使用 loader 可调参数 `kern.boot_tag` 来覆盖。当前启动的标签也通过 sysctl `kern.boot_tag` 暴露。

```ini
options 	BOOT_TAG_SZ=32
```

内核静态缓冲区应容纳的最大启动标签大小。BOOT\_TAG 及其相关可调参数的最大尺寸。

```ini
options 	GEOM_CACHE		# 磁盘缓存
options 	GEOM_CONCAT		# 磁盘串联
options 	GEOM_ELI		# 磁盘加密
options 	GEOM_GATE		# 用户态服务
options 	GEOM_JOURNAL		# 日志功能
options 	GEOM_LABEL		# 提供者标签化
options 	GEOM_LINUX_LVM		# Linux LVM2 卷
options 	GEOM_MAP		# 基于映射的分区
options 	GEOM_MIRROR		# 磁盘镜像
options 	GEOM_MULTIPATH		# 磁盘多路径
options 	GEOM_NOP		# 测试类
options 	GEOM_PART_APM		# Apple 分区
options 	GEOM_PART_BSD		# BSD 磁盘标签
options 	GEOM_PART_BSD64		# BSD 磁盘标签 64
options 	GEOM_PART_EBR		# 扩展启动记录
options 	GEOM_PART_GPT		# GPT 分区
options 	GEOM_PART_LDM		# 逻辑磁盘管理器
options 	GEOM_PART_MBR		# MBR 分区
options 	GEOM_RAID		# 软件 RAID 功能
options 	GEOM_RAID3		# RAID3 功能
options 	GEOM_SHSEC		# 共享密钥
options 	GEOM_STRIPE		# 磁盘条带化
options 	GEOM_UZIP		# 只读压缩磁盘
options 	GEOM_VIRSTOR		# 虚拟存储
options 	GEOM_ZERO		# 性能测试辅助工具
```

GEOM 相关选项。

```ini
options 	ROOTDEVNAME=\"ufs:da0s2e\"
```

可以在编译时指定根设备和文件系统类型；如果引导程序无法正确识别根设备，此处提供了备用方案；或在启动内核时指定 `RB_DFLTROOT` 标志（`-r`）时来覆盖选项。

## 调度器

调度器是内核中负责分配 CPU 时间给不同线程和进程的核心组件。以下是相关的内核配置选项。

```ini
options 	SCHED_4BSD # 历史悠久、久经考验的 BSD 调度器
options 	SCHED_STATS # 统计信息
#options 	SCHED_ULE # 默认的 ULE 调度器
```

`SCHED_4BSD` 和 `SCHED_ULE` 必须二选一。这些选项用于选择要编译进内核的调度器。

说明：

* `SCHED_4BSD` 使用全局运行队列且没有 CPU 亲和性，这在 SMP 系统中表现不佳。但它具有非常好的交互性和优先级选择能力。
* `SCHED_ULE` 在许多 SMP 机器上的工作负载下，相比 4BSD 提供了显著的性能优势。它支持 CPU 亲和性、每 CPU 的运行队列和调度器锁。它还对交互性有更强的支持，即使在单处理器机器上也能提供更好的响应能力。
* `SCHED_STATS` 会在 sysctl `kern.sched.stats` 下保存一些统计信息，有助于调试调度决策。

## SMP

对称多处理器（Symmetric MultiProcessor，SMP）系统包含多个处理器核心，这些核心共享内存和其他资源。以下是与 SMP 相关的内核配置选项。

```ini
options 	SMP			# Symmetric MultiProcessor Kernel（SMP，对称多处理器）
```

SMP 可构建对称多处理器内核。必须指定。

```ini
options 	EARLY_AP_STARTUP
```

`EARLY_AP_STARTUP` 可在内核启动过程中更早地释放应用处理器（在设备探测之前），而不是在启动尽头。

该选项是在从晚期到早期 AP 启动过渡期间使用的临时选项。

```ini
options 	MAXCPU=32
```

`MAXCPU` 定义了系统中能启动的最大 CPU 数量。每种架构通常已经有默认值。

```ini
options 	NUMA
```

NUMA 可启用内核各子系统中对非一致性内存访问（Non-Uniform Memory Access）策略的支持。

```ini
options 	MAXMEMDOM=2
```

`MAXMEMDOM` 定义了系统中可启动的最大内存域数量。每种架构通常已有默认值。

```ini
options 	NO_ADAPTIVE_MUTEXES
```

`ADAPTIVE_MUTEXES` 可改变阻塞互斥锁的行为：如果当前持有互斥锁的线程在另一 CPU 上执行，则互斥锁会自旋。此行为默认启用，该选项可用于禁用上述行为。

```ini
options 	NO_ADAPTIVE_RWLOCKS
```

`ADAPTIVE_RWLOCKS` 会改变读写锁的行为：如果当前持有读写锁的线程在另一 CPU 上执行，则锁会自旋。此行为默认启用，该选项可用于禁用上述行为。

```ini
options 	NO_ADAPTIVE_SX
```

`ADAPTIVE_SX` 可改变 sx 锁的行为：如果当前持有 sx 锁的线程在另一 CPU 上执行，则锁会自旋。此行为默认启用，该选项可用于禁用上述行为。

```ini
options 	MUTEX_NOINLINE
```

`MUTEX_NOINLINE` 可强制互斥操作通过调用函数来执行每个操作，而不是对简单情况进行内联。可用于减小内核文本段的大小。

> **注意**
>
> 这种行为已被选项 `INVARIANT_SUPPORT`、`INVARIANTS`、`KTR`、`LOCK_PROFILING` 和 `WITNESS` 隐式启用。

```ini
options 	RWLOCK_NOINLINE
```

`RWLOCK_NOINLINE` 可强制读写锁操作通过调用函数来执行每个操作，而不是对简单情况进行内联。可用于减小内核文本段的大小。

> **注意**
>
> 这种行为已被选项 `INVARIANT_SUPPORT`、`INVARIANTS`、`KTR`、`LOCK_PROFILING` 和 `WITNESS` 隐式启用。

```ini
options 	SX_NOINLINE
```

`SX_NOINLINE` 可强制 sx 锁操作通过调用函数来执行每个操作，而不是对简单情况进行内联。这可以用于减小内核文本段的大小。

> **注意**
>
> 这种行为已被选项 `INVARIANT_SUPPORT`、`INVARIANTS`、`KTR`、`LOCK_PROFILING` 和 `WITNESS` 隐式启用。

### SMP 调试选项

以下是与 SMP 调试相关的内核配置选项。

```ini
options 	PREEMPTION
options 	FULL_PREEMPTION
options 	WITNESS
options 	WITNESS_KDB
options 	WITNESS_SKIPSPIN
```

* `CALLOUT_PROFILING`：启用对 [callout(9)](https://man.freebsd.org/callout\(9\)) 后端使用的 callwheel 数据结构的基础分析。
* `PREEMPTION`：允许内核中的线程被优先级更高的 `中断` 线程抢占。提高交互性，使中断线程能更快运行，而不是等待。
* `FULL_PREEMPTION`：指示内核抢占非实时内核线程。主要用于在开发阶段暴露竞态条件和其他 bug。启用会降低性能并增加内核 panic 频率。依赖 `PREEMPTION` 选项，不建议开启。
* `SLEEPQUEUE_PROFILING`：对保存活动睡眠队列的哈希表及睡眠等待消息频率进行基础分析。
* `TURNSTILE_PROFILING`：对保存活动锁队列的哈希表进行基础分析。
* `UMTX_PROFILING`：对保存活动锁队列的哈希表进行基础分析。
* `WITNESS`：启用 witness 代码，用于检测锁操作期间的死锁和循环。
* WITNESS\_KDB：当发生锁层次违规或线程在休眠前持锁时，进入内核调试器。
* WITNESS\_SKIPSPIN：禁用对自旋互斥锁的 witness 检查。

```ini
options 	LOCK_PROFILING
```

`LOCK_PROFILING` —— 锁分析。详情见 [LOCK\_PROFILING(9)](https://man.freebsd.org/cgi/man.cgi?LOCK_PROFILING)。

```ini
options 	MPROF_BUFFERS="1536" # 设置缓冲区数量
options 	MPROF_HASH_SIZE="1543"# 设置缓冲区哈希表大小
```

`MPROF_HASH_SIZE` 哈希表大小必须大于缓冲区数量 `MPROF_BUFFERS`，且应为素数。

```ini
options 	CALLOUT_PROFILING
```

为 [callout(9)](https://man.freebsd.org/callout\(9\)) 后端进行分析。

```ini
options 	SLEEPQUEUE_PROFILING
options 	TURNSTILE_PROFILING
options 	UMTX_PROFILING
```

对内部哈希表进行分析。

```ini
options 	EPOCH_TRACE
```

针对 [epoch(9)](https://man.freebsd.org/epoch\(9\)) 的误用进行调试跟踪。

## 兼容性

兼容性选项允许内核支持旧版本 FreeBSD 的系统调用和接口，以便运行为旧版本编写的程序。以下是相关的内核配置选项。

```ini
options 	COMPAT_43TTY
```

旧式 TTY 接口。

```ini
options 	COMPAT_FREEBSD4
```

启用 FreeBSD4 兼容性系统调用。

> **注意**
>
> 在通常情况下，`COMPAT_FREEBSD<n>` 依赖 `COMPAT_FREEBSD<n+1>`、`COMPAT_FREEBSD<n+2>` 等。

```ini
options 	COMPAT_FREEBSD5
```

启用 FreeBSD 5 兼容性系统调用。

```ini
options 	COMPAT_FREEBSD6
```

启用 FreeBSD 6 兼容性系统调用。

```ini
options 	COMPAT_FREEBSD7
```

启用 FreeBSD 7 兼容性系统调用。

```ini
options 	COMPAT_FREEBSD8
```

启用 FreeBSD 8 兼容性系统调用。

```ini
options 	COMPAT_FREEBSD9
```

启用 FreeBSD 9 兼容性系统调用。

```ini
options 	COMPAT_FREEBSD10
```

启用 FreeBSD 10 兼容性系统调用。

```ini
options 	COMPAT_FREEBSD11
```

启用 FreeBSD 11 兼容性系统调用。

```ini
options 	COMPAT_FREEBSD12
```

启用 FreeBSD 12 兼容性系统调用。

```ini
options 	COMPAT_FREEBSD13
```

启用 FreeBSD 13 兼容性系统调用。

```ini
options 	COMPAT_FREEBSD14
```

启用 FreeBSD 14 兼容性系统调用。

```ini
options 	COMPAT_LINUXKPI
```

启用 Linux 内核编程接口。

```ini
options 	SYSVSHM
options 	SYSVSEM
options 	SYSVMSG
```

* `SYSVSHM`：启用 System V 风格的共享内存支持。
* `SYSVSEM`：启用 System V 风格的信号量支持。
* `SYSVMSG`：启用 System V 风格的消息队列支持。

## 调试

调试选项用于启用内核中的调试功能，包括内核调试器、调用栈跟踪、锁验证等功能，帮助开发者诊断和修复问题。以下是相关的内核配置选项。

```ini
options 	KDB
```

编译时包含内核调试器相关代码。

```ini
options 	KDB_TRACE
```

在系统发生 panic 时，在控制台打印当前线程的调用栈跟踪。

```ini
options 	KDB_UNATTENDED
```

在发生 panic 时不进入调试器。适用于无人值守的操作环境，你可能想通过控制台手动进入调试器，但仍希望系统能够在 panic 后自行恢复。

```ini
options 	DDB
```

启用 ddb 调试器后端。

```ini
options 	DDB_NUMSYM
```

除了符号表示外，还打印符号的数值。

```ini
options 	GDB
```

启用远程 gdb 调试器后端。

```ini
options 	QUEUE_MACRO_DEBUG_TRASH
```

在列表指针变为无效时（即元素从列表中移除）将其清空。启用成本相对较低。

```ini
#options 	QUEUE_MACRO_DEBUG_TRACE
```

在列表对象中存储最后一个修改列表对象的调用者的信息。需要额外的内存开销。

```ini
options 	SYSCTL_DEBUG
```

`SYSCTL_DEBUG` 启用后将生成一棵 sysctl 调试树，可用于在控制台上转储已注册的 sysctl 节点内容。

因为它会生成过于冗长的控制台输出，可能干扰串行控制台操作，所以默认情况下禁用。

```ini
options 	TEXTDUMP_PREFERRED
```

默认启用 textdump，并禁用内核核心转储。

```ini
options 	TEXTDUMP_VERBOSE
```

在执行 textdump 时启用额外的调试信息。

```ini
options 	NO_SYSCTL_DESCR
```

`NO_SYSCTL_DESCR` 会省略 sysctl 节点描述，以节省生成内核的空间。

```ini
options 	MALLOC_DEBUG_MAXZONES=8
```

`MALLOC_DEBUG_MAXZONES` 可为小于一页的 [malloc(9)](https://man.freebsd.org/malloc\(9\)) 分配启用多个 uma 区域。其目的是将不同的 malloc 类型隔离到哈希类别中，这样所有缓冲区溢出和释放后使用（use-after-free，UAF）问题通常只会影响该哈希类别中的 malloc 类型的内存。这纯粹是一种调试工具；通过改变哈希函数并追踪被破坏的哈希类别，各实例哈希类别的交集可指向被滥用的单个 malloc 类型。此时可以使用检查或 [memguard(9)](https://man.freebsd.org/cgi/man.cgi?query=memguard\&sektion=9\&format=html) 来捕获问题代码。

```ini
options 	DEBUG_MEMGUARD
```

`DEBUG_MEMGUARD` 构建并启用 memguard(9)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?query=memguard&sektion=9&format=html>，这是内核的替代分配器，用于检测释放后使用（use-after-free，UAF）等场景。有关使用的更多信息，请参见：memguard(9)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?query=memguard&sektion=9&format=html> 手册页。

```ini
options 	DEBUG_REDZONE
```

`DEBUG_REDZONE` 为 [malloc(9)](https://man.freebsd.org/malloc\(9\)) 启用缓冲区下溢和缓冲区上溢的检测。

```ini
#options 	EARLY_PRINTF
```

`EARLY_PRINTF` 可在内核非常早期（在调用 `cn_init()` 之前）使用一种特殊的 `printf`（`eprintf`）。这通常仅用于启动早期调试。通常情况下，它未被定义。这里被注释掉是因为该功能通常不可用，而且所需的 `eputc()` 也未定义。

```ini
options 	KTRACE			# 内核跟踪
options 	KTRACE_REQUEST_POOL=101
```

`KTRACE` 启用系统调用跟踪功能 [ktrace(2)](https://man.freebsd.org/ktrace\(2\))。为了更好地支持 SMP，KTRACE 使用一个工作线程来异步处理大多数跟踪事件，而不是由生成事件的线程直接处理。这需要预先分配一个用于存储跟踪事件对象的池。选项 `KTRACE_REQUEST_POOL` 指定该池的初始大小。可以在启动时/运行时通过可调参数和 sysctl `kern.ktrace_request_pool` 调整该池的大小。

```ini
options 	KTR
options 	KTR_BOOT_ENTRIES=1024
options 	KTR_ENTRIES=(128*1024)
options 	KTR_COMPILE=(KTR_ALL)
options 	KTR_MASK=KTR_INTR
options 	KTR_CPUMASK=0x3
options 	KTR_VERBOSE
```

KTR 是一款从 BSD/OS 引入的内核跟踪设施。通过选项 `KTR` 启用。

* `KTR_ENTRIES` 定义了循环跟踪缓冲区中的条目数量，可以是任意数字。
* `KTR_BOOT_ENTRIES` 定义了早期启动期间的条目数量，在 [malloc(9)](https://man.freebsd.org/malloc\(9\)) 可用之前使用。
* `KTR_COMPILE` 定义了要编译到内核中的事件掩码，由 `<sys/ktr.h>` 中的常量 `KTR_*` 定义。
* `KTR_MASK` 定义了变量 `ktr_mask` 的初始值，该变量在运行时决定要跟踪哪些事件。
* `KTR_CPUMASK` 它决定了哪些 CPU 记录事件，位 X 对应 CPU X。该选项的值可以是一系列以 `,` 分隔的位掩码。（例如：`KTR_CPUMASK=0xAF,0xFFFFFFFFFFFFFFFF`）。
* `KTR_VERBOSE` 默认启用将 KTR 事件输出到控制台。此功能可以通过 sysctl `debug.ktr_verbose` 调整，如果未定义 `KTR_VERBOSE`，则默认关闭。

详情请参见：ktr(4)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?query=ktr&sektion=4> 和 ktrdump(8)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?query=ktrdump&sektion=8&format=html>。

```ini
options 	ALQ
options 	KTR_ALQ
```

* [ALQ(9)](https://man.freebsd.org/cgi/man.cgi?query=alq\&sektion=9) 是一款用于将内核记录异步排队到 vnode 的机制。
* [ktr(4)](https://man.freebsd.org/cgi/man.cgi?query=ktr\&sektion=4) 等服务使用它根据内核事件流生成跟踪文件。记录由工作线程异步写入。

```ini
options 	INVARIANTS
```

选项 `INVARIANTS` 在多个源文件中用于启用对内部结构的额外完整性检查。在默认情况下禁用，因为检查这些条件会额外消耗时间，而这些问题通常仅由编程错误引起。

```ini
options 	INVARIANT_SUPPORT
```

选项 `INVARIANT_SUPPORT` 能让我们在编译时加入对部分内部结构的验证支持。`INVARIANT_SUPPORT` 是启用 `INVARIANTS` 的前提，因为启用 `INVARIANTS` 会调用这些函数。其目的是，如果启用了 `INVARIANT_SUPPORT`，你可以为单个源文件设置 `INVARIANTS`（通过修改源文件或在命令行指定）。此外，如果你希望构建带有 `INVARIANTS` 的内核模块，将 `INVARIANT_SUPPORT` 添加到内核中可以提供所有必要的基础设施，且不会增加额外开销。

```ini
options 	KASSERT_PANIC_OPTIONAL
```

选项 `KASSERT_PANIC_OPTIONAL` 能在 kasserts 被触发时不一定引起 panic。panic 是默认行为，但运行时选项可以将其完全关闭，或者在设定限制下关闭。

```ini
options 	DIAGNOSTIC
```

选项 `DIAGNOSTIC` 用于启用额外的调试信息和完整性检查。由于这些额外检查对 `INVARIANTS` 内核来说开销过大或过于冗杂，因此默认情况下禁用。通常，配置了 `DIAGNOSTIC` 的内核也会启用 `INVARIANTS` 选项。

```ini
options 	REGRESSION
```

`REGRESSION` 将启用仅在回归测试中需要的可选内核接口。启用这些接口可能构成安全风险，因为它们允许进程轻松修改运行时环境的某些方面，会重现不太可能或异常（可能通常不可能出现）的场景。

```ini
options 	COMPILING_LINT
```

此选项能让某些在运行系统中无法共存的驱动程序共存。它用于能够一次性编译所有内核代码以进行质量保证（例如本文件，其名称即来源于该选项）。

```ini
options 	STACK
```

STACK 将启用 [stack(9)](https://man.freebsd.org/cgi/man.cgi?query=stack\&sektion=9) 功能，可捕获内核栈。若内核编译中包含 [DDB(4)](https://man.freebsd.org/cgi/man.cgi?ddb\(4\))、[stack(9)](https://man.freebsd.org/cgi/man.cgi?query=stack\&sektion=9) 也会被自动编译进内核。

```ini
options 	NUM_CORE_FILES=5
```

选项 `NUM_CORE_FILES` 指定了特定进程生成核心文件的数量上限，当核心文件格式说明符包含 `%I` 模式时。由于格式字符串中核心计数只有 `1` 个字符，可表示的范围为 0-9，因此该选项允许的最大值为 `10`（即指定该参数为 `9`）。该核心文件数量限制可在运行时通过 sysctl `debug.ncores` 进行调整。

```ini
options 	TSLOG
options 	TSLOGSIZE=262144
```

`TSLOG` 选项可启用事件的时间戳记录，特别是函数的进/出，以便跟踪内核消耗的时间。尤其在早期启动过程中非常有用，因为此时还无法使用 DTrace 等更高级的工具。

* `TSLOGSIZE` 选项控制用于存储这些事件的（预分配、固定长度）缓冲区大小（默认：`262144` 条记录）。
* `TSLOG_PAGEZERO` 选项可启用对 `pmap_zero_page` 的 TSLOG；由于它通常会生成过多记录而不太实用，因此必须单独启用。

出于安全考虑，TSLOG 不应在用于生产的系统上启用。

## 性能监控

性能监控选项提供了对系统性能进行测量和分析的能力，特别是利用 CPU 内置的性能监控计数器。以下是相关的内核配置选项。

```ini
device		hwpmc			# 驱动程序（也可作为可加载模块）
options 	HWPMC_DEBUG
options 	HWPMC_HOOKS		# 其他必要的内核钩子
```

驱动程序 `hwpmc` 可使用 CPU 内置的性能监控计数器进行性能监控。基础内核需要通过 `options` 条目进行配置，可将 hwpmc 设备编译进内核或作为可加载内核模块来加载。

在特定架构上可能需要额外的配置选项，请参见：hwpmc(4)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/hwpmc(4)>。

## 网络接口

网络接口是 FreeBSD 内核中负责处理网络通信的关键部分，包括协议栈、网络设备驱动等。以下是相关的内核配置选项。

### 协议栈

网络协议栈负责处理网络数据的传输和接收，包括 TCP/IP、UDP 等协议。以下是相关的内核配置选项。

```ini
options 	INET			# 互联网通信协议（IPv4）
options 	INET6			# 互联网通信协议（IPv6）
```

```ini
options 	CC_CDG # CAIA Delay‑Gradient 算法
options 	CC_CHD # CAIA Hamilton‑Delay 算法
options 	CC_CUBIC # Cubic 算法
options 	CC_DCTCP # DCTCP 算法
options 	CC_HD # Hamilton Delay 算法
options 	CC_HTCP # H‑TCP 算法
options 	CC_NEWRENO # NewReno 算法
options 	CC_VEGAS # Vegas 算法
options 	CC_DEFAULT=\"cubic\" # 将 Cubic 指定为默认的拥塞控制算法
options 	RATELIMIT		# 传输速率限制支持

options 	ROUTETABLES=2		# 分配的 FIB 最多可达 65536。默认值为 1，但这不是个好主意，因为它们占用空间很大

options 	TCP_OFFLOAD		# TCP 卸载（offload）
options  	TCP_RFC7413		# TCP 快速打开（TCP Fast Open）

options  	TCPHPTS # 启用 TCP HPTS（High Precision Timer）支持
#options 	TCP_HPTS_KTEST		# 为 HPTS 添加 KTEST 支持
```

> **注意**
>
> 如果你使用了选项 `INET`、`INET6` 或同时指定了两者：读者必须至少指定一个拥塞控制选项，否则将导致编译失败。`GENERIC` 定义了 `CC_CUBIC`。如果编译了多款拥塞控制，你可能需要指定一个默认值。

`default` 中的字符串是 `cc` 模块的名称，在 sysctl 中用于设置默认值。代码将 `CUBIC` 定义为默认值，或者如果只编译了一个 `cc_module`，则使用该模块。

```ini
options 	IPSEC			# IPsec（需要设备加密支持）
```

IPsec（IP 安全）。要启用 `IPSEC`，**必须** 在内核配置中同时指定设备加密支持。

```ini
options 	IPSEC_SUPPORT
#options 	IPSEC_DEBUG		# IPsec 调试
```

`IPSEC_SUPPORT` 选项并不会直接启用 IPsec，但它能将 IPsec 作为内核模块加载。你仍然 **必须** 在内核配置中添加设备加密支持。

```ini
options 	TCP_BBR # BBR（Bottleneck Bandwidth and Round-trip propagation time）
options 	TCP_RACK # RACK 栈，Recent ACKnowledgment
```

可选的 TCP 堆栈。

```ini
options 	KERN_TLS		# TLS 发送与接收卸载
```

TLS 用于通过 TCP 套接字对数据进行帧封装以及加/解密。

```ini
options 	NETLINK
```

Netlink 是一种内核与用户空间之间的消息传递接口。

```ini
options 	NETSMB			# SMB/CIFS 请求器（requester）
```

SMB/CIFS 请求器。NETSMB 启用了对 SMB 协议的支持，它需要选项 `LIBMCHAIN` 和 `LIBICONV`。

```ini
options 	LIBMCHAIN
```

mchain 库。它可以作为 KLD（可加载内核模块）加载，也可以编译进内核。

```ini
options 	LIBALIAS
```

libalias 库，用于执行 NAT（网络地址转换）。

```ini
options 	SCTP
options 	SCTP_SUPPORT
```

SCTP 是一种新型传输协议，由 RFC2960 定义，并由 RFC3309 和 RFC3758 更新，很快还会有新的基础 RFC 和更多扩展。本版本支持所有扩展，包括许多草案（大部分即将成为 RFC）。它是 SCTP 的参考实现，经过了充分测试。

> **注意**
>
> **必须同时定义 INET 和 INET6**。不必启用 IPv6，但 SCTP 是双栈协议，目前我们还没有拆分 IPv6 和 IPv4，因为一个关联（association）可以同时跨越 IPv6 和 IPv4 地址。

选项 `SCTP_SUPPORT` 并不会直接启用 SCTP，而是提供将 SCTP 作为可加载内核模块加载所需的支持。

```ini
options 	SCTP_DEBUG
```

有很多选项：

这个选项可开启各种详细打印功能。它由一个位掩码控制（可以通过 socket 选项和 sysctl 设置）。包含该选项本身不会立即产生日志，必须先设置相应的位。但打印信息可能非常冗长。因此，若未启用该选项，代码就不会进行位检测和打印，这样可以提高运行速度。如果你不是在调试，请不要使用。

```ini
options 	SCTP_LOCK_LOGGING
options 	SCTP_MBUF_LOGGING
options 	SCTP_MBCNT_LOGGING
options 	SCTP_PACKET_LOGGING
options 	SCTP_LTRACE_CHUNKS
options 	SCTP_LTRACE_ERRORS
```

上面的所有选项用于开启特定类型的日志记录。可以监控拥塞窗口（CWND）增长、飞行数据量（flight size）以及各种其他指标。可查看代码了解更多细节。

使用这些功能需启用 [ktr(4)](https://man.freebsd.org/cgi/man.cgi?query=ktr\&sektion=4)，然后通过 sysctl 设置打开或关闭各种日志位。使用 [ktrdump(8)](https://man.freebsd.org/cgi/man.cgi?query=ktrdump\&sektion=8\&format=html) 提取日志，再通过显示程序处理，就能生成图表等可视化内容。

```ini
options 	OFED
options 	OFED_DEBUG_INIT
```

OpenFabrics 企业版发行版（OFED，InfiniBand）。

```ini
options 	SDP
options 	SDP_DEBUG
```

套接字直接协议（SDP）。

```ini
options 	IPOIB # InfiniBand 协议栈及其支持
options 	IPOIB_DEBUG
options 	IPOIB_CM # 使用连接模式（connected mode）的 IPoIB
```

IP over InfiniBand (IPoIB)，基于 InfiniBand 的互联网协议，参见：wiki/InfiniBand\[EB/OL]. \[2026-03-26]. <https://wiki.freebsd.org/InfiniBand>。

```ini
options 	ALTQ # 交错队列，Alternate Queuing
options 	ALTQ_CBQ	# 基于类的排队
options 	ALTQ_RED	# 随机早期检测
options 	ALTQ_RIO	# RED 输入/输出
options 	ALTQ_CODEL	# CoDel 主动队列管理
options 	ALTQ_HFSC	# 分层服务曲线调度器
options 	ALTQ_FAIRQ	# 公平包调度器
options 	ALTQ_CDNR	# 流量调节器
options 	ALTQ_PRIQ	# 优先级队列
options 	ALTQ_NOPCC	# 当 TSC 不可用时为必需选项
options 	ALTQ_DEBUG	# 启用 ALTQ 调试
```

[altq(9)](https://man.freebsd.org/cgi/man.cgi?query=altq\&sektion=9)。通过选项 `ALTQ` 启用钩子的基础部分。各个调度策略必须编译进基本系统，不能在此阶段作为模块加载。ALTQ 需要稳定的 TSC，如果你的 TSC 不稳定或在 CPU 节流时发生变化，则必须同时启用选项 `ALTQ_NOPCC`。

```ini
options 	NETGRAPH		# netgraph(4) 系统 ①
options 	NETGRAPH_DEBUG		# 启用额外调试，这会影响 netgraph(4) 及其节点。
```

* ①：[netgraph(4)](https://man.freebsd.org/cgi/man.cgi?netgraph\(4\)) 系统，是一款网络工具包。使用选项 `NETGRAPH` 启用 netgraph 核心代码。

可以通过下列对应的选项启用各个节点类型；不过这并非严格必要，因为如果节点类型尚未编译进内核，netgraph 会自动加载对应的 KLD 模块。下面的每种类型都有对应的手册页，例如 [ng\_async(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_async\&apropos=0\&sektion=4)。

```ini
options 	NETGRAPH_ASYNC # ng_async(4)
options 	NETGRAPH_BLUETOOTH		# ng_bluetooth(4)
options 	NETGRAPH_BLUETOOTH_HCI		# ng_hci(4)
options 	NETGRAPH_BLUETOOTH_L2CAP	# ng_l2cap(4)
options 	NETGRAPH_BLUETOOTH_SOCKET	# ng_btsocket(4)
options 	NETGRAPH_BLUETOOTH_UBT		# ng_ubt(4)
options 	NETGRAPH_BLUETOOTH_UBTBCMFW	# ubtbcmfw(4)
options 	NETGRAPH_BPF # ng_bpf(4)
options 	NETGRAPH_BRIDGE # ng_bridge(4)
options 	NETGRAPH_CAR # ng_car(4)
options 	NETGRAPH_CHECKSUM # ng_checksum(4)
options 	NETGRAPH_CISCO # ng_cisco(4)
options 	NETGRAPH_DEFLATE # ng_deflate(4)
options 	NETGRAPH_DEVICE # ng_device(4)
options 	NETGRAPH_ECHO # ng_echo(4)
options 	NETGRAPH_EIFACE # ng_eiface(4)
options 	NETGRAPH_ETHER # ng_ether(4)
options 	NETGRAPH_FRAME_RELAY # ng_frame_relay(4)
options 	NETGRAPH_GIF # ng_gif(4)
options 	NETGRAPH_GIF_DEMUX # ng_gif_demux(4)
options 	NETGRAPH_HOLE # ng_hole(4)
options 	NETGRAPH_IFACE # ng_iface(4)
options 	NETGRAPH_IP_INPUT # ng_ip_input(4)
options 	NETGRAPH_IPFW # ng_ipfw(4)
options 	NETGRAPH_KSOCKET # ng_ksocket(4)
options 	NETGRAPH_L2TP # ng_l2tp(4)
options 	NETGRAPH_LMI # ng_lmi(4)
options 	NETGRAPH_MPPC_COMPRESSION # ng_mppc(4)
options 	NETGRAPH_MPPC_ENCRYPTION # ng_mppc(4)
options 	NETGRAPH_NETFLOW # ng_netflow(4)
options 	NETGRAPH_NAT # ng_nat(4)
options 	NETGRAPH_ONE2MANY # ng_one2many(4)
options 	NETGRAPH_PATCH # ng_patch(4)
options 	NETGRAPH_PIPE # ng_pipe(4)
options 	NETGRAPH_PPP # ng_ppp(4)
options 	NETGRAPH_PPPOE # ng_pppoe(4)
options 	NETGRAPH_PPTPGRE # ng_pptpgre(4)
options 	NETGRAPH_PRED1 # ng_pred1(4)
options 	NETGRAPH_RFC1490 # ng_rfc1490(4)
options 	NETGRAPH_SOCKET # ng_socket(4)
options 	NETGRAPH_SPLIT # ng_split(4)
options 	NETGRAPH_TAG # ng_tag(4)
options 	NETGRAPH_TCPMSS # ng_tcpmss(4)
options 	NETGRAPH_TEE # ng_tee(4)
options 	NETGRAPH_UI # ng_UI(4)
options 	NETGRAPH_VJC # ng_vjc(4)
options 	NETGRAPH_VLAN # ng_vlan(4)
```

netgraph 节点类型：

* NETGRAPH\_ASYNC —— [ng\_async(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_async\&apropos=0\&sektion=4)
* NETGRAPH\_BLUETOOTH —— [ng\_bluetooth(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_bluetooth%284%29\&apropos=0\&sektion=4)
* NETGRAPH\_BLUETOOTH\_HCI —— [ng\_hci(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_hci%284%29\&apropos=0\&sektion=4)
* NETGRAPH\_BLUETOOTH\_L2CAP —— [ng\_l2cap(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_l2cap%284%29\&apropos=0\&sektion=4)
* NETGRAPH\_BLUETOOTH\_SOCKET —— [ng\_btsocket(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_btsocket%284%29\&apropos=0\&sektion=4)
* NETGRAPH\_BLUETOOTH\_UBT —— [ng\_ubt(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_ubt%284%29\&apropos=0\&sektion=4)
* NETGRAPH\_BLUETOOTH\_UBTBCMFW —— [ubtbcmfw(4)](https://man.freebsd.org/cgi/man.cgi?query=ubtbcmfw%284%29\&apropos=0\&sektion=4)
* NETGRAPH\_BPF —— [ng\_bpf(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_bpf\&sektion=4)
* NETGRAPH\_BRIDGE —— [ng\_bridge(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_bridge\&sektion=4\&format=html)
* NETGRAPH\_CAR —— [ng\_car(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_car\&sektion=4)
* NETGRAPH\_CHECKSUM —— [ng\_checksum(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_checksum\&sektion=4)
* NETGRAPH\_CISCO —— [ng\_cisco(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_cisco\&sektion=4)
* NETGRAPH\_DEFLATE —— [ng\_deflate(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_deflate\&sektion=4)
* NETGRAPH\_DEVICE —— [ng\_device(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_device\&sektion=4)
* NETGRAPH\_ECHO —— [ng\_echo(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_echo\&sektion=4)
* NETGRAPH\_EIFACE —— [ng\_eiface(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_eiface\&sektion=4)
* NETGRAPH\_ETHER —— [ng\_ether(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_ether\&sektion=4)
* NETGRAPH\_FRAME\_RELAY —— [ng\_frame\_relay(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_frame_relay\&sektion=4)
* NETGRAPH\_GIF —— [ng\_gif(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_gif\&sektion=4)
* NETGRAPH\_GIF\_DEMUX —— [ng\_gif\_demux(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_gif_demux\&sektion=4)
* NETGRAPH\_HOLE —— [ng\_hole(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_hole\&sektion=4)
* NETGRAPH\_IFACE —— [ng\_iface(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_iface\&sektion=4)
* NETGRAPH\_IP\_INPUT —— [ng\_ip\_input(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_ip_input\&sektion=4)
* NETGRAPH\_IPFW —— [ng\_ipfw(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_ipfw\&sektion=4)
* NETGRAPH\_KSOCKET —— [ng\_ksocket(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_ksocket\&sektion=4)
* NETGRAPH\_L2TP —— [ng\_l2tp(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_l2tp\&sektion=4)
* NETGRAPH\_LMI —— [ng\_lmi(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_lmi\&sektion=4)
* NETGRAPH\_MPPC\_COMPRESSION —— [ng\_mppc(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_mppc\&sektion=4)
* NETGRAPH\_MPPC\_ENCRYPTION —— [ng\_mppc(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_mppc\&sektion=4)
* NETGRAPH\_NETFLOW —— [ng\_netflow(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_netflow\&sektion=4)
* NETGRAPH\_NAT —— [ng\_nat(4)](https://man.freebsd.org/ng_nat\(4\))
* NETGRAPH\_ONE2MANY —— [ng\_one2many(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_one2many)
* NETGRAPH\_PATCH —— [ng\_patch(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_patch\&sektion=4)
* NETGRAPH\_PIPE —— [ng\_pipe(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_pipe\&apropos=0\&sektion=4)
* NETGRAPH\_PPP —— [ng\_ppp(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_ppp\&sektion=4)
* NETGRAPH\_PPPOE —— [ng\_pppoe(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_pppoe)
* NETGRAPH\_PPTPGRE —— [ng\_pptpgre(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_pptpgre\&sektion=4)
* NETGRAPH\_PRED1 —— [ng\_pred1(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_pred1\&sektion=4)
* NETGRAPH\_RFC1490 —— [ng\_rfc1490(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_rfc1490\&sektion=4)
* NETGRAPH\_SOCKET —— [ng\_socket(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_socket\&sektion=4)
* NETGRAPH\_SPLIT —— [ng\_split(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_split\&sektion=4)
* NETGRAPH\_TAG —— [ng\_tag(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_tag)
* NETGRAPH\_TCPMSS —— [ng\_tcpmss(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_tcpmss\&sektion=4)
* NETGRAPH\_TEE —— [ng\_tee(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_tee)
* NETGRAPH\_UI —— [ng\_UI(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_UI\&sektion=4)
* NETGRAPH\_VJC —— [ng\_vjc(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_vjc\&sektion=4)
* NETGRAPH\_VLAN —— [ng\_vlan(4)](https://man.freebsd.org/cgi/man.cgi?query=ng_vlan)

```ini
options 	VIMAGE
options 	VNET_DEBUG	# VIMAGE 调试用
```

[vimage(9)](https://man.freebsd.org/cgi/man.cgi?query=vimage\&sektion=9)（即 VNET(9) 的别名），用于网络栈虚拟化。

### 网络接口

网络接口设备提供了系统与网络物理连接的能力。以下是相关的内核配置选项。

```ini
device		loop
```

当启用网络功能时，[loop(4)](https://man.freebsd.org/cgi/man.cgi?query=loop\&apropos=0\&sektion=4) 设备是 **必需的**。

```ini
device		ether
```

`ether` 设备提供了用于处理以太网的通用代码；当需要配置以太网设备驱动时，它是 **必需的**。

```ini
device		vlan
```

[vlan(4)](https://man.freebsd.org/cgi/man.cgi?query=vlan\&apropos=0\&sektion=4) 设备可根据 IEEE 802.1Q 实现以太网帧的 VLAN 标记。

```ini
device		vxlan
```

[vxlan(4)](https://man.freebsd.org/cgi/man.cgi?query=vxlan\&apropos=0\&sektion=4) 设备将根据 RFC7348 实现以太网帧在 UDP 数据包中的 VXLAN 封装。

```ini
device		wlan
options 	IEEE80211_DEBUG		# 启用调试信息
options 	IEEE80211_DEBUG_REFCNT
options 	IEEE80211_SUPPORT_MESH	# 启用 802.11s D3.0 / Mesh 支持
options 	IEEE80211_SUPPORT_TDMA	# 启用 TDMA 
```

[wlan(4)](https://man.freebsd.org/cgi/man.cgi?query=wlan\&apropos=0\&sektion=4) 设备提供了支持 802.11 驱动的通用代码，包括主机 AP 模式；对于 wi 和 ath 驱动来说，`wlan` 是 **必需的**，并且最终将成为所有 802.11 驱动的必需项。

```ini
device		wlan_wep # 支持 WEP 加密协议
device		wlan_tkip # 支持 TKIP 加密协议
device		wlan_ccmp # 支持 AES-CCMP 加密协议
device		wlan_gcmp # 支持 AES-GCMP 加密协议
```

可选设备，依赖 802.11 `wlan` 模块。

```ini
device		wlan_xauth
```

`wlan_xauth` 设备提供了对外部（即用户态）认证器的支持，用于依赖 `wlan` 模块并支持 802.1x 和/或 WPA 安全协议的 802.11 驱动。

```ini
device		wlan_acl
device		wlan_amrr
```

* `wlan_acl` 设备提供了基于 MAC 的访问控制机制，用于在 AP 模式下运行并使用 `wlan` 模块的 802.11 驱动。
* `wlan_amrr` 设备提供了 AMRR 传输速率控制算法。

```ini
device		bpf
```

`bpf` 设备将启用伯克利数据包过滤器（Berkeley Packet Filter）。启用此选项时需注意相关的安全和管理影响。

DHCP 依赖该选项。

```ini
device		netmap
```

`netmap` 设备可实现从用户态对网络设备的内存映射访问，即使在 10 Gbit/s 速率下，也能实现线速的数据包捕获和生成。需要设备驱动支持。支持的驱动有 ixgbe、e1000、re。

```ini
device		disc
```

`disc` 设备实现了一个最简网络接口，会丢弃所有发送的数据包，且永远不会接收任何数据包，用于测试和性能基准评估。

```ini
device		epair
```

`epair` 设备实现了一对虚拟的背靠背连接的以太网接口。

```ini
device		edsc
```

`edsc` 设备实现了一个最简以太网接口，会丢弃所有发送的数据包，且不接收任何数据包。

```ini
device		tuntap
```

`tuntap` 设备实现了用户态的 PPP、[nos-tun(8)](https://man.freebsd.org/cgi/man.cgi?query=nos-tun\&sektion=8) 以及类似 pty 的虚拟以太网接口。

```ini
device		gif
device		gre
device		me
options 	XBONEHACK
```

* `gif` 设备实现了 IPv6 over IPv4 隧道、IPv4 over IPv6 隧道、IPv4 over IPv4 隧道以及 IPv6 over IPv6 隧道
* `gre` 设备实现了 GRE（通用路由封装）隧道，遵循 RFC 2784 和 RFC 2890 规范
* `me` 设备实现了 IPv4 内的最小封装（Minimal Encapsulation），遵循 RFC 2004 规范
* `XBONEHACK` 选项允许在多个 `gif` 接口上配置相同的地址对

```ini
device		stf
```

`stf` 设备实现了 6to4 封装。

```ini
device		pf
device		pflog
device		pfsync
```

PF 数据包过滤器由三款设备组成：

* `pf` 设备提供了 `/dev/pf` 以及防火墙代码本身。
* `pflog` 设备提供了 `pflog0` 接口，用于记录数据包。
* `pfsync` 设备提供了 `pfsync0` 接口，用于防火墙状态表的同步（通过网络）。

```ini
device		if_bridge
```

桥接网络接口。

```ini
device		carp
```

通用地址冗余协议（CARP）。更多详情参见：carp(4)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?carp(4)>。

```ini
device		enc
```

IPsec 接口。

```ini
device		lagg
```

LAGG 链路聚合接口。

```ini
device		wg
```

WireGuard 接口。

```ini
device		dummymbuf
```

`dummymbuf` 是用于 mbuf 修改的 pfil 钩子。

### 互联网协议簇

互联网协议簇提供了网络通信的基础协议支持。以下是相关的内核配置选项。

```ini
options 	MROUTING		# 多播路由 ①
options 	IPFIREWALL		# IP 防火墙 ②
options 	IPFIREWALL_VERBOSE	# 启用日志记录到 syslogd(8) ③
options 	IPFIREWALL_VERBOSE_LIMIT=100	# 限制日志详细程度 ④
options 	IPFIREWALL_DEFAULT_TO_ACCEPT	# 默认放行所有流量 ⑤
options 	IPFIREWALL_NAT		# 为 ipfw 内核 NAT 提供支持，需要 LIBALIAS
options 	IPFIREWALL_NAT64	# 为 ipfw 内核 NAT64 提供支持
options 	IPFIREWALL_NPTV6	# 为 ipfw 内核 NPTv6 提供支持
options 	IPDIVERT		# 转发套接字。启用 divert IP 套接字，用于 `ipfw divert`；若要编译进内核，则依赖 IPFIREWALL
options 	IPFILTER		# ipfilter 支持
options 	IPFILTER_LOG		# ipfilter 日志
options 	IPFILTER_LOOKUP		# ipfilter 池
options 	IPFILTER_DEFAULT_BLOCK	# 默认阻止所有数据包
options 	IPSTEALTH		# 支持隐形转发（即转发数据包而不修改 TTL），这对于隐藏防火墙免受 traceroute 等工具探测很有用
options 	PF_DEFAULT_TO_DROP	# 默认丢弃所有数据包，使 pf(4) 的默认规则拒绝所有流量
options 	TCP_BLACKBOX # 启用增强的 TCP 事件日志功能
options 	TCP_HHOOK # 启用 TCP 栈的 hhook(9) 框架钩子
options		SOCKET_HHOOK # 启用套接字操作的 hhook(9) 框架钩子
options 	ROUTE_MPATH # 提供了多路径路由支持
```

* ①：`MROUTING` 将启用内核多播数据包转发功能，可与 mrouted 和 XORP 一起使用。
* ②：`IPFIREWALL` 需要配合程序 `ipfw` 使用。
* ③：`IPFIREWALL_VERBOSE` 会将记录的数据包发送到系统日志。
* ④：`IPFIREWALL_VERBOSE_LIMIT` 限制匹配条目的日志记录次数。

> **警告**：
>
> IPFIREWALL 默认策略为 `deny ip from any to any`，如果在启动时未添加放行访问的规则，可能导致无法远程访问系统。
>
> 建议首次启用此功能时，在 `/etc/rc.conf` 中将 `firewall_type` 设置为 `open`，然后在确认新内核功能正常工作后，再在 `/etc/rc.firewall` 中完善防火墙规则。

* ⑤：`IPFIREWALL_DEFAULT_TO_ACCEPT` 会使默认规则（启动时）放行所有流量。请谨慎使用，如果攻击者能入侵你的防火墙机器，他们可能访问你的受保护机器。但如果只是作为按需过滤特定问题的工具，这可能适合你。将默认策略改为 `allow` 可以避免内核与 /sbin/ipfw 二进制不同步时被卡住。

`IPFIREWALL_PMOD` 支持协议修改模块。目前仅支持 TCP MSS 修改。

> **注意**
>
> `IPFIREWALL_PMOD` 在此处存在问题，原始文档中缺失该条目，可能属于上游文档遗漏。
>
> > **思考题**
> >
> > 读者可能希望进一步研究这里的缺失条目 `IPFIREWALL_PMOD`，请仔细查阅源代码及 [Add ipfw protocol modification module ipfw\_pmod](https://reviews.freebsd.org/D10150) 等相关提及，并提交 PR 到 FreeBSD src。

```ini
options 	MBUF_STRESS_TEST
options 	MBUF_PROFILING
```

`MBUF_STRESS_TEST` 选项用于启用与 mbuf 函数相关的各种随机故障或极端情况测试。可参见：mbuf(9)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/mbuf(9)> 获取可用测试用例列表。

`MBUF_PROFILING` 启用用于分析系统输出 mbuf 链的代码，并通过相应接口返回监控参数的对数直方图（例如数据包大小、浪费空间以及链中 mbuf 的数量）。

```ini
options 	ACCEPT_FILTER_DATA	# 数据连接接收过滤器
options 	ACCEPT_FILTER_DNS	# DNS 请求接收过滤器
options 	ACCEPT_FILTER_HTTP	# HTTP 请求接收过滤器
options		ACCEPT_FILTER_TLS	# TLS 握手接收过滤器
```

这些选项用于启用静态链接的接收过滤器（accept filters）。

```ini
options 	TCP_SIGNATURE		# 支持 RFC 2385
```

`TCP_SIGNATURE` 为 RFC 2385（TCP-MD5）摘要提供了支持。这些摘要通过 TCP 选项 19 携带。该选项通常用于保护 TCP 会话（例如 BGP），适用于无法或不希望使用 IPsec 的情况。

此功能可以按套接字启用，通过 TCP\_MD5SIG 套接字选项实现。

启用此功能需要使用 `device crypto`，并且需要启用 `options IPSEC` 或 `options IPSEC_SUPPORT`。

```ini
options 	DUMMYNET
```

`DUMMYNET` 将启用带宽限制器“dummynet”。此功能还需要 `IPFIREWALL`。更多信息请参见：dummynet(4)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/dummynet(4)> 和 ipfw(8)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?ipfw(8)>。在运行 DUMMYNET 时，HZ/kern.hz 应至少为 1000，以确保响应足够及时。

```ini
options 	DEBUGNET
```

`DEBUGNET` 选项将启用基础调试/内核 panic 时的网络 API。NETDUMP 和 NETGDB 需要使用 `DEBUGNET`。

```ini
options 	NETDUMP
```

`NETDUMP` 选项将在内核中启用对 [netdump(4)](https://man.freebsd.org/netdump\(4\)) 客户端支持。它可在内核 panic 时将内核转储发送到远程主机。

```ini
options 	NETGDB
```

`NETGDB` 选项在内核中启用对 [netgdb(4)](https://man.freebsd.org/cgi/man.cgi?query=netgdb\&sektion=4\&format=html) 的支持。它能通过网络将 panic 的内核作为 GDB 远程调试目标。

## 文件系统

只有根文件系统需要静态编译或预先加载为模块；其他文件系统可在挂载时自动加载。不过，有些人也倾向于静态编译其他文件系统。

> **注意**
>
> UNION 文件系统曾存在缺陷。现在得到了积极维护，尽管仍有一些问题需要解决。

```ini
options 	FFS			# 快速文件系统（Fast Filesystem），即 UFS
options 	NFSCL			# 网络文件系统客户端（NFS client）
```

以上选项中至少需要选择一项。

```ini
options 	AUTOFS			# 自动挂载文件系统
options 	CD9660			# ISO 9660 文件系统
options 	FDESCFS			# 文件描述符文件系统
options 	FUSEFS			# FUSEFS 支持模块
options 	MSDOSFS			# MS DOS 文件系统（FAT、FAT32）
options 	NFSLOCKD		# 网络锁管理器
options 	NFSD			# 网络文件系统服务器
options 	KGSSAPI			# 内核 GSSAPI 实现

options 	NULLFS			# NULL 文件系统
options 	PROCFS			# 进程文件系统（需要 PSEUDOFS）
options 	PSEUDOFS		# 虚拟文件系统框架
options 	PSEUDOFS_TRACE		# PSEUDOFS 调试支持
options 	SMBFS			# SMB/CIFS 文件系统
options 	TMPFS			# 高效内存文件系统
options 	UDF			# 通用光盘格式（Universal Disk Format）
options 	UNIONFS			# Union 文件系统
```

以上选项，均为可选。

```ini
options 	NFS_ROOT
```

将 NFS 用作根文件系统（root device）的支持。

```ini
options 	SOFTUPDATES
```

软更新（Soft Updates）是一种用于提高文件系统性能并降低因突然关机导致数据不一致风险的技术。

```ini
options 	UFS_EXTATTR # ①
options 	UFS_EXTATTR_AUTOSTART # ②
```

UFS 扩展属性（Extended Attributes）可将附加数据与文件关联，用于 ACL、Capabilities 和 MAC 标签。更多信息请参见 `src/sys/ufs/ufs/README.extattr`。

* ①：`UFS_EXTATTR`：扩展属性可将附加的任意元数据与文件和目录关联，这些元数据既可以从用户态分配和读取，也可以在内核内部操作；参见 extattrctl(8)。
* ②：如果定义了选项 `UFS_EXTATTR_AUTOSTART`，UFS 会在挂载操作期间搜索文件系统根目录下的 `.attribute` 子目录。如果找到了该目录，将自动为该文件系统启用扩展属性支持。

参见：ffs(7)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?ffs(7)>。

```ini
options 	UFS_ACL
```

对 UFS 文件系统的访问控制列表（ACL）的支持。当前的 ACL 实现依赖底层文件系统的扩展属性支持（UFS\_EXTATTR）。更多信息请参见 `src/sys/ufs/ufs/README.acls`。

```ini
options 	UFS_DIRHASH
```

UFS 目录哈希（Directory Hashing）可通过消耗一些内存来提高对非常大目录的操作速度。

```ini
options 	UFS_GJOURNAL
```

基于 [gjournal(8)](https://man.freebsd.org/gjournal\(8\)) 的 UFS 日志支持。

```ini
options 	MD_ROOT_SIZE=10
```

在内核中为基于 md 设备的根文件系统预留空间。此处定义的是为文件系统预留的千字节（KB）数。

该定义现为可选项。

* 若未定义，通过 `MFS_IMAGE` 编译选项传入的根文件系统将在链接阶段自动嵌入内核，其实际大小将完全占用内核空间。
* 若已定义，则会采用旧版内核嵌入文件系统的方式：即先在内核中分配 `MD_ROOT_SIZE` 千字节（KB）的固定空间，后续若通过 `MFS_IMAGE` 编译选项传入的文件系统镜像尺寸匹配，将通过 `dd` 命令将其写入预留区域。

```ini
options 	MD_ROOT
```

将 md 设备配置为潜在根设备，支持预加载的 mfs\_root 和 md\_root 类型镜像。

```ini
options 	MD_ROOT_READONLY
```

对该 md 根设备启用写保护，以防止其被以可写的方式进行挂载。

```ini
options 	MD_ROOT_MEM
```

允许从外部内存区域读取 md 镜像。

```ini
options 	QUOTA			# 启用磁盘配额
```

启用此选项即可支持磁盘配额功能。

```ini
options 	SUIDDIR
```

若你的设备是仅作为面向 PC 和 Mac 用户的文件服务器（使用 Samba 服务），建议启用此选项，并在支持挂载选项 `suiddir` 的文件系统上设置用户目录。该设置会使新建文件自动继承目录的属主权限（类似于群组权限）。

> **注意**
>
> 若允许这些用户执行程序，将存在安全风险，因此请仅限在纯文件服务器环境中使用（此举可有效避免诸多管理难题）。root 用户拥有的目录不受此限制，且执行权限位会被自动清除。

> **注意**
>
> 必须同时为目录设置权限位 `suid` （详见 chmod(1) 手册）。由于 PC 用户无法查看/设置文件属主，常导致权限冲突。在启用此功能后，相关文件系统会符合用户直觉——“既然是我的目录，那么创建的文件自然归我所有”，从而显著减少技术支持需求。

```ini
options 	NFS_MINATTRTIMO=3	# VREG 属性缓存超时时间（秒）
options 	NFS_MAXATTRTIMO=60
options 	NFS_MINDIRATTRTIMO=30	# VDIR 属性缓存超时时间（秒）
options 	NFS_MAXDIRATTRTIMO=60
options 	NFS_DEBUG		# 启用 NFS 调试
```

若干 NFS 选项。

```ini
options 	EXT2FS
```

新增对 Linux 文件系统 EXT2 的支持。

使用此功能需格外谨慎—— ext2 的代码往往滞后于内核更新且缺乏充分测试，因此以读写模式挂载可能存在风险（哪怕以只读模式挂载也可能导致系统崩溃）。

```ini
device		mem
```

系统内存设备：`/dev/mem`、`/dev/kmem`

```ini
device		ksyms
```

内核符号表设备：`/dev/ksyms`。

```ini
options 	CD9660_ICONV
options 	MSDOSFS_ICONV
options 	UDF_ICONV
```

可选的字符编码转换支持，需配合 `LIBICONV` 实现。每个选项都需要其基础文件系统及 `LIBICONV` 库的支持。

## POSIX P1003.1B

POSIX P1003.1B 是 POSIX 标准的实时扩展，提供了优先级调度、信号量、消息队列等功能。以下是相关的内核配置选项。

```ini
options 	_KPOSIX_PRIORITY_SCHEDULING
```

1993 年 POSIX 标准新增的实时扩展 `_KPOSIX_PRIORITY_SCHEDULING` 提供了对 `_POSIX_PRIORITY_SCHEDULING` 的支持。

```ini
options 	P1003_1B_SEMAPHORES
```

`p1003_1b_semaphores` 功能仍处于高度实验阶段，若出现问题，用户需协助参与调试工作。

```ini
options 	P1003_1B_MQUEUE
```

POSIX 消息队列。

## 安全策略参数

安全策略参数提供了系统安全相关的内核配置，包括审计、强制访问控制等功能。以下是相关的内核配置选项。

```ini
options 	AUDIT
```

BSM 审计。

```ini
options 	MAC
options 	MAC_BIBA
options 	MAC_BSDEXTENDED
options 	MAC_DDB
options 	MAC_DO
options 	MAC_IFOFF
options 	MAC_IPACL
options 	MAC_LOMAC
options 	MAC_MLS
options 	MAC_NONE
options 	MAC_NTPD
options 	MAC_PARTITION
options 	MAC_PORTACL
options 	MAC_PRIORITY
options 	MAC_SEEOTHERUIDS
options 	MAC_STUB
options 	MAC_TEST
options 	MAC_VERIEXEC
options 	MAC_VERIEXEC_SHA1
options 	MAC_VERIEXEC_SHA256
options 	MAC_VERIEXEC_SHA384
options 	MAC_VERIEXEC_SHA512
device		mac_veriexec_parser
```

强制访问控制（MAC）。

```ini
options 	CAPABILITIES	# 文件描述符的细粒度权限控制
options 	CAPABILITY_MODE	# 沙盒环境（无法访问全局命名空间）
```

Capsicum 技术。

## 时钟

时钟选项用于配置内核的时钟频率和时间同步相关功能。以下是相关的内核配置选项。

```ini
options 	HZ=100
```

操作粒度由内核选项 `HZ` 控制（默认频率为 1000 Hz，即调度间隔周期为 1 毫秒）。

虚拟机客户系统通常采用数值 `100`。较低的数值可能会以调度精度为代价来降低系统开销，但自适应定时器代码能减少这种开销。

```ini
options 	PPS_SYNC
```

启用内核 PLL 以使用外部 PPS 信号的功能，该功能在 \[x]ntpd(8) 的监管下运行。更多信息请参阅 ntpd 文档：<http://www.eecis.udel.edu/~ntp>

```ini
options 	FFCLOCK
```

启用内核中对通用前馈时钟的支持。前馈时钟支持是面向反馈的 ntpd/系统时钟方法的替代方案，需与前馈同步算法（例如 RADclock）配合使用。更多信息请参阅：<http://www.synclab.org/radclock>

## SCSI 设备

SCSI（Small Computer System Interface）是一种用于连接计算机和外部设备的标准接口。以下是与 SCSI 设备相关的内核配置选项。

```ini
envvar		hint.scbus.0.at="ahc0"
envvar		hint.scbus.1.at="ahc1"
envvar		hint.scbus.1.bus="0"
envvar		hint.scbus.3.at="ahc2"
envvar		hint.scbus.3.bus="0"
envvar		hint.scbus.2.at="ahc2"
envvar		hint.scbus.2.bus="1"
envvar		hint.da.0.at="scbus0"
envvar		hint.da.0.target="0"
envvar		hint.da.0.unit="0"
envvar		hint.da.1.at="scbus3"
envvar		hint.da.1.target="1"
envvar		hint.da.2.at="scbus2"
envvar		hint.da.2.target="3"
envvar		hint.sa.1.at="scbus1"
envvar		hint.sa.1.target="6"
```

SCSI 设备配置。

SCSI 子系统由 SCSI 核心代码、多个高层 SCSI 设备“类型”驱动程序，以及底层主机适配器设备驱动程序组成。主机适配器列表请参阅下文中的 ISA 和 PCI 设备配置章节。

系统可固定 SCSI 设备配置，确保特定总线、目标和 LUN 始终对应同一设备单元。在早期版本中，设备单元号按照 SCSI 总线上探测到的顺序分配。这意味着如果移除某磁盘驱动器，可能需要重写文件 `/etc/fstab`；同时在新增磁盘时也需谨慎，因为新设备可能会被提前探测，从而改变原有设备的配置。

系统默认保持此传统行为。设备单元分配将从该设备类型首个非固定单元开始。例如，若将某磁盘固定为 `da3`，则首个非固定磁盘将被分配为 `da4`。

设备固定配置的语法如上所述。

```ini
device		scbus		# SCSI 核心代码
device		ch		# SCSI 介质转换器
device		da		# SCSI 直接存取（“磁盘”）与光学介质（“WORM”）设备
device		sa		# SCSI 磁带
device		cd		# SCSI 只读直接存取（“光盘”）
device		ses		# 机箱服务（SES 与 SAF-TE）
device		pt		# SCSI 处理器
device		targ		# SCSI 目标模式代码
device		targbh		# SCSI 目标模式黑洞设备
device		pass		# CAM 直通驱动
device		sg		# Linux SCSI 直通
device		ctl		# CAM 目标层
```

未明确指定“单元”（SCSI 逻辑单元号）的设备将默认按 LUN 0 处理。

所有 SCSI 设备会根据实际需求分配相应数量的单元。

* `ch` 驱动程序用于驱动 SCSI 介质转换器（“自动光盘机”）设备。
* `da` 驱动程序用于驱动 SCSI 直接存取（“磁盘”）与光学介质（“WORM”）设备。
* `sa` 驱动程序用于驱动 SCSI 顺序存取（“磁带”）设备。
* `cd` 驱动程序用于驱动 SCSI 只读直接存取（“光盘”）设备。
* `ses` 驱动程序用于驱动 SCSI 环境服务（“ses”）及 SAF-TE（“SCSI 可访问容错机箱”）设备。
* `pt` 驱动程序用于驱动 SCSI 处理器设备。
* `sg` 驱动程序提供与 Linux SG 驱动兼容的直通 API，可与 Linux 模拟器协同运行 Linux SG 应用程序，也可独立运行为应用移植至 FreeBSD 提供源代码级 API 兼容性。

目标模式支持在此部分实现，但仍需 SIM（SCSI 主机适配器驱动程序）提供相应支持。

* `targ` 驱动程序以处理器类型设备的形式提供了目标模式支持，其存在旨在提供响应查询命令所需的最小上下文环境。`/usr/share/examples/scsi_target` 目录下提供了展示其余命令支持实现方式的用户应用程序示例。
* `targbh` 驱动程序提供了目标模式支持，专门用于响应未分配逻辑单元的传入命令。
* `pass` 驱动程序提供了访问 CAM 子系统的直通 API。

## CAM

CAM, Common Access Method storage subsystem（通用访问方法存储子系统），参见：cam(4)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?query=CAM&sektion=4&n=1>。

### CAM 调试相关

以下是与 CAM 调试相关的内核配置选项。

```ini
options 	CAMDEBUG
```

启用并编译所有调试功能。

```ini
options 	CAM_DEBUG_COMPILE=-1
```

指定要编译进内核的调试等级。

```ini
options 	CAM_DEBUG_FLAGS=(CAM_DEBUG_INFO|CAM_DEBUG_PROBE|CAM_DEBUG_PERIPH)
```

指定在系统启动时启用的调试等级。

```ini
options 	CAM_DEBUG_BUS=-1
```

将调试限制在指定的总线（bus）上。

```ini
options 	CAM_DEBUG_TARGET=-1
```

将调试限制在指定的目标（target）上。

```ini
options 	CAM_DEBUG_LUN=-1
```

将调试限制在指定的 LUN 上。

```ini
options 	CAM_DEBUG_DELAY=1
```

在打印每一行调试信息后延迟的时间（微秒）。

```ini
options 	CAM_MAX_HIGHPOWER=4
```

并发执行的高功率（START UNIT）命令的最大数量。

```ini
options 	SCSI_NO_SENSE_STRINGS
```

定义该选项后将禁用 sense 描述字符串。

```ini
options 	SCSI_NO_OP_STRINGS
```

定义该选项后将禁用 opcode 描述字符串。

```ini
options 	SCSI_DELAY=5000	# 对 Joe SCSI 设备持保守态度
```

`SCSI_DELAY`: 在总线重置后冻结 SIM（SCSI 适配器）队列的毫秒数，以及在总线设备重置后冻结设备队列的毫秒数。可通过可调参数 sysctl `kern.cam.scsi_delay` 在启动时和运行时更改该值。

```ini
options 	CAM_IOSCHED_DYNAMIC
```

根据提示和存储设备的当前性能，在 I/O 调度器中启用动态决策功能。

```ini
options 	CAM_IO_STATS
```

通过 sysctl 显示额外的 CAM 设备统计数据。

```ini
options 	CAM_TEST_FAILURE
```

启用模拟 I/O 故障的功能。

### CAM CD-ROM 只读直接访问（“光盘”）设备

以下是与 CD-ROM 设备相关的内核配置选项。

```ini
options 	CHANGER_MIN_BUSY_SECONDS=2
```

为 changer LUN 保证的最小服务时间片。

该变量编译默认值为 2 秒。可通过 sysctl `kern.cam.cd.changer.min_busy_seconds` 进行调整。

```ini
options 	CHANGER_MAX_BUSY_SECONDS=10
```

每个 changer LUN 的最大时间片，仅在有 I/O 等待其他 LUN 时生效。

该变量编译默认值为 10 秒。可通过 sysctl `kern.cam.cd.changer.max_busy_seconds` 进行调整。

### CAM 顺序访问（“磁带”）设备驱动

以下是与磁带设备相关的内核配置选项。

```ini
options 	SA_IO_TIMEOUT=4
```

读/写/WFM 操作的超时时间，单位为分钟。

```ini
options 	SA_SPACE_TIMEOUT=60
```

空间操作的超时时间，单位为分钟。

```ini
options 	SA_REWIND_TIMEOUT=(2*60)
```

回带操作的超时时间，单位为分钟。

```ini
options 	SA_ERASE_TIMEOUT=(4*60)
```

擦除操作的超时时间，单位为分钟。

```ini
options 	SA_1FM_AT_EOD
```

默认用于仅在磁带末端（EOT）存在单个文件标记的设备型号。

### CAM 处理器目标（PT）设备

以下是与处理器目标设备相关的内核配置选项。

```ini
options 	SCSI_PT_DEFAULT_TIMEOUT=60
```

CAM 处理器目标（pt）设备的超时时间（可选），单位为秒。默认值为 60 秒。

### 在其他设备（例如磁盘）上进行 SES 直通访问

以下是与 SES 直通访问相关的内核配置选项。

```ini
options 	SES_ENABLE_PASSTHROUGH
```

通常默认禁用此功能，因为许多新型 SCSI 磁盘会报告自身具备 SES（SCSI Enclosure Services）功能，这可能在构建拓扑时与磁盘所在机箱的 SES 设备产生冲突。

### iSCSI

iSCSI 是一种通过网络连接访问 SCSI 设备的协议。以下是相关的内核配置选项。

```ini
device		cfiscsi		# CAM 目标层 iSCSI target 前端
device		iscsi		# iSCSI initiator 发起端
device		iser		# iSCSI RDMA 扩展（iSER）发起端
```

iSCSI 可通过网络连接（例如 TCP/IP 套接字）访问 SCSI 外设。

## 杂项设备和选项

以下是其他各类杂项设备和内核配置选项。

```ini
device		pty
```

兼容 BSD 风格的伪终端（pty）。

```ini
device		nmdm
```

背靠背（back-to-back）tty 设备。

```ini
device		md
```

基于内存（通过 malloc 分配）的磁盘设备。

```ini
device		snp
```

Snoop 设备，用于监视 pty、vty 等终端设备。

```ini
device		ccd
```

级联磁盘（Concatenated Disk）驱动程序。

```ini
device		firmware
```

[firmware(9)](https://man.freebsd.org/firmware\(9\)) 支持，firmware 映像的加载与管理。

```ini
options 	LIBICONV
```

内核端 iconv 库，参见：iconv(3)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?query=iconv&sektion=3>。

```ini
options 	MSGBUF_SIZE=40960
```

内核消息缓冲区的大小。应为 **N × pagesize（内存页大小）**。

## 硬件总线配置

硬件总线配置用于设置系统与硬件设备之间的通信接口。以下是相关的内核配置选项。

```ini
device		pci
options 	PCI_HP			# PCIe 原生热插拔
options 	PCI_IOV			# PCI SR-IOV 支持
```

PCI 总线及其相关选项。

## 硬件设备配置

对于 ISA 总线，所需的提示已列出。PCI、CardBus 和 SD/MMC 是自识别总线，因此不需要提示。

### 必需设备

以下是系统运行所需的基本设备配置选项。

```ini
options 	KBD_DISABLE_KEYMAP_LOAD	# 拒绝加载键盘布局
options 	KBD_INSTALL_CDEV	# 在 /dev 中生成 CDEV 条目
```

这些选项同样适用于其他键盘驱动程序。

```ini
options 	KBD_DELAY1=200		# 定义初始按键延迟
options 	KBD_DELAY2=15		# 定义按键延迟
```

定义键盘延迟参数（对于响应迅速的交互式控制台，可尝试 `200` 和 `15`）。

```ini
device		kbdmux			# 键盘多路复用器
options 	KBDMUX_DFLT_KEYMAP	# 指定内置键盘布局
makeoptions	KBDMUX_DFLT_KEYMAP=it.iso  # 设置默认键盘布局为意大利语 ISO 布局
```

```ini
options 	FB_DEBUG
```

帧缓冲调试。

```ini
options 	TEKEN_CONS25		# cons25 风格终端仿真
options 	TEKEN_UTF8		# UTF-8 输出处理
```

启用 syscons 终端仿真器（teken）的实验性功能支持。

```ini
device		vt
options 	VT_ALT_TO_ESC_HACK=1	# 在 ALT 键前添加 ESC 序列
options 	VT_MAXWINDOWS=16	# 虚拟控制台数量
options 	VT_TWOBUTTON_MOUSE	# 使用右键粘贴
```

vt 视频控制台驱动程序。

```ini
options 	VT_FB_MAX_HEIGHT=480  # 高度
options 	VT_FB_MAX_WIDTH=640  # 宽度
```

以上选项用于设置最大帧缓冲区大小。

```ini
options 	TERMINAL_NORM_ATTR=(FG_GREEN|BG_BLACK)  # 设置普通终端文本的颜色：前景色为绿色，背景色为黑色
options 	TERMINAL_KERN_ATTR=(FG_LIGHTRED|BG_BLACK)  # 设置内核消息文本的颜色：前景色为亮红色，背景色为黑色
```

以上选项用于自定义默认 vt 终端的颜色。

### 可选设备

以下是各类可选的硬件设备驱动程序配置选项。

#### SCSI 主机适配器

```ini
device		aacraid
```

PMC 的 Adaptec RAID 控制器，支持第 6、7、8 系列及后续型号。该驱动使用 CAM 容器接口。

```ini
device		ahc
```

Adaptec 274x、284x、2910、293x、294x、394x、3950x、3960x、398x、4944、19160x、29160x 以及 aic7770/aic78xx 系列。

```ini
device		ahd
```

Adaptec 29320/39320 控制器

```ini
device		isp
```

* Qlogic ISP 1020、1040 和 1040B PCI SCSI 主机适配器
* ISP 1240 双 Ultra SCSI，ISP 1080 和 1280（双）Ultra2
* ISP 12160 Ultra3 SCSI
* Qlogic ISP 2100 和 ISP 2200 1Gb 光纤通道主机适配器
* Qlogic ISP 2300 和 ISP 2312 2Gb 光纤通道主机适配器
* Qlogic ISP 2322 和 ISP 6322 2Gb 光纤通道主机适配器

```ini
envvar		hint.isp.0.disable="1"
envvar		hint.isp.0.role="3"
envvar		hint.isp.0.prefer_iomap="1"
envvar		hint.isp.0.prefer_memmap="1"
envvar		hint.isp.0.fwload_disable="1"
envvar		hint.isp.0.ignore_nvram="1"
envvar		hint.isp.0.fullduplex="1"
envvar		hint.isp.0.topology="lport"
envvar		hint.isp.0.topology="nport"
envvar		hint.isp.0.topology="lport-only"
envvar		hint.isp.0.topology="nport-only"
```

isp 相关的 hint 参数说明。

```ini
envvar		hint.isp.0.portwnn="w50000000aaaa0000"
envvar		hint.isp.0.nodewnn="w50000000aaaa0001"
```

isp 相关 hint。

由于无法获取 `u_int64_t` 类型的值，也无法解析以 `0x` 开头的字符串，因此采用了该变通方法。

```ini
device		ispfw
```

Qlogic 主机适配器的固件模块。

```ini
#device		mpi3mr
```

第 4 代 LSI-Logic MPT/Fusion（仅适用于 aarch64 和 amd64）。

```ini
device		mpr
```

第 3 代 LSI-Logic MPT/Fusion（仅适用于 aarch64 和 amd64）。

```ini
device		mps
```

第 2 代 LSI-Logic MPT/Fusion（仅适用于 aarch64 和 amd64）。

```ini
device		mpt
```

LSI-Logic MPT/Fusion 53c1020、53c1030 Ultra4、FC9x9 光纤通道主机适配器。

```ini
device		sym
```

Symbios/Logic 53C8XX 系列 PCI-SCSI I/O 处理器（仅适用于 aarch64 和 amd64）：

* 53C810
* 53C810A
* 53C815
* 53C825
* 53C825A
* 53C860
* 53C875
* 53C876
* 53C885
* 53C895
* 53C895A
* 53C896
* 53C897
* 53C1510D
* 53C1010-33
* 53C1010-66

```ini
options 	AHC_ALLOW_MEMIO
```

只有在设置了此选项时，aic7xxx 驱动程序才会尝试对所有配置了内存映射 I/O 的 PCI 控制器使用内存映射 I/O。不幸的是，这在某些主板上无法工作，因此不能作为默认设置。

```ini
options 	AHC_DUMP_EEPROM
```

转储 ahc 控制器配置 PROM 的内容。

```ini
options 	AHC_TMODE_ENABLE
```

启用 [ahc(4)](https://man.freebsd.org/cgi/man.cgi?query=ahc\&sektion=4) 的 target mode 操作单元位图。

```ini
options 	AHC_DEBUG
```

编译 Aic7xxx 调试代码。

```ini
options 	AHC_DEBUG_OPTS
```

Aic7xxx 驱动调试选项。参见：sys/dev/aic7xxx/aic7xxx.h\[EB/OL]. \[2026-03-26]. <https://github.com/freebsd/freebsd-src/blob/main/sys/dev/aic7xxx/aic7xxx.h>。

```ini
options 	AHC_REG_PRETTY_PRINT
```

在调试输出中打印寄存器位字段。会使驱动增加约 128 KB 的大小。参见：ahc(4)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?query=ahc&sektion=4>。

```ini
options 	AHD_DEBUG
```

编译 aic79xx 调试代码。

```ini
options 	AHD_DEBUG_OPTS=0xFFFFFFFF
```

Aic79xx 驱动调试选项。会使驱动增加约 215 KB。参见：ahd(4)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/ahd(4)>。

```ini
options 	AHD_REG_PRETTY_PRINT
```

在调试时打印可读的寄存器定义。

```ini
options 	AHD_TMODE_ENABLE
```

启用 [ahd(4)](https://man.freebsd.org/ahd\(4\)) 的 target mode 操作单元位图。

#### `dev/isp/`（Qlogic SCSI/FC 驱动）相关

以下是与 Qlogic ISP 驱动相关的内核配置选项。

```ini
options 	ISP_TARGET_MODE=1
```

`ISP_TARGET_MODE` 可启用 [isp(4)](https://man.freebsd.org/cgi/man.cgi?isp\(4\)) target mode 操作。

```ini
options 	ISP_DEFAULT_ROLES=0
```

`ISP_DEFAULT_ROLES`：默认角色。

* none = 0
* target = 1
* initiator = 2
* both = 3（当前不支持）

```ini
#	ISP_INTERNAL_TARGET		（用于测试的简单内部磁盘 target）
```

> **注意**
>
> 此项在原文中即如此，不确定是否为一 options。请读者自行研究。

```ini
#options 	SYM_SETUP_SCSI_DIFF
```

对 825A、875、885 的 HVD 支持。

禁用：0（默认）；启用：1。

```ini
#options 	SYM_SETUP_PCI_PARITY
```

PCI 奇偶校验检查。

禁用：0；启用：1（默认）。

```ini
#options 	SYM_SETUP_MAX_LUN
```

支持的 LUN 数量。

默认：8，范围：1-64。

```ini
device		ciss
```

Compaq“CISS”RAID 控制器（SmartRAID 5\* 系列）。

这些控制器提供类 SCSI 接口，并依赖 CAM 基础架构。

```ini
device		ida		# Compaq Smart RAID
device		mlx		# Mylex DAC960
device		mfi		# LSI MegaRAID SAS
device		mfip		# LSI MegaRAID SAS 直通，需要 CAM
options 	MFI_DEBUG
device		mrsas		# LSI/Avago MegaRAID SAS/SATA，6Gb/s 和 12Gb/s
```

Compaq Smart RAID、Mylex DAC960 和 AMI MegaRAID 控制器。

仅需添加相关条目；代码可自动发现并配置其支持的所有控制器。

#### NVMe

NVMe 是一种专为闪存存储设计的接口协议。以下是相关的内核配置选项。

```ini
device		nvme		# PCIe NVMe 主机驱动/主机控制器
options 	NVME_USE_NVD=1	# 使用 nvd(4) 而非 CAM 的 nda(4) 驱动
device		nvmf		# NVMeoF 主机驱动/NVMeoF 主机
device		nvmft		# NVMeoF ctl(4) 前端 / NVMeoF CAM 目标层前端
device		nvmf_tcp	# NVMeoF TCP 传输
device		nda		# NVMe 直接访问设备（即磁盘）
device		nvd		# 非 CAM 的 NVMe 磁盘驱动。将 NVMe 命名空间作为磁盘暴露，依赖 nvme
```

#### 串行 ATA（SATA）主机控制器

SATA 是一种用于连接存储设备的接口标准。以下是相关的内核配置选项。

```ini
device		ahci		# AHCI 兼容 SATA 控制器
```

兼容高级主机控制器接口（AHCI）。

```ini
device		mvs
```

Marvell 88SX50XX/88SX60XX/88SX70XX/SoC SATA 控制器。

```ini
device		siis
```

SiliconImage SiI3124/SiI3132/SiI3531 SATA 控制器。

```ini
device		ada
```

ATA/SATA 直接访问设备（即磁盘）。

以上驱动均为 [cam(4)](https://man.freebsd.org/cam\(4\)) 子系统的一部分。

它们取代了功能较少的 [ata(4)](https://man.freebsd.org/cgi/man.cgi?ata\(4\)) 子系统驱动，并支持相同的硬件。

***

```ini
device		ata		# 传统 ATA/SATA 控制器
```

`ATA` 驱动支持所有传统的 ATA/ATAPI 控制器，包括 PC 卡设备。

在现代机器上，你只需添加 `device ata` 这行，即可让系统发现所有 PCI 和 PC 卡 ATA/ATAPI 设备。

还可以通过使用 `atacore` 驱动，然后再按厂商判断各个总线和芯片组驱动来选择单独的驱动。例如，要构建一个仅支持 VIA 芯片组的系统，可以省略 `ata` 这行，仅包含驱动 `atacore`、`atapci` 和 `atavia`。

```ini
#device		atacore		# ATA 核心功能
#device		ataisa		# ISA 总线支持
#device		atapci		# PCI 总线支持；仅支持通用芯片组
```

模块化 ATA 驱动。

```ini
#device		ataacard	# ACARD
#device		ataacerlabs	# Acer Labs Inc. (ALI)
#device		ataamd		# Advanced Micro Devices (AMD)
#device		ataati		# ATI
#device		atacenatek	# Cenatek
#device		atacypress	# Cypress
#device		atacyrix	# Cyrix
#device		atahighpoint	# HighPoint
#device		ataintel	# Intel
#device		ataite		# Integrated Technology Inc. (ITE)
#device		atajmicron	# JMicron
#device		atamarvell	# Marvell
#device		atamicron	# Micron
#device		atanational	# National
#device		atanetcell	# NetCell
#device		atanvidia	# nVidia
#device		atapromise	# Promise
#device		ataserverworks	# ServerWorks
#device		atasiliconimage	# Silicon Image Inc. (SiI)（原 CMD）
#device		atasis		# Silicon Integrated Systems Corp. (SiS)
#device		atavia		# VIA Technologies Inc.
```

PCI ATA 芯片组。

```ini
envvar		hint.ata.0.at="isa"
envvar		hint.ata.0.port="0x1f0"
envvar		hint.ata.0.irq="14"
envvar		hint.ata.1.at="isa"
envvar		hint.ata.1.port="0x170"
envvar		hint.ata.1.irq="15"
```

对于较旧的非 PCI、非 PnP BIOS 系统，需要添加这些 hint 行。

#### 串行接口（uart）

串行接口提供了系统与外部设备之间的串行通信能力。以下是相关的内核配置选项。

```ini
device		uart
```

[uart(4)](https://man.freebsd.org/uart\(4\)) 串行接口通用驱动程序。

```ini
options 	UART_PPS_ON_CTS		# 使用 CTS 而非 DCD 捕获时间脉冲
options 	UART_POLL_FREQ		# 设置轮询频率，当硬件不支持中断时使用（默认 50 Hz）
```

[uart(4)](https://man.freebsd.org/uart\(4\)) 驱动选项。

```ini
envvar		hint.uart.0.at="isa"
```

该 hint 仅应对纯 ISA 设备使用，其他情况下不需要，且极不建议使用。

```ini
envvar		hint.uart.0.port="0x3f8"
envvar		hint.uart.0.flags="0x10"
envvar		hint.uart.0.baud="115200"
```

以上三个 hint：当 UART 是系统设备（例如控制台或调试端口），又仅在平台上没有其他方式将信息传递给内核时使用。hint 的单元号（即 `0`）仅用于将 hint 组合在一起，与探测到的 UART 的单元号无关。

`flags` 用于支持控制台的串行驱动，例如 [uart(4)](https://man.freebsd.org/uart\(4\))：

* 0x10：为该单元启用控制台支持。其他控制台标志（如适用）在未设置此标志时会被忽略。启用控制台支持并不意味着该单元是首选控制台。可以通过启动时使用 `-h`，或在 loader 中设置 `boot_serial=YES` 来启用。当前最多仅一个单元可以启用控制台支持；配置文件中第一个设置了该标志的单元为首选。
* `0x80`：在 ddb 中将该端口用于串行线路 gdb 支持，也称为调试端口。

```ini
options 	BREAK_TO_DEBUGGER
```

串行驱动支持控制台的选项：

`BREAK_TO_DEBUGGER`：控制台上的 BREAK/DBG 会进入 ddb（如果可用）

```ini
options 	ALT_BREAK_TO_DEBUGGER
```

Solaris 实现了一种新的 BREAK，由字符序列 `CR ~ ^b`（先按 **回车键**，然后按 `~`，再按快捷键 **Ctrl** + **B**。以下类似）触发，类似于 Sun 服务器上远程控制台使用的常见模式。

FreeBSD 对此进行了增补：`CR ~ ^p` 会触发强制 panic，`CR ~ ^r` 会触发干净重启。

```ini
device		scc
```

串行通信控制器。

支持 Freescale/NXP Quad Integrated 以及 Zilog Z8530 多通道通信控制器。

```ini
device		puc
```

PCI 通用通信驱动。

支持各种多端口 PCI I/O 卡。

#### 网络接口

以下是各类网络接口设备驱动程序配置选项。

**MII 总线**

```ini
device  	mii		# 最小 MII 支持
device  	mii_bitbang	# 通用模块，用于 bit-bang 操作 MII
device  	miibus		# 支持 MII，带 bit-bang 和所有 PHY
```

MII 总线是许多 PCI 以太网卡所必需的，尤其是那些使用 MII 兼容收发器或实现类似 MII 的收发器控制接口的网卡。

在内核配置中添加 `device miibus` 可引入对通用 miibus API 的支持、对 MII 的 bit-bang 通用支持以及所有 PHY 驱动，含为未被单独驱动专门处理的 PHY 提供的通用驱动。

如果网卡驱动需要特定 PHY 的支持，可以通过添加 `device mii`、`device mii_bitbang`，然后再添加相应的 PHY 驱动来实现。

```ini
device  	acphy		# Altima Communications AC101
device  	amphy		# AMD AM79c873 / Davicom DM910{1,2}
device  	atphy		# Attansic/Atheros F1
device  	axphy		# Asix Semiconductor AX88x9x
device  	bmtphy		# Broadcom BCM5201/BCM5202 和 3Com 3c905C
```

```ini
device		bnxt		# Broadcom NetXtreme-C/NetXtreme-E
```

该驱动基于通用 MII 总线控制器代码。`bnxt` 支持 Broadcom NetXtreme-C 和 NetXtreme-E PCIe 10/25/50G 以太网适配器。

```ini
device  	brgphy		# Broadcom BCM54xx/57xx 1000baseTX
device  	cgem		# Cadence GEM 千兆以太网
device  	ciphy		# Cicada/Vitesse CS/VSC8xxx
device  	e1000phy	# Marvell 88E1000 1000/100/10-BT
device  	gentbi		# 通用 10-bit 1000BASE-{LX,SX} 光纤接口
device  	icsphy		# ICS ICS1889-1893
device  	ip1000phy	# IC Plus IP1000A/IP1001
device  	jmphy		# JMicron JMP211/JMP202
device  	lxtphy		# Level One LXT-970
device  	nsgphy		# NatSemi DP8361/DP83865/DP83891
device  	nsphy		# NatSemi DP83840A
device  	nsphyter	# NatSemi DP83843/DP83815
device  	pnaphy		# HomePNA
device  	qsphy		# Quality Semiconductor QS6612
device  	rdcphy		# RDC Semiconductor R6040
device  	rgephy		# Realtek 8169S/8110S/8211B/8211C
device  	rlphy		# Realtek 8139
device  	rlswitch	# Realtek 8305
device  	smcphy		# SMSC LAN91C111
device  	tdkphy		# TDK 89Q2120
device  	truephy		# LSI TruePHY
device		xmphy		# XaQti XMAC II
```

**基于通用 MII 总线控制器代码的 PCI 以太网卡**

> **提示**
>
> `bxe` Broadcom NetXtreme II (BCM5771X/BCM578XX) PCIe 10Gb 以太网适配器。条目位于 `sys/x86/conf/NOTES`。该 PCI 以太网卡基于通用 MII 总线控制器代码。

```ini
device		ae		# Attansic/Atheros L2 快速以太网
```

支持基于 Attansic/Atheros L2 PCI-Express FastEthernet 控制器的 10/100Mbps 快速以太网适配器。

```ini
device		age		# Attansic/Atheros L1 千兆以太网
```

支持基于 Attansic/Atheros L1 PCIe 千兆以太网控制器的千兆以太网适配器。

```ini
device		alc		# Atheros AR8131/AR8132 以太网
```

支持 Atheros AR8131/AR8132 PCIe 以太网控制器。

```ini
device		ale		# Atheros AR8121/AR8113/AR8114 以太网
```

支持 Atheros AR8121/AR8113/AR8114 PCIe 以太网控制器。

> **注意**
>
> `ath` Atheros a/b/g 无线网卡（需要 `ath_hal` 和 `wlan`）。此条目在其他位置。

```ini
device		bce		# Broadcom BCM5706/BCM5708 千兆以太网
```

Broadcom NetXtreme II（BCM5706/BCM5708）PCI/PCIe 千兆以太网适配器。

```ini
device		bfe		# Broadcom BCM440x 10/100 以太网
```

Broadcom BCM4401 以太网适配器。

```ini
device		bge		# Broadcom BCM570xx 千兆以太网
```

支持基于 Broadcom BCM570x 系列控制器的千兆以太网适配器，包括 3Com 3c996-T、Netgear GA302T、SysKonnect SK-9D21 和 SK-9D41，以及 Dell PowerEdge 2550 服务器上的嵌入式千兆网卡。

```ini
device		cas		# Sun Cassini/Cassini+ 和 NS DP83065 Saturn
```

Sun Cassini/Cassini+ 和 National Semiconductor DP83065 Saturn。

```ini
device		dc		# DEC/Intel 21143 及各种类似型号
```

支持基于 DEC/Intel 21143 及类似芯片的 PCI 快速以太网适配器，包括 ADMtek AL981 Comet、AN985 Centaur、ASIX AX88140A/AX88141、Davicom DM9100/DM9102、Lite-On 82c168/82c169、Lite-On/Macronix LC82C115 PNIC II 及 Macronix 98713/98713A/98715/98715A/98725 PMAC。替代旧的 al、ax、dm、pn 和 mx 驱动。支持品牌示例：Digital DE500-BA、Kingston KNE100TX、D-Link DFE-570TX 等。

```ini
device		et		# Agere ET1310 10/100/千兆以太网
```

```ini
device		fxp		# Intel EtherExpress PRO/100B (82557, 82558)
envvar		hint.fxp.0.prefer_iomap="0"
```

Intel EtherExpress Pro/100B（可以通过 prefer\_iomap 环境变量选择 I/O 访问而非内存映射）。

```ini
device		gem		# Apple GMAC/Sun ERI/Sun GEM
```

Apple GMAC/Sun ERI/Sun GEM.

```ini
device		jme		# JMicron JMC250 千兆/JMC260 快速以太网
```

JMicron JMC260 快速以太网/JMC250 千兆以太网适配器。

```ini
device		lge		# Level 1 LXT1001 千兆以太网
```

支持基于 Level 1 LXT1001 NetCellerator 芯片的 PCI 千兆以太网适配器，包括 D-Link DGE-500SX、SMC TigerCard 1000 (SMC9462SX) 及部分 Addtron 网卡。

```ini
device		lio		# Cavium 23XX 以太网适配器支持
```

`lio`：支持 Cavium 23XX 系列以太网适配器。

```ini
device		mlxfw		# Mellanox 固件更新模块
```

`mlxfw`：Mellanox 固件更新模块。

```ini
device		mlx5		# IB 与以太网共享代码模块
```

Mellanox ConnectX-4 和 ConnectX-4 LX IB 与以太网共享代码模块。

```ini
device		mlx5en		# Mellanox ConnectX-4 和 ConnectX-4 LX
```

Mellanox ConnectX-4 和 ConnectX-4 LX PCIe 以太网适配器。

```ini
device		msk		# Marvell/SysKonnect Yukon II 千兆以太网
```

msk: 支持基于 Marvell/SysKonnect Yukon II 千兆控制器的 PCI 千兆以太网适配器，包括 88E8021、88E8022、88E8061、88E8062、88E8035、88E8036、88E8038、88E8050、88E8052、88E8053、88E8055、88E8056 以及 D-Link 560T/550SX。

```ini
device		my
```

Myson 快速以太网（MTD80X、MTD89X）。

```ini
device		nge		# NatSemi DP83820 千兆以太网
```

支持基于 National Semiconductor DP83820/DP83821 芯片的 PCI 千兆以太网适配器，包括 SMC EZ Card 1000 (SMC9462TX)、D-Link DGE-500T、Asante FriendlyNet GigaNIX 1000TA/1000TPC、Addtron AEG320T、Surecom EP-320G-TX 和 Netgear GA622T。

```ini
device		re		# Realtek 8139C+/8169/8169S/8110S
```

Realtek 8139C+/8169/8169S/8110S/8101E PCI/PCIe 以太网适配器。

```ini
device		rl		# Realtek 8129/8139
```

支持基于 Realtek 8129/8139 芯片的 PCI 快速以太网适配器。该驱动默认使用编程 I/O 访问寄存器，因为内存映射模式在 SMP 硬件上可能导致严重锁死。该驱动还支持 Accton EN1207D“Cheetah”网卡，使用 MPX 5030/5038 芯片（Realtek 或其仿制品）。D-Link DFE-530TX+ 使用 Realtek 芯片，应使用此驱动，而非 `vr` 驱动。

```ini
device		sge		# Silicon Integrated Systems SiS190/191
```

Silicon Integrated Systems SiS190/191 快速/千兆以太网适配器。

```ini
device		sis		# Silicon Integrated Systems SiS 900/SiS 7016
```

支持基于 Silicon Integrated Systems SiS 900/SiS 7016 及 NS DP83815 PCI 快速以太网控制器芯片的网卡。

```ini
device		sk		# SysKonnect SK-984x & SK-982x 千兆以太网
```

支持 SysKonnect SK-984x 系列 PCI 千兆以太网适配器，包括 SK-9841/9842 单端口（单模/多模光纤）及 SK-9843/9844 双端口（单模/多模）。驱动会自动检测网卡端口数量并将每个端口作为独立网络接口。

```ini
device		ste		# Sundance ST201 (D-Link DFE-550TX)
```

Sundance ST201 PCI 快速以太网控制器，包括 D-Link DFE-550TX。

```ini
device		stge		# Sundance/Tamarack TC9021 千兆以太网
```

支持基于 Sundance/Tamarack TC9021 系列控制器的千兆以太网适配器，包括 Sundance ST2021/ST2023、Sundance/Tamarack TC9021、D-Link DL-4000 和 ASUS NX1101。

```ini
device		vr		# VIA Rhine, Rhine II
```

支持基于 VIA VT3043“Rhine I”和 VT86C100A“Rhine II”芯片的多种快速以太网适配器。包括 D-Link DFE520TX、DFE530TX（DFE530TX+ 使用 rl 驱动）、Hawking PN102TX 和 AOpen/Acer ALN-320。

```ini
device		vte		# DM&P Vortex86 RDC R6040 快速以太网
```

DM\&P Vortex86 RDC R6040 快速以太网。

```ini
device		xl		# 3Com 3c90x（“Boomerang”，“Cyclone”）
```

支持 3Com 3c900、3c905、3c905B 和 3c905C（快速）Etherlink XL 网卡及集成控制器，包括部分 Dell Optiplex 和 Dell Precision 台式机的 3c905B-TX 芯片，以及 Dell Latitude 笔记本扩展坞的 3c905-TX 芯片。还支持 3Com 3c980(C)-TX、3Com 3cSOHO100-TX、3Com 3c450-TX。

**使用 iflib 框架的 PCI/PCI-X/PCIe 以太网卡**

```ini
device          iflib
```

[iflib](https://man.freebsd.org/iflib\(9\)) 网络接口驱动框架。

```ini
device          em      # Intel Pro/1000 千兆以太网
```

Intel PRO/1000 千兆以太网 82542/82543/82544 系列适配器。

此网卡基于通用 MII 总线控制器代码。

```ini
device          ix      # Intel Pro/10GbE PCIe 以太网
device          ixv     # Intel Pro/10GbE PCIe 以太网 VF
```

**PCI 以太网卡（Ethernet）**

```ini
device          cxgb        # Chelsio T3 10 千兆以太网
device          cxgb_t3fw   # Chelsio T3 10 千兆以太网固件
```

基于 Chelsio T3 芯片的 1 GbE / 10 GbE PCIe 以太网适配器。

此网卡基于通用 MII 总线控制器代码。

```ini
device          cxgbe       # Chelsio T4-T6 1/10/25/40/100 千兆以太网
```

Chelsio T4 / T5 / T6 系列 1 / 10 / 25 / 40 / 100 GbE PCIe 以太网适配器。

此网卡基于通用 MII 总线控制器代码。

```ini
device          cxgbev      # Chelsio T4-T6 虚拟功能
```

基于 Chelsio T4、T5 和 T6 的 PCIe 虚拟功能（Virtual Function）。

此网卡基于通用 MII 总线控制器代码。

```ini
device          le          # AMD Am7900 LANCE 和 Am79C9xx PCnet
```

AMD Am7900 LANCE 和 Am79C9xx PCnet 网卡。

此网卡基于通用 MII 总线控制器代码。

```ini
device          mxge
```

Myricom Myri-10G 10 GbE 以太网卡。

```ini
device          oce         # Emulex 10 GbE（OneConnect 以太网）
```

Emulex 10 GbE 适配器（OneConnect Ethernet）。

此网卡基于通用 MII 总线控制器代码。

```ini
device          ti          # Alteon Networks Tigon I/II 千兆以太网
```

支持基于 Alteon Tigon I / II 芯片的 PCI 千兆以太网适配器，包括 Alteon AceNIC、3Com 3C985、Netgear GA620 等。使用此驱动时建议大幅增加 `kern.ipc.nmbclusters` 的值。

此网卡基于通用 MII 总线控制器代码。

**PCI IEEE 802.11 无线网卡（Wi-Fi）**

```ini
device          ath         # Atheros PCI/CardBus 网卡
device          ath_hal     # PCI/CardBus 芯片支持
#device        ath_ar5210   # AR5210 芯片
#device        ath_ar5211   # AR5211 芯片
#device        ath_ar5212   # AR5212 芯片
#device        ath_rf2413   # AR2413 芯片
#device        ath_rf2417   # AR2417 芯片
#device        ath_rf2425   # AR2425 芯片
#device        ath_rf5111   # AR5111 芯片
#device        ath_rf5112   # AR5112 芯片
#device        ath_rf5413   # AR5413 芯片
#device        ath_ar5416   # AR5416 芯片
```

Atheros 系列无线网卡。

```ini
options    	AH_RXCFG_SDMAMW_4BYTES
```

所有 AR5212 芯片在与 AR71xx CPU 配合使用时都会出现问题。这些型号存在一个仅会在 AR71xx 上触发致命总线错误的漏洞。

漏洞的具体细节尚不明确，但可在 OpenWrt 论坛[相关讨论帖](https://forum.openwrt.org/viewtopic.php?pid=70060) 的第 4、5 和 6 页中找到部分信息。

启用此选项可以应用该解决方法。该解决方法会带来性能损失，但若不启用，设备将完全无法工作。通常该网卡的 DMA 传输以 128 字节为突发长度，但在受影响的 CPU 上，仅 4 字节的突发长度是安全的。

```ini
#device        ath_ar9160      # AR9160 芯片
#device        ath_ar9280      # AR9280 芯片
#device        ath_ar9285      # AR9285 芯片
device          ath_rate_sample # ath 的 SampleRate 发送速率控制
```

Atheros 相关无线网卡。

```ini
device          bwi             # Broadcom BCM430* BCM431*
```

Broadcom `BCM430*` 和 `BCM431*` 系列无线网卡。

此网卡基于通用 MII 总线控制器代码。

```ini
device          bwn             # Broadcom BCM43xx
```

Broadcom BCM43xx 系列无线网卡。

此网卡基于通用 MII 总线控制器代码。

```ini
device          malo            # Marvell Libertas 无线网卡
```

此网卡基于通用 MII 总线控制器代码。

```ini
device          mwl             # Marvell 88W8363 802.11n 无线网卡
device          mwlfw  # Marvell 88W8363 固件
```

此网卡基于通用 MII 总线控制器代码。`mwl` 驱动依赖固件 `mwlfw`。

```ini
device          ral             # Ralink Technology RT2500 无线网卡
```

Ralink Technology IEEE 802.11 无线适配器。

此网卡基于通用 MII 总线控制器代码。

```ini
device          rtwn            # Realtek 无线网卡/Realtek 无线适配器
device          rtwnfw  # Realtek 无线固件
```

此网卡基于通用 MII 总线控制器代码。

```ini
#options 	TI_SF_BUF_JUMBO
```

在 [ti(4)](https://man.freebsd.org/cgi/man.cgi?query=ti\&sektion=4) 控制器上使用 [sf\_buf(9)](https://man.freebsd.org/cgi/man.cgi?query=sf_buf\&sektion=9) 接口处理 jumbo 缓冲区。

```ini
#options 	TI_JUMBO_HDRSPLIT
```

为 [ti(4)](https://man.freebsd.org/cgi/man.cgi?query=ti\&sektion=4) 驱动固件启用头部拆分（header splitting）选项。此功能仅适用于 Tigon II 芯片，对 Tigon I 芯片无效。该选项需要依赖上面的选项 `TI_SF_BUF_JUMBO`。

```ini
options     MCLSHIFT=12   # mbuf 集群位移大小，12 == 4 kB；默认值为 11 == 2 kB
options     MSIZE=256     # mbuf 大小（字节）
```

这两个选项分别用于调整 mbuf 集群大小和 mbuf 大小。在将它们的默认值更改为其他值时，需要非常小心处理网卡驱动模块，因为这可能导致内核假定的 mbuf 大小与模块假定的 mbuf 大小不匹配。目前，唯一能够检测这种不匹配的驱动是 [ti(4)](https://man.freebsd.org/cgi/man.cgi?query=ti\&sektion=4)。

#### 音频设备

```ini
device		sound
```

通用音频驱动。

**`snd_*`：设备专用驱动**

```ini
device		snd_als4000
```

Avance Logic ALS4000 PCI.

```ini
device		snd_atiixp
```

ATI IXP 200/300/400 PCI.

```ini
device		snd_cmi
```

CMedia CMI8338/CMI8738 PCI.

```ini
device		snd_cs4281
```

Crystal Semiconductor CS4281 PCI.

```ini
device		snd_csa
```

Crystal Semiconductor CS461x/428x PCI（不含 4281）。

```ini
device		snd_emu10k1
```

Creative EMU10K1 PCI 和 EMU10K2（Audigy）PCI。

```ini
device		snd_emu10kx
```

Creative SoundBlaster Live! 和 Audigy。

```ini
device		snd_envy24
```

VIA Envy24 及兼容设备，依赖 `snd_spicds`。

```ini
device		snd_envy24ht
```

VIA Envy24HT 及兼容设备，依赖 `snd_spicds`。

```ini
device		snd_es137x
```

Ensoniq AudioPCI ES137x PCI.

```ini
device		snd_fm801
```

Forte Media FM801 PCI.

```ini
device		snd_hda
```

Intel 高保真音频（控制器）及兼容设备。

```ini
device		snd_hdsp
```

RME HDSP 9632 和 HDSP 9652。

```ini
device		snd_hdspe
```

RME HDSPe AIO 和 RayDAT。

```ini
device		snd_ich
```

Intel ICH AC’97 以及更多集成在芯片组中的音频控制器，例如 nVidia nForce 控制器。

```ini
device		snd_maestro3
```

ESS Technology Maestro-3/Allegro PCI.

```ini
device		snd_neomagic
```

Neomagic 256 AV/ZX PCI.

```ini
device		snd_solo
```

ESS Solo-1x PCI.

```ini
device		snd_spicds
```

SPI 编解码器驱动，Envy24/Envy24HT 驱动所需。

```ini
device		snd_t4dwave
```

Trident 4DWave DX/NX PCI、SiS 7018 PCI 和 Acer Labs M5451 PCI。

```ini
device		snd_uaudio
```

USB 音频。

```ini
device		snd_via8233
```

VIA VT8233x PCI.

```ini
device		snd_via82c686
```

VIA VT82C686A PCI.

```ini
device		snd_vibes
```

S3 Sonicvibes PCI.

**用于非 PnP 声卡的 hint 配置**

设备的标志位可向驱动提供一些额外信息，这些信息通常通过 PnP 接口自动获取。

* bit 2..0：次级 DMA 通道；
* bit 4：如果主板使用两个 DMA 通道，则设置该位；
* bit 15..8：主板类型，用于覆盖自动检测；如果不确定取值，请保持为 `0`（目前该功能尚未实现）。

```ini
envvar		hint.pcm.0.at="isa"
envvar		hint.pcm.0.irq="10"
envvar		hint.pcm.0.drq="1"
envvar		hint.pcm.0.flags="0x0"
envvar		hint.sbc.0.at="isa"
envvar		hint.sbc.0.port="0x220"
envvar		hint.sbc.0.irq="5"
envvar		hint.sbc.0.drq="1"
envvar		hint.sbc.0.flags="0x15"
envvar		hint.gusc.0.at="isa"
envvar		hint.gusc.0.port="0x220"
envvar		hint.gusc.0.irq="5"
envvar		hint.gusc.0.drq="1"
envvar		hint.gusc.0.flags="0x13"
```

**调试/测试**

```ini
options 	SND_DEBUG
```

启用额外调试代码，包括健全性检查和可能增加的详细输出。

```ini
options 	SND_DIAGNOSTIC
```

`SND_DIAGNOSTIC` 类似于 `INVARIANTS` / `DIAGNOSTIC`，对任何不一致情况均不予容忍。

```ini
options 	SND_FEEDER_MULTIFORMAT
```

`SND_FEEDER_MULTIFORMAT` 默认只编译 16/32 位 feeder。此选项将启用大多数 feeder 转换器（不含 8 位）。

> **警告**
>
> 可能导致内核体积增大。

```ini
options 	SND_FEEDER_FULL_MULTIFORMAT
```

`SND_FEEDER_FULL_MULTIFORMAT` 同上（`SND_FEEDER_MULTIFORMAT`），但包含 8 位 feeder。

```ini
options 	SND_FEEDER_RATE_HP
```

`SND_FEEDER_RATE_HP`（feeder\_rate）将尽可能使用高精度 64 位运算（默认情况下会尽量避免）。可能造成运算速度下降。

```ini
options 	SND_PCM_64
```

`SND_PCM_64`（仅适用于 i386/32 位架构）通过 64 位整数/运算处理 32 位采样。可略微提升动态范围，但运算速度可能变慢。

```ini
options 	SND_OLDSTEREO
```

`SND_OLDSTEREO` 仅允许 2 声道，相当于禁用多声道处理。

#### CardBus（PC 卡总线接口，PC Card）

```ini
device		cbb
```

实现 YENTA 接口的 PCI / CardBus 桥。

```ini
device		cardbus
```

CardBus 插槽。

#### MMC/SD

```ini
device		mmc
```

MMC / SD 总线，eMMC 芯片所需。

```ini
device		mmcsd
```

MMC/SD 内存卡。eMMC 芯片需要。

```ini
device		sdhci
```

通用 PCI SD 主机控制器。

```ini
device		rtsx
```

Realtek SD 卡读卡器（RTS5209、RTS5227 等）。

#### SMB 总线

系统管理总线（System Management Bus）支持由“smbus”设备提供。

通过 `smb` 设备（`/dev/smb*`）访问 SMBus，该设备是 `smbus` 的子设备。

**设备支持**

```ini
device		smb
```

通过 `/dev/smb*` 进行标准 I/O。

**SMB 接口支持**

```ini
device		smbus
```

`smbus` 总线支持，依赖上方的 `smb` 设备。

```ini
device		intpm
```

Intel PIIX4（82371AB, 82443MX）电源管理单元。

```ini
options 	ENABLE_ALART
```

在 Intel intpm 驱动上控制报警。

```ini
device		alpm
```

Acer Aladdin-IV/V/Pro2 电源管理单元。

```ini
device		ichsmb
```

Intel ICH SMBus 控制器芯片（82801AA、82801AB、82801BA）。

```ini
device		viapm
```

VIA VT82C586B/596B/686A 及 VT8233 电源管理单元。

```ini
device		amdpm
```

AMD 756 电源管理单元。

```ini
device		amdsmb
```

AMD 8111 SMBus 2.0 控制器。

```ini
device		nfpm
```

NVIDIA nForce 电源管理单元。

```ini
device		nfsmb
```

NVIDIA nForce2/3/4 MCP SMBus 2.0 控制器。

```ini
device		ismt
```

Intel SMBus 2.0 控制器芯片（用于 Atom S1200、C2000）

**SMBus 外设设备**

```ini
device		jedec_dimm
```

提供 DDR3 和 DDR4 DIMM 的资产信息和温度报告。

#### I²C 总线

I²C 总线支持由 `iicbus` 设备提供。

```ini
device		iicbus
```

提供 I²C 总线支持，下方的 `ic`、`iic`、`iicsmb` 等设备均依赖于该设备。

**支持的设备**

```ini
device		ic
```

I²C 网络接口，依赖 `iicbus`。

```ini
device		iic
```

I²C 标准 I/O 接口，依赖 `iicbus`。

通过 [ioctl(8)](https://man.freebsd.org/ioctl) 在用户空间访问 I²C 从设备。

```ini
device		iicsmb
```

通过 I²C 桥接的 SMB（使用任意 `iicbus` 接口的 I²C 到 SMB 桥）。可通过 SMB 命令进行 I²C I/O，依赖 `iicbus`。

```ini
device		iicoc
```

OpenCores I²C 控制器支持。

OpenCores I²C 控制器的简单轮询驱动。

**其他**

```ini
device		iicbb
```

Bitbang 驱动，在一对 GPIO 引脚上实现 I²C。提供通用 I²C 位操作（bit-banging）代码（`lpbb` 所需）。

**I²C 总线多路复用器（mux）设备**

```ini
device		iicmux
```

I²C 多路复用器核心驱动。

```ini
device		iic_gpiomux
```

通过 GPIO 引脚控制的 I²C 多路复用器硬件。

```ini
device		ltc430x
```

LTC4305 和 LTC4306 I²C 多路复用器芯片。

**I²C 外设设备**

```ini
device		ad7418
```

模拟器件温度和电压传感器驱动。

```ini
device		ads111x
```

德州仪器 ADS101x 和 ADS111x ADC。

```ini
device		ds1307
```

Dallas DS1307 RTC 及兼容芯片。

```ini
device		ds13rtc
```

所有 Dallas/Maxim ds13xx 系列芯片。

```ini
device		ds1672
```

Dallas DS1672 RTC.

```ini
device		ds3231
```

Dallas DS3231 RTC 及温度传感器。

```ini
device		fan53555
```

仙童半导体 FAN53555/SYR82x 稳压器。

```ini
device		icee
```

AT24Cxxx 及兼容 EEPROM。

```ini
device		isl12xx
```

Intersil ISL12xx RTC.

```ini
device		lm75
```

LM75 兼容温度传感器。

```ini
device		nxprtc
```

NXP RTC：PCA/PFC212x、PCA/PCF85xx 系列。

```ini
device		rtc8583
```

爱普生 RTC-8583。

```ini
device		s35390a
```

Seiko Instruments S-35390A RTC.

```ini
device		sy8106a
```

矽力杰 SY8106A 降压稳压器。

#### 并行总线接口

并行总线接口由 `ppbus` 设备驱动。多个设备可同时连接到并行接口，在检测到设备时可自动进行探测并附加。

**支持的接口**

```ini
device		ppc
```

ISA 总线并行端口接口。

**支持的设备**

```ini
options 	PPC_PROBE_CHIPSET
```

启用特定芯片组检测（参见 ppc(4) 中的标志）。

```ini
options 	DEBUG_1284
```

IEEE1284 信号协议调试。

```ini
options 	PERIPH_1284
```

使计算机作为 IEEE 1284 兼容外设。

```ini
options 	DONTPROBE_1284
```

避免启动时检测 PnP 并行设备。

```ini
options 	LPT_DEBUG
```

打印机驱动调试。

```ini
options 	PPC_DEBUG
```

并行芯片组级别调试。

```ini
options 	PLIP_DEBUG
```

并行网络 IP 接口调试。

```ini
options 	PCFCLOCK_VERBOSE
```

`pcfclock` 驱动详细输出。

```ini
options 	PCFCLOCK_MAX_RETRIES=5
```

最大读取尝试次数（默认 10 次）。

```ini
envvar		hint.ppc.0.at="isa"
envvar		hint.ppc.0.irq="7"
device		ppbus
```

```ini
device		lpt
```

并行打印机。

```ini
device		plip
```

并行网络接口。

```ini
device		ppi
```

通用 I/O（“Geek Port”）和 IEEE 1284 I/O。

```ini
device		pps
```

每秒脉冲计时接口。

```ini
device		lpbb
```

飞利浦官方并行端口 I²C 位操作接口。

```ini
device		pcfclock
```

并行端口时钟驱动。

#### 通用 I/O 引脚（GPIO）

```ini
device		dwgpio
```

Synopsys DesignWare APB GPIO 控制器。

```ini
device  	gpio
```

GPIO 接口及总线支持。

```ini
device  	gpiobacklight
```

sysctl 控制的背光，基于 GPIO。

```ini
device  	gpioiic
```

通过 GPIO bitbang 实现 I²C。

```ini
device  	gpiokeys
```

用于 GPIO 键输入的 [kbd(4)](https://man.freebsd.org/cgi/man.cgi?query=kbd\&sektion=4\&n=1) 连接层。

```ini
device  	gpioled
```

[LED(4)](https://man.freebsd.org/cgi/man.cgi?query=led\&sektion=4) GPIO 连接层。

```ini
device  	gpiopower
```

GPIO 电源关闭事件处理器。

```ini
device  	gpiopps
```

来自 GPIO 引脚的每秒脉冲输入。

```ini
device  	gpioregulator
```

GPIO 引脚的 extres/稳压器连接层接口。

```ini
device  	gpiospi
```

通过 GPIO bitbang 实现 SPI。

```ini
device  	gpioths
```

基于 GPIO 引脚的 1-Wire（单总线协议）温湿度传感器。

#### 脉宽调制（PWM）

```ini
device  	pwmbus
```

PWM 接口及总线支持。

```ini
device  	pwmc
```

用户空间对 PWM 输出的控制访问。

#### Etherswitch 框架与驱动

```ini
device		etherswitch
```

[etherswitch(4)](https://man.freebsd.org/cgi/man.cgi?query=etherswitch\&sektion=4) 以太网交换机框架。

```ini
device		miiproxy
```

[miibus(4)](https://man.freebsd.org/cgi/man.cgi?miibus\(4\)) MII 总线功能代理设备。

```ini
device		arswitch
```

Atheros 交换机。

```ini
device		ip17x
```

IC+ 17x 系列交换机。

```ini
device		rtl8366rb
```

Realtek RTL8366 交换机。

```ini
device		ukswitch
```

多物理层交换机。

#### 内核 BOOTP 支持

```ini
options 	BOOTP
```

使用 BOOTP 获取 IP 地址和主机名。

```ini
options 	BOOTP_NFSROOT
```

通过 BOOTP 信息挂载 NFS 根文件系统，依赖 NFSCL 和 NFS\_ROOT。

```ini
options 	BOOTP_NFSV3
```

使用 NFS v3 协议挂载 NFS 根目录。

```ini
options 	BOOTP_COMPAT
```

为了兼容有缺陷的 bootp 守护程序的变通方案。

```ini
options 	BOOTP_WIRED_TO=fxp0
```

指定 fxp0 网络接口运行 BOOTP。

```ini
options 	BOOTP_BLOCKSIZE=8192
```

将 NFS 块大小重写为 8192。

```ini
options 	SW_WATCHDOG
```

即使存在硬件看门狗，仍启用软件看门狗例程。

在默认情况下，仅当硬件看门狗不存在时才会启用软件看门狗定时器。

```ini
options 	DEADLKRES
```

添加软件死锁解析器线程。

```ini
options 	NSFBUFS=1024
```

设置要分配的 `sf_buf` 数量。`sf_buf` 是 sendfile(2) 使用的虚拟缓冲区，用于映射文件虚拟内存页，默认数量约为 16\*MAXUSERS+512。通常每个并发文件传输需要约 4 个此类缓冲区。

```ini
options 	DEBUG_LOCKS
```

启用锁机制的额外调试代码。此功能会将获取锁的文件名和行号信息存储在锁结构中，并修改多个函数调用来传递相关数据。

除非正在进行锁相关代码的调试，否则该功能没有实际用途。

> **注意**
>
> 该选项会修改内核二进制接口（KBI），需要重新编译所有内核模块。

#### VirtIO

virtio 条目提供了一种通用总线供设备驱动程序使用。该总线必须与主机通信的接口结合使用。

VirtIO 规范定义了多种此类接口，包括 PCI 和 MMIO 接口。

```ini
device		virtio
```

通用 VirtIO 总线（必须启用）。

```ini
device		virtio_mmio
```

VirtIO MMIO 接口。

```ini
device		virtio_pci
```

VirtIO PCI 接口。

```ini
device		vtnet
```

VirtIO 以太网设备。

```ini
device		virtio_balloon
```

VirtIO 内存气球（Balloon）设备。

```ini
device		virtio_blk
```

VirtIO 块设备。

```ini
device		virtio_console
```

VirtIO 控制台设备。

```ini
device		virtio_gpu
```

VirtIO GPU 设备。

```ini
device		virtio_random
```

VirtIO 随机数（熵）设备。

```ini
device		virtio_scmi
```

VirtIO SCMI（System Control and Management Interface）设备

```ini
device		virtio_scsi
```

VirtIO SCSI 设备。

#### HID（人机界面设备）支持

```ini
device		hid
```

通用 HID 支持。

```ini
options 	HID_DEBUG
```

启用调试信息。

```ini
device		hidbus
```

HID 总线。

```ini
device		hidmap
```

HID 到 evdev 的映射。

```ini
device		hidraw
```

裸设备访问驱动。

```ini
options 	HIDRAW_MAKE_UHID_ALIAS
```

为 `/dev/hidraw` 安装别名 `/dev/uhid`。

```ini
device		hconf
```

多点触控配置表。

```ini
device		hcons
```

消费者控制设备。

```ini
device		hgame
```

通用游戏控制器。

```ini
device		hkbd
```

HID 键盘。

```ini
device		hms
```

HID 鼠标。

```ini
device		hmt
```

HID 多点触控设备（兼容微软标准）。

```ini
device		hpen
```

通用手写笔驱动。

```ini
device		hsctrl
```

系统控制。

```ini
device		ps4dshock
```

索尼 PS4 DualShock 4 游戏手柄驱动。

```ini
device		u2f
```

FIDO/U2F 认证设备。

```ini
options 	U2F_DROP_UHID_ALIAS
```

不为 `/dev/u2f` 安装别名 `/dev/uhid`，并将驱动名称从 `uhid` 更改为 `u2f`。

```ini
device		xb360gp
```

Xbox 360 游戏手柄驱动。

### USB 支持

```ini
device		uhci
```

UHCI 控制器。

```ini
device		ohci
```

OHCI 控制器。

```ini
device		ehci
```

EHCI 控制器。

```ini
device		xhci
```

xHCI 控制器。

```ini
#device		slhci
```

SL811 控制器。

```ini
device		usb
```

通用 USB 框架（USB 必需）。

```ini
device		udbp
```

USB 双批量（Bulk）管道驱动。

```ini
device		ugold
```

USB 温度计。

```ini
device		uled
```

USB LED 灯。

```ini
device		uhid
```

HID 人机接口设备（用于其他带有按钮和拨盘的设备）。

```ini
device		ukbd
```

USB 键盘。

```ini
device		ulpt
```

USB 打印机。

```ini
device		umass
```

USB 大容量存储设备驱动（依赖 `scbus` 和 `da` 设备）。

```ini
device		usfs
```

设备端模式的 USB 大容量存储驱动。

```ini
device		umct
```

对 Belkin（贝尔金）F5U109 和 Magic Control Technology（茂杰国际）串行适配器的 USB 支持。

```ini
device		umodem
```

USB 调制解调器。

```ini
device		ums
```

USB 鼠标。

```ini
device		atp # 苹果触控板驱动
device		wsp # Wellspring 触控板，苹果笔记本用
```

USB 触控板。

```ini
device		uep
```

eGalax USB 触摸屏。

```ini
device		urio
```

Diamond（帝盟）Rio 500 MP3 播放器。

```ini
device		usbhid
```

HID-over-USB 驱动。

#### USB 串口

```ini
device		ucom
```

USB 串口支持。

```ini
device		u3g
```

对 Option、Novatel、华为和 Sierra 3G 调制解调器卡的 USB 支持。

```ini
device		uark
```

对基于 Technologies ARK3116 芯片的串行适配器的 USB 支持。

```ini
device		ubsa
```

对 Belkin（贝尔金）F5U103 及兼容串行适配器的 USB 支持。

```ini
device		uftdi
```

对基于 FT8U100AX 和 FT8U232AM 芯片的串行适配器的 USB 支持。

```ini
device		uipaq
```

对某些基于 Windows CE 的串行通信设备的 USB 支持。

```ini
device		uplcom
```

对 Prolific（旺玖科技）PL-2303 串行适配器的 USB 支持。

```ini
device		uslcom
```

对基于 Silicon Laboratories（芯科科技）CP2101/CP2102 芯片的 USB 串行适配器支持。

```ini
device		uvisor
```

USB Visor 和 Palm 设备支持。

```ini
device		uvscom
```

对 DDI Pocket PHS 设备的 USB 串行支持。

#### USB 以太网

```ini
device		uether
```

USB 以太网支持。

```ini
device		aue
```

ADMtek（上元）USB 以太网设备。支持 LinkSys USB100TX、Billionton USB100、Melco LU-ATX、D-Link DSB-650TX 和 SMC 2202USB。同时也兼容 ADMtek AN986 Pegasus 评估板。

```ini
device		axe
```

ASIX Electronics（亚信电子）AX88172 USB 2.0 以太网驱动。用于 LinkSys USB200M 及各种其他适配器。

```ini
device		axge
```

ASIX Electronics（亚信电子）AX88178A/AX88179 USB 2.0/3.0 千兆以太网驱动。

```ini
device		cdce
```

使用基于 USB 的以太网进行通信的设备，特别是符合通信设备类（CDC）以太网规范。支持夏普 Zaurus 掌上电脑、部分 DOCSIS 有线调制解调器及移动电话等设备。

```ini
device		cue
```

CATC USB-EL1201A USB 以太网设备。支持 CATC Netmate 和 Netmate II，以及 Belkin（贝尔金）F5U111。

```ini
device		kue
```

Kawasaki（川崎）LSI 以太网设备。支持以下适配器：

* LinkSys USB10T
* Entrega USB-NET-E45
* Peracom 以太网适配器
* 3Com 3c19250
* ADS Technologies USB-10BT
* ATen UC10T
* Netgear EA101
* D-Link DSB-650
* SMC 2102USB 和 2104USB
* Corega USB-T

```ini
device		rue
```

Realtek RTL8150 USB 转快速以太网设备。支持 Melco LUA-KTX 和 GREEN HOUSE GH-USB100B。

```ini
device		udav
```

Davicom（联傑国际）DM9601E USB 转快速以太网设备。支持 Corega FEther USB-TXC。

```ini
device		ure
```

Realtek RTL8152/RTL8153 USB 以太网驱动。

```ini
device		mos
```

Moschip MCS7730/MCS7840 USB 转快速以太网设备。支持 Sitecom LN030。

```ini
device		uhso
```

Option N.V. 公司的 HSDPA 设备。

```ini
device		rsu
```

Realtek RTL8188SU/RTL8191SU/RTL8192SU 无线驱动程序。

```ini
device		rum
```

Ralink Technology（雷凌科技）RT2501USB/RT2601USB 无线驱动程序。

```ini
device		run
```

Ralink Technology（雷凌科技）RT2700U/RT2800U/RT3000U 无线驱动程序。

```ini
device		uath
```

Atheros AR5523 无线驱动程序。

```ini
device		upgt
```

Conexant（科胜讯）/ Intersil（英特矽尔）PrismGT 无线驱动程序。

```ini
device		ural
```

Ralink Technology（雷凌科技）RT2500USB 无线驱动程序。

```ini
device		urndis
```

RNDIS USB 以太网驱动程序。

```ini
device		urtw
```

Realtek RTL8187B/L 无线网卡驱动程序。

```ini
device		zyd
```

ZyDas ZD1211/ZD1211B 无线驱动程序。

```ini
device		usie
```

Sierra USB 无线设备驱动程序。

```ini
options 	USB_DEBUG
options 	U3G_DEBUG
```

USB 子系统调试选项。

```ini
options 	UKBD_DFLT_KEYMAP	# 指定内置键盘布局
makeoptions	UKBD_DFLT_KEYMAP=jp.106 # 将内置键盘布局指定为日语 106 键
```

用于 ukbd 驱动的选项。

```ini
options 	UPLCOM_INTR_INTERVAL=100	# 中断管道间隔（毫秒）
```

用于 uplcom 驱动的选项。

```ini
options 	UVSCOM_DEFAULT_OPKTSIZE=8	# 默认输出数据包大小
options 	UVSCOM_INTR_INTERVAL=100	# 中断管道间隔（毫秒）
```

用于 uvscom 驱动的选项。

### 火线（FireWire，总线）

```ini
device		firewire
```

火线总线代码。

```ini
device		sbp
```

基于火线的 SCSI（依赖 `scbus` 和 `da`）。

```ini
device		sbp_targ
```

SBP-2 目标模式（依赖 `scbus` 和 `targ`）。

```ini
device		fwe
```

基于火线的以太网（非标准实现）。

```ini
device		fwip
```

基于火线的 IP 协议（RFC2734 和 RFC3146）。

### dcons 哑终端支持（简易控制台设备）

```ini
device		dcons
```

哑终端驱动。

```ini
device		dcons_crom
```

哑终端火线附件。

```ini
options 	DCONS_BUF_SIZE=16384
```

哑终端缓冲区大小。

```ini
options 	DCONS_POLL_HZ=100
```

哑终端轮询速率。

```ini
options 	DCONS_FORCE_CONSOLE=0
```

强制将哑终端作为主控制台。

```ini
options 	DCONS_FORCE_GDB=1
```

强制将哑终端设置为 GDB 设备。

## 加密子系统

该子系统基于从 OpenBSD 移植的加密框架。当配置 IPSEC 或拥有硬件加密设备时需包含此模块，可加速链接 OpenSSL 的用户应用程序。

相关驱动程序移植自 OpenBSD，其中包含一些已反馈给 OpenBSD 的简单功能增强。

```ini
device		crypto
```

核心加密子系统支持。

```ini
device		cryptodev
```

`/dev/crypto`：用于访问硬件加密设备的接口。

应仅在进行测试或明确知晓需要时才安装 `cryptodev` 设备。在大多数情况下，该设备并非必需，且可能导致系统性能下降。

```ini
device		rndtest
```

FIPS 140-2 熵测试工具。

```ini

device		ccr
```

Chelsio T6 加密加速器驱动程序。

```ini
device		safe
```

SafeNet SafeXcel 1141/1741 加密加速器。

```ini
options 	SAFE_DEBUG
```

启用调试支持：`hw.safe.debug`。

```ini
options 	SAFE_RNDTEST
```

启用 [rndtest(4)](https://man.freebsd.org/cgi/man.cgi?query=rndtest\&apropos=0\&sektion=0)（FIPS 140-2 随机数生成器测试监视器）支持。

## 嵌入式系统

```ini
options 	INIT_PATH=/sbin/init:/rescue/init
```

在嵌入式系统中，可能需要运行 init 以外的程序。

### 调试选项

```ini
options 	BUS_DEBUG
```

启用 newbus 调试。

```ini
options 	DEBUG_VFS_LOCKS
```

启用 VFS 锁调试。

```ini
options 	SOCKBUF_DEBUG
```

启用 sockbuf 最后记录及 mbuf 尾部检查。

```ini
options 	IFMEDIA_DEBUG
```

启用 `net/if_media.c` 中的调试功能。

### SYSINIT 详细输出

```ini
options 	VERBOSE_SYSINIT
```

使 `mi_startup()` 执行的 SYSINIT 过程输出更为详细的信息。该功能在移植新架构时非常实用。若同时启用了 DDB 调试器，将显示函数名称而非地址。若定义值为 `0`，则详细输出代码会被编译进内核但默认禁用，可通过可调参数 `debug.verbose_sysinit=1` 启用。

## SYSV IPC 内核参数

```ini
options 	SEMMNI=11
```

系统可同时使用的 System V 信号量最大数量。

```ini
options 	SEMMNS=61
```

系统范围内信号量总数。

```ini
options 	SEMMNU=31
```

系统中撤销结构总数。

```ini
options 	SEMMSL=61
```

单个进程可同时使用的 System V 信号量最大数量。

```ini
options 	SEMOPM=101
```

单个 System V 信号量可同时挂起的最大操作数。

```ini
options 	SEMUME=11
```

单个 System V 信号量可同时挂起的最大撤销操作数。

```ini
options 	SHMALL=1025
```

系统范围内共享内存页面的最大数量。

```ini
options 	SHMMAX=(SHMMAXPGS*PAGE_SIZE+1)
options 	SHMMAXPGS=1025
```

单个 System V 共享内存区域的最大大小（以字节为单位）。

```ini
options 	SHMMIN=2
```

单个 System V 共享内存区域的最小大小（以字节为单位）。

```ini
options 	SHMMNI=33
```

系统可同时使用的共享内存区域最大数量。

```ini
options 	SHMSEG=9
```

单个进程可同时附加的 System V 共享内存区域最大数量。

```ini
options 	PANIC_REBOOT_WAIT_TIME=16
```

设置系统在内核发生 panic 时自动重启前的等待时间（以秒为单位）。若设置为（`-1`），系统将无限期等待，直至在控制台上按下任意键。

```ini
options 	DIRECTIO
```

当文件设置了 `O_DIRECT` 标志时，尝试绕过缓冲区缓存，将数据直接读取到用户空间缓冲区。

读取操作的偏移量和长度必须是物理介质扇区大小的整数倍。

```ini
options 	NSWBUF_MIN=120
```

指定交换 I/O 缓冲区数量的下限。这些缓冲区在（除其他情况外）启用内核选项 `DIRECTIO` 且文件设置标志 `O_DIRECT` 时，用于绕过缓冲区缓存。

```ini
options 	CAM_DEBUG_DELAY

options 	DEBUG
```

未提供文档说明的 lint 检查选项。

> **注意**
>
> 为这些选项提供文档并不会被视为冒犯行为。

```ini
options 	LOCKF_DEBUG
```

内核文件锁调试。

## System V 兼容消息队列

```ini
options 	MSGMNB=2049
```

队列中最大字符数。

> **注意**
>
> 此处给出的数值仅用于测试内核构建。

源代码中的默认值提供了几乎相同的数值。`MSGSSZ` 必须介于是 `8` 到 `1024` 之间的 2 的幂的值。

```ini
options 	MSGMNI=41
```

最大消息队列标识符数量。

```ini
options 	MSGSEG=2049
```

最大消息段数量。

```ini
options 	MSGSSZ=16
```

消息段大小。

```ini
options 	MSGTQL=41
```

系统中最大消息数量。

```ini
options 	NBUF=512
```

缓冲区头数量。

```ini
options 	SC_DEBUG_LEVEL=5
```

syscons 调试级别。

```ini
options 	SC_RENDER_DEBUG
```

syscons 渲染调试。

```ini
options 	VFS_BIO_DEBUG
```

VFS 缓冲区 I/O 调试。

```ini
options 	KSTACK_MAX_PAGES=32
```

内核栈最大可分配页数。

```ini
options 	KSTACK_USAGE_PROF
```

跟踪线程在内核中使用的最大栈空间。

## Adaptec 阵列控制器驱动选项

```ini
options 	AAC_DEBUG	
```

调试级别：

* `0`：静默模式，仅显示警告信息
* `1`：详细模式，显示主要功能点和已完成操作
* `2`：极端详细模式，显示循环内的跟踪项等详细信息

```ini
options 	RACCT
```

资源审计。

```ini
options 	RCTL
```

资源限制。

```ini
options 	MAXFILES=999
```

未有文档描述的 lint 检查选项。

## 随机数生成器

```ini
options 	RANDOM_FENESTRASX
```

可选算法。

```ini
#options 	RANDOM_LOADABLE
```

将 CSPRNG 算法作为模块加载。

```ini
options 	RANDOM_ENABLE_UMA	# slab 分配器
```

选择此项能以高频率（但可能消耗资源）的方式收集 Slab 分配器的熵值。在极高频率场景下，此功能的价值存疑。

```ini
options 	RANDOM_ENABLE_ETHER	# 以太网传入
```

选择此项能以高频率（但可能消耗资源）的方式收集 mbuf 中 `m_next` 指针的熵值。

> **注意**
>
> 除非正在接收超过 4 K 的巨型帧或通过 LRO 技术实现持续数据突发，否则 `m_next` 指针通常为 NULL。因此在常规情况下，该操作实际是在向熵池注入零值。即使该指针非空，它也只是指向某个经过 256 字节对齐的 mbuf（其数量范围在数千至数万之间）。因此，哪怕是在最理想情况下，这也是一种劣质的熵源。若未对熵收集进行实际运行时分析，可能会误导用户认为收集到的熵量远超实际值——这将引发另一类安全风险。在高数据包速率场景下，以太网熵收集的成本极其高昂，可能导致高达 50% 的数据包接收丢失率。本选项仅为保持向后兼容性而提供，但无论如何都不建议在任何环境中使用。

```ini
options 	RANDOM_ENABLE_KBD
```

通过键盘收集熵值。

```ini
options 	RANDOM_ENABLE_MOUSE
```

通过鼠标收集熵值。

```ini
options 	RANDOM_ENABLE_TPM	# 暗含依赖 TPM_HARVEST
```

通过 TPM 收集熵值。

```ini
options         IMGACT_BINMISC
```

用于通过 QEMU 等模拟器启用应用程序执行的模块。

## zlib 输入/输出流支持

```ini
options 	GZIO
```

此选项用于支持生成经过压缩的核心转储文件。

## zstd

```ini
options 	ZSTDIO
```

此选项用于支持 Zstd 压缩的核心转储文件、GEOM\_UZIP 镜像，并且在静态链接时是 ZFS 文件系统必需的组件。

## BHND(4) 驱动

```ini
options 	BHND_LOGLEVEL
```

日志记录阈值级别。

## evdev 接口

```ini
device		evdev
```

输入事件设备支持。

```ini
options 	EVDEV_SUPPORT
```

传统驱动程序中的 evdev 支持。

```ini
options 	EVDEV_DEBUG
```

启用事件调试消息。

```ini
device		uinput
```

安装字符设备 `/dev/uinput`。

```ini
options 	UINPUT_DEBUG
```

启用 uinput 调试消息。

## 加密的内核崩溃转储

```ini
options 	EKCD
```

加密的内核崩溃转储功能

## 串行外设接口（SPI）

```ini
device		spibus
```

SPI 总线支持。

```ini
device		at45d
device		cqspi
```

DataFlash 驱动程序。

```ini
device		mx25l
device		n25q
```

SPI flash 驱动程序。

```ini
device		spigen
```

用户空间对 SPI 设备的通用访问支持。

```ini
options 	SPIGEN_LEGACY_CDEVNAME
```

spigen 的传统设备名称：为 `/dev/spigenX.Y` 设备启用传统的别名 `/dev/spigenN`。

## 压缩支持

```ini
device		zlib
```

gzip/zlib 压缩/解压缩库。

```ini
device		xz
```

xz\_embedded LZMA 解压缩库。

## 内核 stats(3) 支持

```ini
options 	STATS
```

内核级 stats(3) 支持。

## 文件系统监控

```ini
device		filemon
```

make(1) 元（meta）模式的文件监控。

## 英特尔 QuickAssist (QAT) 驱动程序

```ini
options		QAT_DISABLE_SAFE_DC_MODE
```

Intel QuickAssist (QAT)，英特尔数据保护与压缩加速技术。

禁用 QAT 安全模式。
