- 浏览: 18658 次
最新评论
编译Linux 2.6内核
2011年06月23日
编译内核易如反掌。让人叹为观止的是,这实际上比编译和安装像glibc这样的系统级组伴还要简单。2.6内核提供了一套新工具,使编译内核更加容易,比早期发布的内核有了长足的进步。 因为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规则会打点这一切。 如果你想尽量少地看到垃圾信息,却又不希望错过错误报告与警告信息的话,你可以用以下命令来对输出进行重定向:
$ make > .. /detritus
一旦你需要查看编译的输出信息,你可以查看这个文件。不过,因为错误和警告都会在屏幕上显示,所以你需要看这个文件的可能性不大。事实上,我只不过输入如下命令:
$ make > /dev/null
就可把无用的输出信息重定向到永无返回值的黑洞/dev/null。 make程序能把编译过程拆分成多个并行的作业。其中的每个作业独立并发地运行,这有助于极大地加快多处理器系统上的编译过程,也有利于改善处理器的利用率,因为编译大型源代码树也包括I/O等待所花费的时间(也就是处理器空下来等待I/O请求完成所花费的时间)。
默认情况下,make只衍生一个作业,因为Makefiles常会出现不正确的依赖信息。对于不正确的依赖,多个作业可能会互相踩踏,导致编译过程出错。当然,内核的Makefiles没有这样的编码错误,因此衍生出的多个作业编译不会出现失败。为了以多个作业编译内核,使用以下命令:
$ make jn
这里,n是要衍生出的作业数。在实际中,每个处理器上一般衍生出一个或者两个作业。例如,在一个16核处理器上,你可以输入如下命令:
$ make -j32 > /dev/null
利用出色的distcc或者 ccache工具,也可以动态地改善内核的编译时间。 在内核编译好之后,你还需要安装它。怎么安装就和体系结构以及启动引导工具(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公司内核开发工程师)。
发表评论
-
j2me框架大全
2012-01-20 02:29 765j2me框架大全 2011年03月08日 J2ME P ... -
几种分布式存储系统的分析
2012-01-20 02:29 1060几种分布式存储系统的 ... -
针对 Java 移动设备的 3D 图形,第 2 部分: M3G 的保留模式
2012-01-20 02:29 627针对 Java 移动设备的 3D 图形,第 2 部分: M3G ... -
NanoBSD
2012-01-20 02:29 540NanoBSD 2011年06月02日 ... -
以感恩为主题的演讲稿
2012-01-19 10:18 618以感恩为主题的演讲稿 2011年10月23日 尊敬的领导 ... -
演讲稿 ―― 一生有你
2012-01-19 10:18 538演讲稿 ―― 一生有你 2011年06月04日 一生 ... -
公司主管竞聘演讲稿
2012-01-19 10:18 584公司主管竞聘演讲稿 20 ... -
爱心演讲稿-用爱拥抱每一天用心感动每个人
2012-01-19 10:18 642爱心演讲稿-用爱拥抱每 ... -
QQ旋风下载问题
2012-01-17 02:59 564QQ旋风下载问题 2010年08月05日 -
OpenGL的安装
2012-01-17 02:59 597OpenGL的安装 2010年06月20 ... -
(转)关于OpenGL的安装
2012-01-17 02:59 645(转)关于OpenGL的安装 201 ... -
《塞尔达传说:天空之剑》模拟器更新操控优化
2012-01-17 02:58 1615《塞尔达传说:天空之剑》模拟器更新操控优化 2011年11月 ... -
测量误差(error)的概念
2012-01-15 22:36 2177测量误差(error)的概念 2 ... -
HTTP Error 503. The service is unavailable
2012-01-15 22:36 854HTTP Error 503. The service is ... -
[恶搞]LoadRunner 呈现error 标题及解决方法总结
2012-01-15 22:36 811[恶搞]LoadRunner 呈现error 标题及解决方法总 ... -
KEIL C中的warning及error!!!
2012-01-15 22:35 1464KEIL C中的warning及error!!! 2011年 ... -
Network Management Error Codes
2012-01-15 22:35 1153Network Management Error Codes ... -
Flex之行为控制
2012-01-11 00:39 524Flex之行为控制 2011年09月26日 向上擦掉效果 ... -
server java开发-born for soa系列 整理中。。。-virgoooos-iteye技术网站
2012-01-11 00:39 510server java开发-born for soa ... -
JSTL fmt:formatNumber 数字、货币格式化
2012-01-11 00:39 601JSTL fmt:formatNumber 数字、货币格式化 ...
相关推荐
编译Linux2.6内核并添加一个系统调用.pdf
linux2.6内核编译方法详述 linux2.6内核编译方法详述
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...
Linux 2.6内核编译配置选项简介.Linux 2.6内核编译配置选项简介.Linux 2.6内核编译配置选项简介.Linux 2.6内核编译配置选项简介.Linux 2.6内核编译配置选项简介.Linux 2.6内核编译配置选项简介.
linux2.6内核,可以直接下载到开发板的通过编译的linux2.6内核。
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...
讲述在linux内核2.6下具体的裁剪过程
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...
个人总结的2.6kernel通用编译方法,绝对能用,在我的uburtn 10.4 ,linux kernel 2.6.38.8上测试通过。
从linux2.4内核升级到linux2.6内核的步骤.pdf(非常好用)
linux2.6内核编译配置选项简介,对从事嵌入式linux开发的会大有帮助的
Linux-2.6内核编译配置选项简介.pdf
Linux2.6内核模块编译Makefile[归类].pdf
这是一个关于linux-2.6内核编译过程的文档文件 里边有几种方法 内容很全 大家可以借鉴
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...
本文基于Linux 2.6讲解了内核的编译步骤及模块的动态加载方法。
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...
《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么...