没有合适的资源?快使用搜索试试~ 我知道了~
kbuild实现分析 linux系统编译的详细过程 很透彻
需积分: 33 4 下载量 109 浏览量
2012-03-27
18:27:31
上传
评论
收藏 1.26MB PDF 举报
温馨提示
试读
93页
linux系统编译的详细过程 非常之透彻
资源推荐
资源详情
资源评论
目目目录 目录
目目目录录录
1 前前前言言言 4
2 概概概述述述 4
3 kbuild简简简介介介 5
3.1 kconfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.1 kconfig的结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.2 kconfig language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.1.3 kconfig的解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2 kbuild . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2.1 kbuild组成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2.2 kbuild文件功能说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4 kbuid中中中用用用到到到的的的主主主要要要make知知知识识识 9
4.1 Makefile概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.2 Makefile的执行过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.3 规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.3.1 伪目标.PHONY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.3.2 多规则目标 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.3.3 静态模式(Static Pattern rules) . . . . . . . . . . . . . . . . . . . . . . 14
4.3.4 ::规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.4 命令和变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.4.1 命令回显 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.4.2 命令的执行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.4.3 定义命令包(Defining Canned Command Sequences) . . . . . . . . . . 18
4.4.4 变量的替换引用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.4.5 目标指定变量和模式指定变量 . . . . . . . . . . . . . . . . . . . . . 19
4.5 call函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5 kbuild targets实实实现现现分分分析析析 21
5.1 kbuild targets和命令行概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.2 %config target的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.3 mixed-target的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.4 编译输出和源代码目录的分离 . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.5 make和make all . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.6 vmlinux目标实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.6.1 vmlinux所涉及的变量 . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.6.2 vmlinux的规则链 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.6.3 vmlinux的链接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.7 modules target实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.7.1 modules变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.7.2 modules规则链 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1
目录 目录
5.8 EXTMOD target实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.8.1 EXTMOD命令行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.8.2 EXTMOD编译的前提条件 . . . . . . . . . . . . . . . . . . . . . . . 36
5.8.3 EXTMOD目标的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.9 Single target实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.9.1 Single target的命令行 . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.9.2 Single target的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
6 kbuild Makefile的的的实实实现现现分分分析析析 39
6.1 Built-in object goals - obj-y . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.2 模块目标(Loadable modules goal- obj-m) . . . . . . . . . . . . . . . . . . . . 43
6.2.1 make modules执行过程 . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.2.2 External module执行过程 . . . . . . . . . . . . . . . . . . . . . . . . 44
6.2.3 Single object模块编译 . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.2.4 Composite object模块编译 . . . . . . . . . . . . . . . . . . . . . . . 45
6.2.5 Makefilemod.post实现分析 . . . . . . . . . . . . . . . . . . . . . . . 45
6.3 Descending down in directories . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.4 Library file goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.4.1 一个lib.a的例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.4.2 lib.a的实现分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.5 Hostprog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.5.1 hostprog分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.5.2 单个.c编译的hostprog . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.5.3 多个.o链接而成的hostprog . . . . . . . . . . . . . . . . . . . . . . . 50
6.5.4 objs中包含<hostprog>-cxxxobjs . . . . . . . . . . . . . . . . . . . . . 50
6.5.5 objs中包含share libarary . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.5.6 hostprog的执行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.5.7 hostprog的Descending down . . . . . . . . . . . . . . . . . . . . . . . 53
6.5.8 hostprog-y和hostprog-m . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.6 Makefile.clean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.6.1 clean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.6.2 Makefile.clean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.6.3 mrproper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.6.4 distclean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.6.5 EXTMOD clean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.7 Architecure Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.7.1 平台相关的变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.7.2 平台相关的目标 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.7.3 其他辅助变量和目标 . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.8 modules_install . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.8.1 make modules_install . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.8.2 make M=dir modules_install . . . . . . . . . . . . . . . . . . . . . . . 61
2
目录 目录
6.8.3 Makefile.modinst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.9 kbuild.include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.9.1 echo_cmd和cmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.9.2 if_changed* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.9.3 if_changed* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7 kbuild相相相关关关专专专题题题 64
7.1 Dependency tracing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
7.1.1 kbuild dependency tracing . . . . . . . . . . . . . . . . . . . . . . . . 64
7.1.2 普通的dependency tracing . . . . . . . . . . . . . . . . . . . . . . . . 68
7.2 Moduleversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
7.2.1 编译单个.o中的Moduleversion . . . . . . . . . . . . . . . . . . . . . 68
7.2.2 编译模块.ko中的Moduleversion . . . . . . . . . . . . . . . . . . . . 70
7.3 kallsyms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.3.1 kallsyms简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.3.2 scripts/kallsym . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.3.3 kernel image和kallsyms的链接 . . . . . . . . . . . . . . . . . . . . . 77
7.3.4 kallsyms应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.4 i386 bzImage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.4.1 bzImage概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.4.2 arch/i386/boot/setup.bin . . . . . . . . . . . . . . . . . . . . . . . . . 80
7.4.3 arch/i386/boot/vmlinux.bin . . . . . . . . . . . . . . . . . . . . . . . . 85
7.4.4 bzImage的链接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
7.5 Relocatable kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
7.5.1 Relocatable kernel简介 . . . . . . . . . . . . . . . . . . . . . . . . . . 87
7.5.2 相关配置选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
7.5.3 实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8 kbuild总总总结结结 91
8.1 kbuild中的设计思想 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
8.2 kbuild同2.4相比的改进 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
9 后后后记记记 92
3
2
概述
1 前前前言言言
人 们在很多电影和小说中常 常会见到这样的角色:一个受人轻视的落魄小人物,起
初别人只是丢给他几个琐碎的任 务, 不经意间,他却成了掌控整个局势的显赫人 物。 最
著名的莫过于圣经里的约瑟( joseph ), 就连名噪一时的“肖申克的救赎”( The Shawshank
Redemption )中的男主角 Andy Dufresne 身上都闪耀着 joseph 的影子(当然还有摩西)。
make 在一个 复杂项目中扮演的角 色,也大体类似,从 简单琐碎被人忽视开 始,到控制
项目中的每个细节结束。 kbuild 之于 kernel 也正是如此。
当 kbuild 本身也成为一个复杂的系统 (big monster) 时,分析和了解 kbuild 也就有了
更多的现实意义。不同的用户对 kbuild 的需求不同, 相应地对 kbuild 需要了解的程度也
就不同。
• 对于普通用户(编个 kernel image 之类)而言,kbuild只是意味着一些 targets(make
menuconfig; make) , make help 足以帮助他们搞定一切,他们不需要了解除此之外
的任何东西,就像吃个鸡蛋并不需要了解蛋是如何长出来的。
• 对于 普通的开发者( kernel feature, driver )或者平台 porting 的开发者而言, kbuild 也
只是意味着一些实现友好的接口,他 们需要对某些实现 细节(如何使用 obj-y,obj-
m )略知一二,但是并不需要关心为什么这么做( why ),只需要知道怎么去做( how
to do it )。Documentaton/kbuild/文档可以满足以上绝大部分人的需求。
• 然而,对于那些好奇心特别重,想知道 Linux 世界为什么如 此奇妙的人来说,或
者对于那些真正需要自己设计 building system 想从 kbuild 借鉴点什么的人来说,
基本上没有比 RTFSC(Read The Fucking Source Code) 更好的选择。
关于 user 和 kbuild 的关系,详见[4, makefile.txt, Section2 ,who does what ]
2 概概概述述述
本文主要侧重于 kbuild 的实现分析,希望能从一个 building system 设计者的 角度来
更好地了解 kbuild 的实现和背后的设计思想。本文的主要内容大致可分为5大部分:
• Part1 . chapter1, kbuild 的架构和各个部分的简介。
• Part2 . chapter2, kbuild 常用到的 makefile 基础知识,了解这部分有助于我们对
kbuild 具体实现的分析, 事实上完整通读并理解了 make info page 的人完全可以忽
略这一部分。
• Part3 . kbuild 主要功能的分析。我们知道,一份代码运 行的时候更多得是以立体
的方式表现出来的, 而平面 的逐行的注释很难清楚地解释 其全部功能,因此,我们
采用得是从功能的角度来解释其实现,这一部分分为两章:
– Chapter3 . 主要分析 kbuild 提供的各类 targets 实现,基本上不涉及 kbuild 规
则的实现
– chapter4 . 将以源代码树下的具体 Makefile 为分析对象,详细分析 kbuild 的
各种规则文件.
• Part4 . chapter5, kbuild 专题。 单纯讲述 kbuild 而不涉及到一些专题是不可能
的,如依赖关系生成,模块版本支持( CONFIG_MODULEVERSION ), kallsyms,
bzImage, relocatable kernel 等,这些都和 kbuild 紧密联系在一起. 这些主题同时也
会涉及到一些工具程序: fixdep, modpost, kallsyms, relocs 等。
• Part5 . chapter6 , 一些 kbuild 设计思想的总结以及自2.4系列以来的改进。
本文所分析的 kbuild kernel 版本为 2.6.23.1 , GNU make 版本为 3.81 .
4
剩余92页未读,继续阅读
资源评论
xiaomu2007111222
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 徐州市区shp边界文件
- 简易数字频率计设计(原理图、PCB、源码、分析报告)
- 20225207038罗丽文财管专2201班.rar
- Golang:通过Gin框架+Redis+责任链,实现一个简单的钉钉机器人,进行消息处理 ps:多应用版
- 基于cnn和AlexNet的铝材缺陷检测内含数据集和demo原型2种方法
- 2023年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
- go 语言 实现的 使用modbus 协议 通过DTU tcp 链接 采集数据
- SHELL脚本(全是干货)
- Windows屏幕录屏软件
- 2022年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功