首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

嵌入式开发实作(Linux内核编译及安装)

嵌入式开发实作(Linux内核编译及安装)

KEYinux 内核编译 内核配置 嵌入式
内核配置(Kernel configuration)Makefile版本修改 为了区别基于同一源码构建(bulid)的不内核镜像,可使用变量EXTRAVERSION(定义位于makefile的顶部):
[python] view plaincopy

  • $ head -4 makefile  
  • VERSION = 2
  • PATCHLEVEL = 6
  • SUBLEVEL = 7
  • EXTRAVERSION = -acme1  

运行“uname --r”会返回: 2.6.7--acme1
内核配置先定义内核需要什么特性,并进行配置。内核构建系统(The kernel build system)远不是简单用来构建整个内核和模块,想了解更多的高级内核构建选项,你可以查看 Documentation/kbuild 目录内的内核文档。
可用的配置命令和方式:
  • make xconfig
  • make menuconfig
  • make oldconfig
  • 或者 手动编写
内核配置文件.config与内核编译makefile?
内核是利用make编译并安装的一个C程序。而这个C程序很现代很复杂,仅凭单一个makefile难以完成编译任务。假设内核编译只需要一个makefile,这个makefile具体也会因编译不同功能特性的内核而有所不同,也就是说在编译内核先“编译”编译的所需要的makefile,这个makefile是动态生成的。那么这个动态的makefile从何而来呢?答案是config命令通过读取[内核配置文件](kernel configuration file)来生成编译内核所需要所有文件(包括makefile);那[内核配置文件]又是哪来的呢?还是make生成的,各种make的config(xconfig/menuconfig)会生成所需要的[内核配置文件]。
内核配置文件(kernel configuration file)保存为内核源代码的顶层目录的.config文件。发行版的内核配置文件通常在/boot/内。

命令:make xconfig
  • qconf: 全新的基于QT的配置接口,2.6版本内核
  • 更易使用(切记阅读 help -> introduction: useful options!)
  • 具有文件浏览功能,更易的加载配置文件
命令:make menuconfig
  • 老式字符界面,依然很管用。你够自信,完全可以手写配置文件!
命令:make oldconfig
  • 用于升级早期发布内核的配置文件
  • 对一些绝对符号(obsolete symbols)发出警告
  • 询问新符号的配置值
何为makefile?
makefile包含用以构建应用程序的一组规则集(set of rules)。并且第一条[规则]是特殊的[规则],叫[默认规则](default rule)。一条[规则]由三部分组成:目标(target)、前提条件(prerequisites)和命令动作(command):

[python] view plaincopy

  • target: prereq1 prereq2  
  • [tab]commands  

   [目标]是被构建(made)的[文件]或其它东西。[前提条件]或者叫依赖(dependents)是构建目标的“材料”。而[命令动作]是利用[前提条件]构建[目标]的shell命令。
以下是编译C源码的规则例子:
[python] view plaincopy

  • foo.o: foo.c foo.h  
  • tab]gcc -c foo.c  


注意格式,冒号前是[目标],后是[前提条件];[命令]在第二行,并且开始于一个tab字符。


编译内核编译和安装内核 编译步骤:

[python] view plaincopy

  • $ cd /usr/src/linux2.6
  • $ make  

安装步骤 (logged as root!)
[c-sharp] view plaincopy

  • $ make install  
  • $ make modules_install  

以下的步骤在2.6版本不再使用:
[c-sharp] view plaincopy

  • $ make depends  
  • $ make modules (done by make)  

提升编译速度多花一些时间在内核配置上,并且只编译那些你硬件需要的模块。这样可以把编译时间缩短为原来的1/30,并且节省数百MB的空间。另外,你还可以并行编译多个文件:
$ make -j <number>
make 可以并行执行多个目标(target)(KEMIN:前提是目标规则间没有交叉依赖项,这个怎么做到的?)
$ make -j 4
  • 即便是在单处理器的工作站上也会很快,读写文件的时间被节省下来了。多线程让CPU保持忙碌。
  • number大于4不见得有效了,因为上下文切换过多反而降低的工作的速度。
  • make -j <4*number_of_processors>
内核编译tips
  • 查看完整的 (gcc, ld)命令行: $ make V=1
  • 清理所有的生成文件 (to create patches...): $ make mrproper
  • 部分编译:$ make M=drivers/usb/serial
  • 单独模块编译:$ make drivers/usb/serial/visor.ko
  • 别处编译(假设源码在CDROM):
    • $ cd /mnt/cdrom/linux-2.6.17.11
    • $ make O=~/linux/linux-2.6.17.11
继承事业,薪火相传
返回列表