目录

  • Linux内核Makefile作用
  • Linux内核Makefile文件分类
  • Makefile解析
  • 子目录的Makefile
  • 架构下面的Makefile
  • 顶层Makefile
  • Make解析
  • 总结

Linux内核Makefile作用

Linux内核Makefile文件分类

Makefile解析

详细的解释可以看/Documentation/kbuild/makefiles.txt

子目录的Makefile

子目录的makefile形式简单,诸如下:

obj-$(CONFIG_DM9000) += dm9dev9000c.o

然后 CONFIG_DM9000是在auto.conf中定义,他是由.config中定义为y(内核文件)或者m(编译为.ko模块),所以也就是形如

obj-y += xxx.o
obj-m += xxx.o
如果没有被定义则是
obj - +=xxx.o 不被处理

架构下面的Makefile

arch/arm/Makefile

我们执行命令make uImage并不在顶层的makefile,而是在架构下面的makefile,所以它一定会被顶层的makefile包含

zImage Image xipImage bootpImage uImage: vmlinux$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

顶层Makefile

搜索下arch,在顶层的Makefile中找到包含了架构下的Makefile

include $(srctree)/arch/$(ARCH)/Makefile
export KBUILD_DEFCONFIG

可以继续搜发现同时定义了arm架构,这是在补丁文件修改的

#ARCH       ?= $(SUBARCH)
ARCH        ?= arm
CROSS_COMPILE   ?= arm-linux-

同时搜索下.config文件生成的auto.conf,也在顶层包含

ifeq ($(dot-config),1)
# Read in config
-include include/config/auto.conf

Make解析

总结:最终在各个目录下生成built-in.o,根据arch/$(ARCH)/kernel/vmlinux.lds的链接脚本链接

uiamge依赖于vmlinux,uImage实际就是头部信息加上一个真正的内核,也就是vmlinux就是真正的内核

zImage Image xipImage bootpImage uImage: vmlinux$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

可以发现在顶层makefile存在以下,也就是说这也是默认的目标文件

all: vmlinux

继续搜索目标vmlinux的依赖

# vmlinux image - including updated kernel symbols
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
ifdef CONFIG_HEADERS_CHECK$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif$(call if_changed_rule,vmlinux__)$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@$(Q)rm -f .old_version

其中相关变量继续搜索如下

vmlinux-init := $(head-y) $(init-y)
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
vmlinux-all  := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds  := arch/$(ARCH)/kernel/vmlinux.lds
# vmlinux-lds:链接脚本。
# vmlinux-init:一些初始化代码。
# vmlinux-main:一些主要的代码(与内核核心相关的)。

vmlinux-init

#顶层 /makefile
init-y      := init/
init-y      := $(patsubst %/, %/built-in.o, $(init-y))
# 相当于 init-y =  init/built-in.o#架构 arch/arm/makefile
head-y      := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
#这里MMUEXT 并没有被定义,也就是最终就是 arch/arm/kernel/head.o  arch/arm/kernel/init_task.o

patsubst分析

格式:$(patsubst <pattern>,<replacement>,<text> )
名称:模式字符串替换函数——patsubst。
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。
  • pattern=%/在这里应该是匹配所有的意思
  • replacement=%/built-in.o
  • text=init/

也就是说在init/下的所有文件名都被替换为+built-in.o,视频讲的是最后会被编译为built-in.o,也就是相当于init-y = init/built-in.o

vmlinux-main

core-y 内核

vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
# core-y
core-y := usr/
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
core-y := $(patsubst %/, %/built-in.o, $(core-y))

这里也用到了patsubst替换,也就是将上述目录下的文件编译为built-in.o,最终相当于

core-y = usr/built-in.o
+= kernel/built-in.o
+= mm/built-in.o
+= fs/built-in.o
+= ipc/built-in.o
+= security/built-in.o
+= crypto/built-in.o
+= block/built-in.o

libs-y 库

libs-y      := lib/
# 在lib/中查找 替换为lib.a
libs-y1     := $(patsubst %/, %/lib.a, $(libs-y))
# 在lib/中查找 替换为built-in.o
libs-y2     := $(patsubst %/, %/built-in.o, $(libs-y))
# 最终生成 built-in.o 和 lib.a
libs-y      := $(libs-y1) $(libs-y2)

同样的,也就是在最终生成built-in.o和 替换为lib.a

drivers-y 驱动

drivers-y := drivers/ sound/ #(依赖了这两个目录)
drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))

