×

关于Linux 2.6内核Makefile的分析

消耗积分:1 | 格式:rar | 大小:0.5 MB | 2017-11-02

分享资料个

[摘要] 由于Linux的独特优势,使越来越多的企业和科研机构把目光转向Linux的开发和研究上。目前Linux最新的稳定内核版本为2.6.17,但是当今绝大部分对于Linux Makefile的介绍文章都是基于2.4内核的,可以说关于2.6内核Makefile相关的文章凤毛麟角,笔者抽时间完成了这篇分析文章,让读者迅速熟悉Linux最新Makefile体系,从而加深对内核的理解,同时也希望能对Linux在公司的推广起到一定的推动作用,算是抛砖引玉吧!
  1 Makefile组织层次
  Linux的Make体系由如下几部分组成:
  Ø 顶层Makefile
  顶层Makefile通过读取配置文件,递归编译内核代码树的相关目录,从而产生两个重要的目标文件:vmlinux和模块。
  Ø 内核相关Makefile
  位于arch/$(ARCH) 目录下,为顶层Makefile提供与具体硬件体协结构相关的信息。
  Ø 公共编译规则定义文件。
  包括Makefile.build 、Makefile.clean、Makefile.lib、Makefile.host等文件组成。这些文件位于scripts目录中,定义了编译需要的公共的规则和定义。
  Ø 内核配置文件 .config
  通过调用make menuconfig或者make xconfig命令,用户可以选择需要的配置来生成期望的目标文件。
  Ø 其他Makefile
  主要为整个Makefile体系提供各自模块的目标文件定义,上层Makefile根据它所定义的目标来完成各自模块的编译。
  2 Makefile的使用
  在编译内核之前,用户必须首先完成必要的配置。Linux内核提供了数不胜数的功能,支持众多的硬件体系结构,这就需要用户对将要生成的内核进行裁减。内核提供了多种不同的工具来简化内核的配置,最简单的一种是字符界面下命令行工具:
  make config
  这个工具会依次遍历内核所有的配置项,要求用户进行逐项的选择配置。这个工具会耗费用户太多时间,除非万不得以(你的编译主机不支持其他配置工具)一般不建议使用。
  用户还可以使用利用ncurse库编制的图形界面工具,这就是大名鼎鼎的:
  make menuconfig
  相信以前对2.4内核比较熟悉的用户一定不会陌生。当然在2.6内核中提供了更漂亮和方便的基于X11的图形配置工具:
  make xconfig
  当用户使用这个工具对Linux内核进行配置时,界面下方会出现这个配置项相关的帮助信息和简单描述,当你对内核配置选项不太熟悉时,建议你使用这个工具来进行内核配置。
  当用户完成配置后,配置工具会自动生成.config文件,它被保存在内核代码树的根目录下。用户可以很容易找到它,当然用户也可以直接对这个文件进行简单的修改。但是当你修改过配置文件之后,你必须通过下面的命令来验证和更新配置:
  make oldconfig
  跟2.4版本的不同之处在于,用户不需要显示的调用make dep命令来生成依赖文件,内核会自动维护代码间的依赖关系。
  当一切工作完成以后,用户只需要简单键入make,剩下所有的工作makefile就会自动替你完成了。
  3 Makefile编译流程
  当用户使用Linux的Makefile编译内核版本时,Makefile的编译流程如下:
  Ø 使用命令行或者图形界面配置工具,对内核进行裁减,生成.config配置文件
  Ø 保存内核版本信息到 include/linux/version.h
  Ø 产生符号链接 include/asm,指向实际目录 include/asm-$(ARCH)
  Ø 为最终目标文件的生成进行必要的准备工作
  Ø 递归进入 /init 、/core、 /drivers、 /net、 /lib等目录和其中的子目录来编译生成所有的目标文件
  Ø 链接上述过程产生的目标文件生成vmlinux,vmlinux存放在内核代码树的根目录下
  Ø 最后根据 arch/$(ARCH)/Makefile文件定义的后期编译的处理规则建立最终的映象bootimage,包括创建引导记录、准备initrd映象和相关处理
  4 Makefile关键规则和定义描述
  1) 目标定义
  目标定义是Makefile文件的核心部分,目标定义通知Makefile需要生成哪些目标文件、如何根据特殊的编译选项链接目标文件,同时控制哪些子目录要递归进入进行编译。
  这个例子Makefile文件位于/fs/ext2目录 :
  #
  # Makefile for the linux ext2-filesystem routines.
  #
  obj-$(CONFIG_EXT2_FS) += ext2.o
  ext2-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \
  ioctl.o namei.o super.o symlink.o
  ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o
  ext2-$(CONFIG_EXT2_FS_POSIX_ACL) += acl.o
  ext2-$(CONFIG_EXT2_FS_SECURITY) += xattr_security.o
  ext2-$(CONFIG_EXT2_FS_XIP) += xip.o
  这表示与ext2相关的目标文件由 ext2-y定义的文件列表组成,其中ext2-$(*)是由内核配置文件.config中的配置项决定,最终Makefile会在这个目录下统一生成一个目标文件ext2.o(由obj-$(CONFIG_EXT2_FS)决定)。其中obj-y表示为生成vmlinux文件所需要的目标文件集合,具体的文件依赖于内核配置。
  Makefile会编译所有的$(obj-y)中定义的文件,然后调用链接器将这些文件链接到built-in.o文件中。最终built-in.o文件通过顶层Makefile链接到vmlinux中。值得注意的是$(obj-y)的文件顺序很重要。列表文件可以重复,文件第一次出现时将会链接到built-in.o中,后来出现的同名文件将会被忽略。文件顺序直接决定了他们被调用的顺序,这一点读者需要特别注意。
  读者可能会在某些Makefile中发现lib-y定义,所有包含在lib-y定义中的目标文件都将会被编译到该目录下一个统一的库文件中。值得注意的是lib-y定义一般被限制在 lib 和arch/$(ARCH)/lib 目录中。
  体系makefile文件和顶层makefile文件共同定义了如何建立vmlinux文件的规则。
  $(head-y) 列举首先链接到vmlinux的对象文件。
  $(libs-y) 列举了能够找到lib.a文件的目录。
  其余的变量列举了能够找到内嵌对象文件的目录。
  $(init-y) 列举的对象位于$(head-y)对象之后。
  然后是如下位置顺序:
  $(core-y), $(libs-y), $(drivers-y) 和 $(net-y)。
  顶层makefile定义了所有通用目录,arch/$(ARCH)/Makefile文件只需增加体系相关的目录。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !