# 10.2.为什么要构建定制内核

传统上，FreeBSD 使用的是宏内核。该内核是一款大型程序，支持固定的设备列表，并且要改变内核的行为，必须编译并重新启动到新内核中。

如今，FreeBSD 内核中的大部分功能都包含在可以根据需要动态加载和卸载的模块中。这使得运行中的内核能够立即适应新硬件，并将新的功能引入内核。这种内核被称为模块化内核。

有时，仍然需要进行静态内核配置。某些功能与内核紧密绑定，无法动态加载。一些安全环境会阻止加载和卸载内核模块，要求只能将所需功能静态编译到内核中。

构建定制内核通常是高级 BSD 用户的必由之路。这个过程虽然耗时，但能为 FreeBSD 系统带来很多好处。与必须支持广泛硬件的 GENERIC 内核不同，定制内核可以精简，只提供对该计算机硬件的支持。这有以下几个好处：

* 更快的启动时间。由于内核只会探测系统中的硬件，系统启动所需的时间可能会减少。
* 更低的内存使用。定制内核通常通过省略不使用的功能和设备驱动程序来减少内存占用。这一点非常重要，因为内核代码始终驻留在物理内存中，防止该内存被应用程序占用。因此，定制内核对于内存较小的系统非常有用。
* 增强的硬件支持。定制内核可以为 GENERIC 内核中没有的设备提供支持。

> **警告**
>
> 在构建定制内核时，重要的是要注意，非默认配置的测试不如 GENERIC 配置彻底。虽然定制内核可以带来特定的好处，但它也增加了遇到构建或运行时问题的风险。只有那些有明确理由进行更改并愿意在必要时进行调试的高级用户，才建议使用定制内核配置。

在构建定制内核之前，考虑一下构建的原因。如果需要特定的硬件支持，可能已经作为模块存在。

内核模块位于 /boot/kernel 中，可以使用 [kldload(8)](https://man.freebsd.org/cgi/man.cgi?query=kldload\&sektion=8\&format=html) 将其动态加载到运行中的内核中。大多数内核驱动程序都有可加载的模块和手册页。例如，[ath(4)](https://man.freebsd.org/cgi/man.cgi?query=ath\&sektion=4\&format=html) 无线网络驱动程序的手册页中包含以下信息：

或者，要在启动时加载驱动程序作为模块，请在 [loader.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=loader.conf\&sektion=5\&format=html) 中加入以下行：

```ini
if_ath_load="YES"
```

将 `if_ath_load="YES"` 添加到 /boot/loader.conf 中，将在启动时动态加载此模块。

在某些情况下，/boot/kernel 中没有关联的模块。这通常适用于某些子系统。
