`
hzbook
  • 浏览: 260239 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编译Linux 2.6内核

阅读更多

编译内核易如反掌。让人叹为观止的是,这实际上比编译和安装像glibc这样的系统级组伴还要简单。2.6内核提供了一套新工具,使编译内核更加容易,比早期发布的内核有了长足的进步。

2.3.1 配置内核

因 为Linux源码随手可得,那就意味着在编译它之前可以配置和定制。的确,你可以把自己需要的特定功能和驱动程序编译进内核。在编译内核之前,首先你必须 配置它。由于内核提供了数不胜数的功能,支持了难以计数的硬件,因而有许多东西需要配置。可以配置的各种选项,以CONFIG_FEATURE形式表示, 其前缀为CONFIG。例如,对称多处理器(SMP)的配置选项为CONFIG_SMP。如果设置了该选项,则SMP启用,否则,SMP不起作用。配置选 项既可以用来决定哪些文件编译进内核,也可以通过预处理命令处理代码。

这些配置项要么是二选一,要么是三选一。二选一就是yes或no。 比如CONFIG_PREEMPT就是二选一,表示内核抢占功能是否开启。三选一可以是yes、no或module。module意味着该配置项被选定 了,但编译的时候这部分功能的实现代码是以模块(一种可以动态安装的独立代码段)的形式生成。在三选一的情况下,显然yes选项表示把代码编译进主内核映 像中,而不是作为一个模块。驱动程序一般都用三选一的配置项。

配置选项也可以是字符串或整数。这些选项并不控制编译过程,而只是指定内核源码可以访问的值,一般以预处理宏的形式表示。比如,配置选项可以指定静态分配数组的大小。

销 售商提供的内核,像Canonical的Ubuntu或者Red Hat的Fedora,他们的发布版中包含了预编译的内核,这样的内核使得所需的功能得以充分地启用,并几乎把所有的驱动程序都编译成模块。这就为大多数 硬件作为独立的模块提供了坚实的内核支持。但是,话又说回来,如果你是一个内核黑客,你应当编译自己的内核,并按自己的意愿决定包括或不包含哪一模块。

内核提供了各种不同的工具来简化内核配置。最简单的一种是一个字符界面下的命令行工具:

$ make config

该工具会逐一遍历所有配置项,要求用户选择yes、no或是module(如果是三选一的话)。由于这个过程往往要耗费掉很长时间,所以,除非你的工作是按小时计费的,否则应该多利用基于ncurse库编制的图形界面工具:

$ make menuconfig

或者,是用基于gtk+的图形工具:

$ make gconfig

这三种工具将所有配置项分门别类放置,比如按“处理器类型和特点”。你可以按类移动、浏览内核选项,当然也可以修改其值。

这条命令会基于默认的配置为你的体系结构创建一个配置:

$ make defconfig

尽管这些缺省值有点随意性(在i386上,据说那就是Linus的配置),但是,如果你从未配置过内核,那它们会提供一个良好的开端。赶快行动吧,运行这条命令,然后回头看看,确保为你的硬件所配置的选项是启用的。

这 些配置项会被存放在内核代码树根目录下的.config文件中。你很容易就能找到它(内核开发者差不多都能找到),并且可以直接修改它。在这里面查找和修 改内核选项也很容易。在你修改过配置文件之后,或者在用已有的配置文件配置新的代码树的时候,你应该验证和更新配置:

$ make oldconfig

事实上,在编译内核之前你都应该这么做。

配 置选项CONFIG_IKCONFIG_PROC把完整的压缩过的内核配置文件存放在/proc/config.gz下,这样当你编译一个新内核的时候就 可以方便地克隆当前的配置。如果你目前的内核已经启用了此选项,就可以从/proc下复制出配置文件并且使用它来编译一个新内核:

$ zcat /proc/config.gz > .config

$ make oldconfig

一旦内核配置好了(不论你是如何配置的),就可以使用一个简单的命令来编译它了:

$ make

这跟2.6以前的版本不同,你不用在每次编译内核之间都运行make dep了—代码之间的依赖关系会自动维护。你也无须再指定像老版本中bzImage这样的编译方式或独立地编译模块,默认的Makefile规则会打点这一切。

2.3.2 减少编译的垃圾信息

如果你想尽量少地看到垃圾信息,却又不希望错过错误报告与警告信息的话,你可以用以下命令来对输出进行重定向:

$ make > .. /detritus

一旦你需要查看编译的输出信息,你可以查看这个文件。不过,因为错误和警告都会在屏幕上显示,所以你需要看这个文件的可能性不大。事实上,我只不过输入如下命令:

$ make > /dev/null

就可把无用的输出信息重定向到永无返回值的黑洞/dev/null。

2.3.3 衍生多个编译作业

make程序能把编译过程拆分成多个并行的作业。其中的每个作业独立并发地运行,这有助于极大地加快多处理器系统上的编译过程,也有利于改善处理器的利用率,因为编译大型源代码树也包括I/O等待所花费的时间(也就是处理器空下来等待I/O请求完成所花费的时间)。

默 认情况下,make只衍生一个作业,因为Makefiles常会出现不正确的依赖信息。对于不正确的依赖,多个作业可能会互相踩踏,导致编译过程出错。当 然,内核的Makefiles没有这样的编码错误,因此衍生出的多个作业编译不会出现失败。为了以多个作业编译内核,使用以下命令:

$ make –jn

这里,n是要衍生出的作业数。在实际中,每个处理器上一般衍生出一个或者两个作业。例如,在一个16核处理器上,你可以输入如下命令:

$ make -j32 > /dev/null

利用出色的distcc或者 ccache工具,也可以动态地改善内核的编译时间。

2.3.4 安装新内核

在内核编译好之后,你还需要安装它。怎么安装就和体系结构以及启动引导工具(boot loader)息息相关了—查阅启动引导工具的说明,按照它的指导将内核映像拷贝到合适的位置,并且按照启动要求安装它。一定要保证随时有一个或两个可以 启动的内核,以防新编译的内核出现问题。

例如,在使用grub的x86系统上,可能需要把arch/i386/boot/bzImage 拷贝到/boot目录下,像vmlinuz-version这样命名它,并且编辑/etc/grub/grub.conf文件,为新内核建立一个新的启动 项 。使用LILO启动的系统应当编辑/etc/lilo.conf,然后运行lilo。

所幸,模块的安装是自动的,也是独立于体系结构的。以root身份,只要运行:

% make modules_install

就可以把所有已编译的模块安装到正确的主目录/lib/modules下。

编译时也会在内核代码树的根目录下创建一个System.map文件。这是一份符号对照表,用以将内核符号和它们的起始地址对应起来。调试的时候,如果需要把内存地址翻译成容易理解的函数名以及变量名,这就会很有用。

------------------------------

本 文节选自《Linux内核设计与实现(原书第3版)》,作者:Robert Love(Linux核心黑客,Google公司资深软件工程师,Android移动平台内核开发团队成员;曾就职于Novell公司,任职Linux桌 面系统的首席架构师,以及MontaVista和Ximain公司内核开发工程师)。

分享到:
评论

相关推荐

    linux2.6内核编译过程

    Linux 2.6 内核编译过程 Linux 2.6 内核编译过程是一个复杂的过程,需要了解 Linux 内核相关概念和编译过程中的各个步骤。在本文档中,我们将详细介绍 Linux 2.6 内核编译过程,并提供相关的知识点。 基础知识 在...

    编译Linux2.6内核并添加一个系统调用.pdf

    "编译Linux2.6内核并添加一个系统调用" Linux操作系统是自由软件,在广大爱好者的支持下,内核版本不断更新也不断增长。通过编译内核可以轻易地对它进行修改,使我们能够根据自己的要求度身定制一个更高效、更稳定...

    linux2.6内核编译方法详述

    编译Linux内核是一个复杂的过程,需要对操作系统有深入理解。确保遵循正确的步骤,同时对可能遇到的问题做好准备,如依赖库的缺失、硬件兼容性问题等。通过这个过程,你不仅可以定制一个更适合自己的内核,还能对...

    Linux 2.6内核测试及其到ARM嵌入式平台的移植.pdf

    "Linux 2.6内核测试及其到ARM嵌入式平台的移植" 本文将深入探讨Linux 2.6内核对嵌入式应用的影响,及其到ARM嵌入式平台的移植。Linux 2.6内核相对以前的Linux内核在可配置性和实时性方面有了很大的改进,特别是在...

    Linux2.6内核标准教程(共计8-- 第1个)

    《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...

    linux2.6内核编译与安装方法

    ### Linux 2.6 内核编译与安装方法 #### 概述 本文档将详细介绍如何在 Ubuntu 10.4 上编译并安装 Linux 2.6.38.8 内核版本的过程。该文档适用于希望深入了解内核编译流程、定制内核配置的 Linux 用户及开发者。...

    基于linux 2.6内核裁剪过程

    Linux 2.6内核是Linux发展的一个重要里程碑,引入了许多性能优化和新特性。当面临特定场景或设备时,可能需要对内核进行裁剪,以减小内核体积,提高效率,或者针对特定硬件进行优化。以下是基于Linux 2.6内核裁剪...

    Linux2.6内核标准教程(共计8--第8个)

    《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...

    Linux2.6 内核机制解析

    在深入探讨Linux 2.6内核中Initrd(Initial RAM Disk)技术的具体实现之前,有必要先理解Initrd的基本概念及其重要性。Initrd在Linux系统启动过程中扮演着关键角色,它为系统提供了早期的文件系统支持,使得内核能够...

    LINUX2.6内核makefile详解

    "LINUX2.6内核makefile详解" Linux 2.6 内核 Makefile 详解是 Linux 内核开发中非常重要的一部分。Makefile 是一个脚本文件,用于描述如何编译和构建 Linux 内核。该文件是 Linux 内核开发的核心组件之一,对开发...

    linux2.6内核Zimage

    linux2.6内核,可以直接下载到开发板的通过编译的linux2.6内核。

    Linux2.6内核的定制.doc

    【Linux2.6内核定制】是Linux操作系统发展的一个重要里程碑,它在多个方面进行了优化和增强,以适应不断变化的计算环境。本文将详细探讨Linux2.6内核的结构、主要子系统以及源码目录结构。 首先,Linux内核主要由五...

    Linux2.6内核标准教程(共计8--第6个)

    《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...

    Linux2.6内核标准教程(共计8--第3个)

    《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...

    linux2.6内核源码

    CFS 是 Linux 2.6 内核引入的一种调度器,它保证了进程调度的公平性。 4. **内存管理**:`mm`目录包含了内存分配、释放、页面替换策略(例如Page Fault和OOM Killer)等相关代码。`mm/memory.c`中的`alloc_pages()`...

    Linux2.6内核标准教程(共计8--第7个)

    《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...

    linux2.6内核启动流程

    ### Linux 2.6 内核启动流程详解 #### Linux 2.6 内核启动流程概述 Linux 2.6 内核的启动过程主要包括三个阶段:**解压缩**、**初始化**以及**启动应用程序**。这一过程是操作系统启动过程中至关重要的环节,确保...

    linux2.6内核.rar

    总结来说,"linux2.6内核.rar" 提供了一个已移植好的 Linux 2.6 内核映像,这涵盖了内核配置、编译、硬件驱动适配等多个环节。在实际应用中,用户需要结合目标硬件的具体情况,完成必要的配置和调整,以确保内核能在...

Global site tag (gtag.js) - Google Analytics