> For the complete documentation index, see [llms.txt](https://handbook.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://handbook.bsdcn.org/di-10-zhang-pei-zhi-freebsd-nei-he/10.2.-wei-shi-mo-yao-bian-yi-zi-ding-yi-nei-he.md).

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

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

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

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

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

* 更快的引导时间。由于内核只会探测系统中的硬件，系统引导所需的时间可能会减少。
* 更低的内存使用。定制内核通过省略不使用的功能和设备驱动程序，通常比 **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) 中加入以下行：

```sh
if_ath_load="YES"
```

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

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