同样的,也就是在最终生成built-in.o

net-y 网络

net-y := net/
net-y := $(patsubst %/, %/built-in.o, $(net-y))

同样的替换,生成built-in.o

总结

从以上分析makefile可以两大结果:第一个文件和链接脚本,以后分析内核流程可以根据第一个文件顺藤摸瓜一路跟踪下去,链接脚本决定了内核里的各个段是如何分布的,而每个段的文件顺序就是上面文件顺序。

内核启动流程分析(三)makefile相关推荐

  1. 一起分析Linux系统设计思想——03内核启动流程分析(六)

    在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习.我的使命就是过滤掉大量的垃圾信息,将知识体系化,以短平快的方式直 ...

  2. 内核启动流程分析(四)源码浅析

    目录 kernel(四)源码浅析 建立工程 启动简析 head.s 入口点 查询处理器 查询机器ID 启动MMU 其他操作 start_kernel 处理命令行 分区 kernel(四)源码浅析 建立 ...

  3. 内核启动流程分析(一)编译体验

    目录 2.打补丁 3.配置 总结 配置方式 配置体验 4.编译 链接 链接脚本 5.烧写内核 1.总体概述 2.打补丁 解压 tar xjf linux-2.6.22.6.tar.bz2 打补丁,ca ...

  4. Linux内核启动流程分析(一)【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-3380535.html 很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下.由于是word直接 ...

  5. 低温linux内核启动readl,Linux内核启动流程分析(一)

    很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下.由于是word直接粘过来的有点乱,敬请谅解! S3C2410 Linux 2.6.35.7启动分析(第一阶段) 1.依据arch/ar ...

  6. 韦东山衔接班——3.4_linux内核启动流程分析之内核启动

    作者:GWD 时间:2018.8.25 一.汇编部分到第一个C之前准备 1.问:内核的工作 答 2.问:为什么有两个head.S 答:其中一个是自解压代码,运行时先解压内核 3.uboot中将参数写入 ...

  7. Linux内核启动流程分析(二)【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-3380544.html S3C2410 Linux 2.6.35.7启动分析(第二阶段) 接着上面的分析,第 ...

  8. 内核启动流程分析(二)配置详解

    总体概述 配置详解 配置的最终目的,是生成了.config文件,查看下这个文件, # # Automatically generated make config: don't edit # Linux ...

  9. Linux内核启动流程(简介)

    1. vmlinux.lds 首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的: 第 ...

最新文章

  1. 自动驾驶技术如何升级?这份技能图谱为你指路
  2. 仓鼠体重年龄对照表_各年龄段血糖,血压,血脂,尿酸对照表,内容太值!
  3. 很多人都不知道,其实博客园给我们博客开了二级域名
  4. 转载:掩膜矩阵操作数学解释(权重表,锐化)
  5. 第一行代码学习笔记第二章——探究活动
  6. C语言程序设计 | 大端小端存储解析以及判断方法
  7. 迁移pg_PG奥斯卡!云数据库专属集群MyBase荣获2020 PG亚洲大会“年度最佳产品奖”...
  8. 三十四 操作文件和目录
  9. 从单体到Flink:一文读懂数据架构的演变
  10. 【性能优化】PHP代码输出压缩后HTML
  11. Linux驱动开发经典书籍
  12. php yield 个人小解_PHP中的性能优化利器:生成器 yield 理解
  13. 使用SSH从服务器下载文件
  14. 决策树后剪枝算法(二)错误率降低剪枝REP
  15. endnote使用方法大全,endnote教程
  16. Ubuntu编译OpenPose的一些坑(附可能涉及的码云地址)
  17. 【英语四六级-必背单词】高中英语单词 (D)-MP3试听与下载
  18. 将一颗树反转为其镜像
  19. 《The Zen of Python, Explained》Posted by Al Sweigart in python - 中译版
  20. DNS --域名系统

热门文章

  1. maven + bat 实现快速编译打包模块代码
  2. PHP基础班初学心得:脑洞实验-JS变量存储函数与return的一些问题
  3. POJ 3034 Whac-a-Mole(DP)
  4. HDU-4568 Hunter 状态压缩
  5. 9月22日培训日记(上)
  6. 聚类Introducion
  7. Python (2) 除法
  8. Appium进行iOS自动化测试时遇到的问题及解决办法
  9. 每天一个设计模式,工厂方法模式(Factory Method)
  10. 基础回顾之List集合