内核源代码树包含什么?这与Linux内核标头有关吗?


25

在书籍,我通常在阅读到Linux源代码树的引用/usr/src/linux与通常的组子目录(archblockcrypto,...)。

我期望这棵树包含组成内核的二进制文件。在我的系统中(Ubuntu 10.04)...

  1. 对于我拥有的不同内核(使用自动软件下载,未手动安装),我在此位置找到了每个内核的两个子目录,如下所示:

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. 在子目录中,我希望使用二进制文件等。但是,我检查了相当数量的树,并且这里的最后一个子目录似乎总有一个Makefile(读取时,听起来通常更像是配置文件,然后是安装文件),偶尔还有一些孤立的其他文件(主要是Kconfig)。

我的问题可能很幼稚,但我有些困惑。是(2)我应该在内核源代码树中看到的内容;为什么我要明确提及“标题”?我需要linux-generic-headers为其他一些软件安装一段时间,并且不确定是否可能与之相关。我知道生成文件有充分的理由(例如,将模块安装在/ driver子目录中),但是(几乎)只有生成文件吗?

Answers:


30

kernel-header顾名思义,分发软件包仅包含构建诸如内核模块之类的软件所需的内核头文件(加上必要的管道)。

除了构建输出外,您不应该期望在内核目录中找到二进制文件。(如果您自己配置和构建内核,则内核源目录还将包含已编译的对象,模块,已构建的内核本身以及使它工作的其他一些二进制位。)
KConfig文件是内核配置选项的描述。 (及其依赖性)可用于给定目录/模块。
除此之外,所有(大部分)都是C源代码,头文件和Makefiles。到处都有一些帮助程序脚本,以及汇编源代码。

标头包(安装的标头)仅包含上述标头的一部分(而不是全部标头-仅包含“导出的”标头)和一些构建基础结构。因此,您所看到的是预期的。头文件包包含C源代码(某些存根和构建基础结构代码除外)。拥有这种程序包的全部目的是节省空间(和带宽)-整个Linux内核源代码树相当大,如果您不想自己编译内核,则完全没有必要。头文件包是由发行版构建和交付的,仅提供构建模块所需的正确内容,而没有更多内容。(它们当然不包含已编译的内核。)

解决您的评论:标头包不会移到任何地方。它们是为特定版本的内核构建的,打包在特定的目录中,仅此而已。这只是一组文件。(请注意,标头包的版本不一定与当前稳定的内核二进制包的版本相同-标头包是通用的,并且可能落后于您正在运行的实际内核。但是,它们不应该来自内核比当前已安装(或目标)内核更新的版本。)

安装的内核二进制文件通常/boot与引导加载程序二进制文件和配置文件一起安装在目录中。(有时这是一个独立的文件系统,默认情况下未安装。)文件的确切名称取决于内核和发行版。(引导程序也是如此。)

已安装的内核模块位于以下子目录中:

/lib/modules/`uname -r`/

因此,例如在我的系统上,它们当前处于

/lib/modules/3.1.4-gentoo/

完整的内核源代码:在Ubuntu上,如果您希望完整的内核源代码自己构建内核,则应按照此处的说明进行安装。

您也可以下载从源码包kernel.org和它解压(做覆盖安装Ubuntu的文件,如果你使用这个压缩包,让您的个人的东西,并通过RPM单独管理的内容)。

/usr/src/linux是放置内核源代码的传统场所,但是没有什么可以阻止您将内核源代码放置在其他地方。此路径通常也只是指向目录的符号链接。例如我的机器上有这个:

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

使用符号链接可以简化依赖内核源代码的应用程序的构建。您可以将该路径链接到正在运行的(或目标)内核,以便在树外构建模块时不必指定确切的版本或路径信息。至少有助于一堆基于源的发行版。


非常感谢您提供详细而完整的答案。这已经困扰了我一段时间。如果我没有超出我的欢迎范围,并且您有时间的话,请补充:(a)在我的情况下(非自安装内核),我读到上面的内容,其中一些(一个)目录应该(可能)包含内核C和汇编器源代码。那会是哪里-不是完整列表,仅当我浏览20-30个子目录时,我再也没有遇到过?我已经从kernel.org下载了内核源文件。我只是想更好地了解我的系统。(b)...
gnometorule 2011年

...那么(就我而言),当您自己不安装内核时,内核二进制文件通常位于何处?(c)您指的是“标头包”,我将其称为“ linux-generic-headers”。我从那些包裹中看到了那棵树吗?如果是,在安装它们之前,它们是否会重定位到源代码树所在的位置?再次非常感谢。
gnometorule 2011年

(如果您回答,请使用“答案”不要评论,这样我至少可以再次
投票

扩大了一点。标头包用于标头。完整的源代码包提供了完整的源代码。二进制包仅提供二进制文件。

5
linux-source包含上游源代码,apt-get source linux-image-$(uname -r)并通过Ubuntu补丁获取内核源代码。
Lekensteyn 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.