gno*_*ule 25 source ubuntu kernel
在书籍中,我通常会阅读对 Linux 源代码树的引用/usr/src/linux
以及通常的子目录集 ( arch
, block
, crypto
, ...)。
我期待这棵树包含组成内核的二进制文件。在我的系统(Ubuntu 10.04)中...
对于我拥有的不同内核(使用自动软件下载,而不是手动安装),我在这个位置找到了每个内核的两个子目录,如下所示:
/usr/src/linux-headers-2.6.32-22
/usr/src/linux-headers-2.6.32-22-generic
Run Code Online (Sandbox Code Playgroud)在子目录中,我期望二进制文件等。但是,我检查了相当数量的树,这里的最后一个子目录似乎总是有一个Makefile
(在阅读它时,它听起来通常更像是一个配置文件而不是安装文件),偶尔还有一些孤立的其他文件(大部分Kconfig
)。
我的问题可能很幼稚,但我有点困惑。是 (2) 我应该在内核源代码树中看到的内容;为什么我明确提到“标题”?我需要linux-generic-headers
为其他一些软件安装一段时间,但不确定这是否相关。我意识到makefiles有很好的理由(例如,在/driver子目录中安装模块),但是(几乎)只有makefiles?
Mat*_*Mat 31
分发kernel-header
包,顾名思义,只包含构建内核模块等软件所需的内核头文件(加上必要的管道)。
除了构建输出之外,您根本不应该期望在内核源目录中找到二进制文件。(如果您自己配置和构建内核,内核源目录还将包含编译的对象、模块、构建的内核本身以及其他一些使其工作的二进制位和部分。)
KConfig
文件是内核配置选项的描述(及其依赖项)可用于给定目录/模块。
除此之外,它是所有(大部分)C 源代码、头文件和Makefile
s。这里和那里有一些帮助脚本,还有汇编源代码。
头包(你安装的)只包含上面的头部分(不是全部——只有“导出的”头),以及一些构建基础设施。所以你所看到的都是意料之中的。头包不包含 C 源代码(除了一些存根和构建基础设施代码)。拥有这种类型的包的全部意义在于节省空间(和带宽)——整个 Linux 内核源代码树相当大,如果您不打算自己编译内核,则完全没有必要。头包由发行版构建和提供,以提供构建模块所需的正确内容,但仅此而已。(它们当然不包含编译的内核。)
解决您的评论:标头包不会重新定位到任何地方。它们是为特定版本的内核构建的,打包在特定目录中,仅此而已。这只是一组文件。(请注意,头文件包不一定与当前稳定的内核二进制包具有相同的版本 - 头文件包是通用的,可能落后于您正在运行的实际内核。但是,它们不应该来自内核比当前安装的(或目标)内核更新的版本。)
已安装的内核二进制文件通常/boot
与引导加载程序二进制文件和配置文件一起安装在该目录中。(这有时是一个独立的文件系统,默认情况下不会挂载。)文件的确切名称取决于内核和发行版。(引导加载程序也是如此。)
已安装的内核模块位于以下子目录中:
/lib/modules/`uname -r`/
Run Code Online (Sandbox Code Playgroud)
所以例如在我的系统上,他们目前在
/lib/modules/3.1.4-gentoo/
Run Code Online (Sandbox Code Playgroud)
完整内核源代码:在 Ubuntu 上,如果您希望完整内核源代码自己构建内核,则应按照此处的说明进行安装。
您还可以从kernel.org
某处下载源 tarball并将其解压缩(如果您使用此 tarball,请不要覆盖 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
Run Code Online (Sandbox Code Playgroud)
符号链接用于简化依赖于内核源的应用程序的构建。您将该路径链接到正在运行的(或目标)内核,以便在构建树外模块时不必指定确切的版本或路径信息。至少对基于源的发行版有帮助。