博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux内核Makefile编译生成内核目标文件的过程
阅读量:7028 次
发布时间:2019-06-28

本文共 3407 字,大约阅读时间需要 11 分钟。

 

#based on v2.6.26 kernel

Linux内核Makefile编译生成内核目标文件的过程

直接执行make的编译过程

  • 1.先找到入口点()

    #编译内核line502,直接执行make默认编译此项 all: vmlinux   #编译模块line1037,选择编译模块的话会到这里,另外还有其他许多all:target存在,为什么默认执行all: vmlinux ? all: modules
  • 2.继续找vmlinux目标
    # vmlinux image - including updated kernel symbols # vmlinux目标在line806 vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE # FORCE是伪目标,make假定伪目标的时间戳总是最新的,即总是被修改过,因此以它为“依赖”的“目标”“vmlinux”在每次make的时候都会被编译。
  • 3.理解$(vmlinux-lds) $(vmlinux-init) $(vmlinux-main)这个变量的作用
    # line656 vmlinux-init := $(head-y) $(init-y) # -y是指配置为yes表示加入内核,-m是指配置为module,-n是指配置为no表示不加入内核 vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y) vmlinux-all  := $(vmlinux-init) $(vmlinux-main) vmlinux-lds  := arch/$(SRCARCH)/kernel/vmlinux.lds # SRCARCH为体系结构名,这里我们使用x86

生成的vmlinux.lds目标文件是链接生成vmlinux映像的链接描述文件ld script,从该文件中我们大致可以知道vmlinux映像的头部是$(head-y) $(init-y),vmlinux映像的主体部分是$(core-y) $(libs-y) $(drivers-y) $(net-y)等.具体我们可以仔细研究.

vmlinux映像 #################################################### #             #                                    # #  $(head-y)  #  $(core-y) $(libs-y)               # #  $(init-y)  #  $(drivers-y) $(net-y),etc.        # #             #                                    # ####################################################
  • 找出$(vmlinux-init)或者说$(head-y) $(init-y)包含那些文件

先找init-y,轻易搞定如下:

# line452 init-y          := init/ # line621 init-y          := $(patsubst %/, %/built-in.o, $(init-y)) ## 表示将$(init-y)列表中"/"替换为"/built-in.o",也就是最终init-y == init/built-in.o

init/built-in.o目标在init目录下生成,其中包含start_kernel函数,这个函数是从启动代码进入linux kernel的点.

在根目录下的Makefile文件中我们找不到head-y的定义,那么head-y肯定在某个被包含(include)进来的文件中. 通过搜索include我们发现head-y可能在/arch/x86/Makefile中.

# line431 include $(srctree)/arch/$(SRCARCH)/Makefile

果然,在/arch/x86/Makefile中找到head-y,

# line161 head-y := arch/x86/kernel/head_$(BITS).o ## BITS是CPU处理的位数的定义,我们使用的32位CPU,这里直接使用32来代替,文件也就是head_32.o head-y += arch/x86/kernel/head$(BITS).o # head32.o head-y += arch/x86/kernel/init_task.o
  • vmlinux映像生成的一般规则综述

通过以上分析路径

all --> vmlinux --> $(vmlinux-lds) $(vmlinux-init) --> $(head-y) $(init-y) -- --> built-in.o head32.o head_32.o init_task.o --> *.c *.S

我们可以有了一个大致的概念,那就是通过内核配置信息,我们有了xxxx-y的目标列表,通过深度遍历依次去生成这些目标,并最终生成了vmlinux.

至于内核配置信息与xxxx-y的目标列表以及依然的目录文件等,是如何映射匹配的,还需要更仔细的分析.

  • bzimage - 对vmlinux映像的后续处理

并且在/arch/x86/Makefile中我们还可以发现对vmlinux映像的后续处理部分,后续处理之后的bzimage将会是

bzimage #################################################### #         #                  #                     # #  Setup  #  uncompress code #  compressed vmlinux # #         #                  #                     # ####################################################

接下来我们看看对vmlinux映像的后续处理部分的Makefile,首先要找到起点:

# line200 of /arch/x86/Makefile #### # boot loader support. Several targets are kept for legacy purposes  boot := arch/x86/boot  PHONY += zImage bzImage compressed zlilo bzlilo \          zdisk bzdisk fdimage fdimage144 fdimage288 isoimage install  # Default kernel to build all: bzImage  # KBUILD_IMAGE specify target image being built                     KBUILD_IMAGE := $(boot)/bzImage zImage zlilo zdisk: KBUILD_IMAGE := arch/x86/boot/zImage  zImage bzImage: vmlinux         $(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE) ## 进入arch/x86/boot目录执行其Makefile         $(Q)mkdir -p $(objtree)/arch/$(UTS_MACHINE)/boot         $(Q)ln -fsn ../../x86/boot/bzImage $(objtree)/arch/$(UTS_MACHINE)/boot/bzImage  compressed: zImage

转载地址:http://ckrxl.baihongyu.com/

你可能感兴趣的文章
OkHttp源码分析
查看>>
【挖坑系列】跨域问题相关
查看>>
使用cronolog切割nginx访问日志,定时清理旧日志
查看>>
PHP最常用函数TOP100(翻译)
查看>>
大数据科学新发展展望:不得不知的四大趋势
查看>>
python多线程、锁、event事件机制的简单使用
查看>>
ES6系列之解构赋值
查看>>
goLang 文件操作之二
查看>>
7大维度看国外企业为啥选择gRPC打造高性能微服务?
查看>>
HTTP协议类
查看>>
建造者模式
查看>>
【redux篇】middleware 之 redux-thunk
查看>>
数据结构---图的相关总结
查看>>
Linux平台上部署Mongoose服务器的方法介绍
查看>>
Node中间层实践(二)——搭建项目框架
查看>>
erget源码分析(2):全局哈希基类和全局异步函数对象接口
查看>>
解码方法
查看>>
Electron入门介绍
查看>>
从egg.js重新认识node后端开发
查看>>
聊聊springboot session timeout参数设置
查看>>