第8章  内核配置

翻译:intron@intron.ac.
8.1. 我想定制我的内核。这事难吗?
8.2. 我的内核编译失败,是因为 _hw_float 缺失。我应该如何解决这个问题?
8.3. 为什么我的内核那么大 (超过 10 MB)?
8.4. 为什么使用多串行端口代码时我遇到中断冲突?
8.5. 为什么我尝试的每种内核(配置)都无法编译,甚至是 GENERIC?
8.6. 我如何能确认在一个运行着的系统上使用的是哪个调度器?
8.7. kern.sched.quantum 是什么?

8.1. 我想定制我的内核。这事难吗?

一点也不难。查看 使用手册的内核配置章节

注意: 新的 kernel 会随模块一起安装到 /boot/kernel 目录中, 而旧内核及其模块则会挪到 /boot/kernel.old 目录, 这样如果您修改配置文件时弄错了, 仍然可以回到上一次的内核。

8.2. 我的内核编译失败,是因为 _hw_float 缺失。我应该如何解决这个问题?

也许你从内核配置文件中删除了 npx0 (参见 npx(4)),而你的计算机却也没有数学协处理器。 设备 npx0必需的, 即使你在的硬件中的确有个设备提供硬件浮点支持, 即使不再是在很老的 386 时代使用的那种单独设备。 你 必须 包括 npx0 设备。 甚至即使你已经建造了一个不带 npx0 支持的内核, 也是无法引导的。

8.3. 为什么我的内核那么大 (超过 10 MB)?

可能是你编译了你的内核为 调试模式。 建造于调试模式的内核包含许多用于调试的符号, 因此内核的大小就大大增加了。注意, 运行一个调试内核不会有什么性能提高, 在系统崩溃时保留一个调试内核就有用了。

然而,如果你的磁盘空间吃紧, 或是你不需要运行一个调试内核, 确保如下两点:

  • 不要将这样一行放于你的内核配置文件中:

    makeoptions DEBUG=-g
    
  • 运行 config(8) 时不要带 -g 选项。

上述设置中的任何一个都会导致你的内核被建造于调试模式。 一旦你确保了上述两点, 你可以按通常情况建造你的内核了, 你应该可以注意到一个很大的文件大小的减少; 多数内核应该是 1.5 MB 到 2 MB。

8.4. 为什么使用多串行端口代码时我遇到中断冲突?

当我编译带有多个串行端口代码的内核时, 被告知只有第一个端口被侦测到, 而其余的由于中断冲突被忽略。 我应该如何解决这个问题?

这里的问题是 FreeBSD 有内建的代码防止内核因为硬件或软件冲突而变成垃圾。 解决这个问题的办法是除一个端口之外省去其它端口的 IRQ 设置。 这里是一个例子:

#
# 多端口高速串行线 - 16550 UARTS
#
device sio2 at isa? port 0x2a0 tty irq 5 flags 0x501 vector siointr
device sio3 at isa? port 0x2a8 tty flags 0x501 vector siointr
device sio4 at isa? port 0x2b0 tty flags 0x501 vector siointr
device sio5 at isa? port 0x2b8 tty flags 0x501 vector siointr

8.5. 为什么我尝试的每种内核(配置)都无法编译,甚至是 GENERIC?

这个问题有许多可能的原因。 没有什么特别的顺序,他们是:

  • 您没有使用 make buildkernelmake installkernel 目标, 而您的源代码树又与目前正在运行的系统不同 (例如, 您在 7.4-RELEASE 上编译 8.2-RELEASE 系统)。 如果您正在尝试升级, 请务必仔细阅读 /usr/src/UPDATING 文件, 特别是其结尾处的 “COMMON ITEMS” (一般事项) 部分。

  • 尽管您使用了 make buildkernelmake installkernel 目标, 但没有确保 make buildworld 正确完成。 make buildkernel 目标依赖由 make buildworld 目标生成的文件来正确地完成操作。

  • 即使你尝试建造 FreeBSD-STABLE, 仍然有可能你抓取代码树是在代码树正在被修改, 或是由于一些原因而坏掉的时候; 只有正式发行版 (RELEASE) 是绝对被保证可以建造的,尽管 FreeBSD-STABLE 在大部分时间建造的更好。 如果你没有成功完成建造, 尝试重新抓取源代码树看看问题是否消失。

8.6. 我如何能确认在一个运行着的系统上使用的是哪个调度器?

检查系统中是否有 kern.sched.quantum sysctl。 如果有, 您应该会看到类似这样的输出:

% sysctl kern.sched.quantum
kern.sched.quantum: 99960

如果存在 kern.sched.quantum sysctl, 那么您正在使用的是 4BSD 调度器 (sched_4bsd(4))。 如果没有, 则 sysctl(8) 会显示一条错误信息 (可以忽略):

% sysctl kern.sched.quantum
sysctl: unknown oid 'kern.sched.quantum'

此外, 目前正在使用的调度器的名字, 可以直接通过 kern.sched.name sysctl 来获得:

% sysctl kern.sched.name
kern.sched.name: 4BSD

8.7. kern.sched.quantum 是什么?

kern.sched.quantum 是进程被抢断之前可以执行的最大时钟跳数 (tick)。 这是 4BSD 调度器专有的, 因此您可以使用它来判断系统正在使用哪个调度器。

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.