Site Navigation:
 
 

8. Linux 内核

这一节覆盖了 Fedora Core 6 中 2.6.18 内核的变动及重要信息。2.6.18 内核包括:

8.1. 版本

Fedora Core 可能包含了附加的补丁,来改进,修正或添加附加特性。因此,Fedora Core 内核与被称为纯正(vanilla kernel)的,来自 kernel.org 网站的内核不是完全相同的。

http://www.kernel.org/

要获得这些补丁的列表,下载源 RPM 软件包,运行下列命令:

rpm -qpl kernel-<version>.src.rpm

8.2. 更新日志

软件包修订记录可以用下列命令看到:

rpm -q --changelog kernel-<version>

如果您希望看到更友好的修订日志,请访问 http://wiki.kernelnewbies.org/LinuxChangeshttp://kernel.org/git 提供了内核不同之处的摘要和完全两种版本。Fedora 基于 Linus 的内核树。

Fedora 版本做出的定制可以在 http://cvs.fedora.redhat.com 找到。

8.3. 内核配置

Fedora Core 6 包含了下列内核构建

  • 基本的内核,用于大多数系统,已配置的代码在 kernel-devel-version.arch.rpm 软件包中。

  • kernel-PAE,用于拥有超过 4GB RAM 的 32-bit x86 系统中,或者 CPU 带有 "NX (No eXecute)" 特性的系统中。它同时支持单/多处理器系统。

  • 虚拟机内核,用于 Xen 模拟器。已配置的源代码包含在 kernel-xen-devel-<version>.<arch>.rpm 软件包中。

  • Kdump 内核,与 kexec/kdump 搭配使用。已配置的源代码包含在 kernel-kdump-devel-<version>.<arch>.rpm 软件包中。

各种内核配置的源代码头文件可以同时安装。文件安装位置是 /usr/src/kernels/<version>-[xen|kdump]]-<arch>/。运行命令:

su -c 'yum install kernel-{PAE,xen,kdump}-devel'

选择一个或多个变种,以逗号分隔,不要有空格。在提示时输入

[注意]默认内核提供了 SMP

Fedora Core 6 没有单独的 SMP 内核,无论是 i386, x86_64 还是 ppc64。基本内核提供了多处理器支持。

[注意]PowerPC 内核支持

Fedora Core 6 test3 没有为 PowerPC 体系提供 Xen 或 Kdump 支持。

8.4. 报告错误

请参考 http://kernel.org/pub/linux/docs/lkml/reporting-bugs.html 中,报告 Linux 内核错误时的注意事项。您也可以访问 http://bugzilla.redhat.com 来报告 Fedora 特有的错误。

8.5. 遵循关于内核的教科书

关于 Linux 内核开发,很多教材,范例和教科书都假设内核源代码安装在 /usr/src/linux 目录。如果您像下面一样创建一个符号链接,就可以在 Fedora Core 中继续使用那些学习材料了。按照上面提到的方式,安装合适的内核源代码,然后:

su -c 'ln -s /usr/src/kernels/<version>.<release>-<arch> /usr/src/linux'

提示时输入 root 的密码。

8.6. 为内核开发作准备

Fedora Core 6 与旧版本不同,不包含 kernel-source 软件包,因为要编译外部模块,只需要 kernel-devel 软件包。已配置的源代码可以按照内核配置一节的步骤得到。

[注意]这些步骤指的是当前运行中的内核

为了简化下面的指令,假设您需要配置内核为使用当前运行中的内核的配置。在下面的步骤中,短语 <version> 指的是使用 uname -r 命令显示的内核版本。

需要使用内核源代码的 Fedora Core 用户可以在内核 .src.rpm 软件包中找到它们。要从文件释放源码树,执行下面的命令:

[注意]不要以超级用户身份(root)构建软件包

以超级用户身份构建软件包是极其危险的,不应当这样做,这不是必需的,即使是内核。下面的操作使您可以以普通用户身份构建内核。很多教程以 /usr/src/linux 作为内核的源码位置,如果想遵循这些操作,可以替换为 ~/rpmbuild/BUILD/kernel-<version>/linux-<version>

  1. 在个人目录准备 RPM 软件包构建环境,运行下面的命令:

    su -c 'yum install rpmdevtools yum-utils' 
    rpmdev-setuptree
  2. 提示时输入 root 的密码。

  3. 安装 kernel-<version>.src.rpm 文件。启用合适的源代码仓库,如 Core, Updates 或 Testing,使用 -e 开关:

    yumdownloader -e core-source -e updates-source --source kernel
  4. 提示时输入 root 的密码。

  5. 安装 kernel-<version>.src.rpm,运行命令:

    rpm -Uvh kernel-<version>.src.rpm
  6. 这个命令将 RPM 内容写到 ${HOME}/rpmbuild/SOURCES${HOME}/rpmbuild/SPECS, 这里 ${HOME} 是您的个人目录。

    [注意]硬盘空间需求

    完整的内核构建过程可能需要您的个人目录有几个吉的存储空间。

  7. 使用这样的命令来准备内核源代码:

    cd ~/rpmbuild/SPECS 
    rpmbuild -bp --target $(uname -m) kernel-2.6.spec
  8. 内核源代码位于 ${HOME}/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch> 目录。

    Fedora Core 6 附带的各种内核的配置文件位于 ~/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch>/configs 目录。例如,i686 配置文件名为 ~/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch>/configs/kernel-<version>-i686.config。运行下列命令,将所需的配置文件放到合适的位置以用来编译:

    cp configs/<desired-config-file> .config
  9. 每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。内核 Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile 经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的 Makefile

    例如,如果 uname -r 返回字符串 2.6.15-1.1948_FC5,就将 EXTRAVERSION 定义从:

    EXTRAVERSION = -prep 

    修改为:

    EXTRAVERSION = -1.2345_FC6

    也就是最后一个连字符后面的所有内容。

  10. 执行这个命令:

    make oldconfig

    接下来就没什么差别了。

[注意]构建内核的二进制 RPM

通常,Fedora 的内核是用 rpmbuild 和 spec 文件编译的。如果使用内核自带的 make rpm 方式,得到的结果是不一样的。

8.7. 只构建内核模块

编译内核模块,如设备驱动时,不需要当前运行的内核的完整源码树。为编译外部模块,只需要安装 kernel-devel 软件包。如果没有安装,就用 Pirut 安装它,执行 应用程序添加/删除软件 或者使用 yum。运行下面的命令来安装:

su -c 'yum install kernel-devel' 

例如,要构建 foo.ko 模块,在包含 foo.c 文件的目录中创建下面的 Makefile:

obj-m := foo.o 

KDIR  := /lib/modules/$(shell uname -r)/build
PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules

执行 make 命令来编译 foo.ko 模块就可以了。