没有合适的资源?快使用搜索试试~ 我知道了~
(1)vmlinux-lds:链接脚本确认,在最后阶段需要使用到 (4) kallsyms.o在2.6内核中,为了更好的调试内核,引入了kallsyms机制 (
资源详情
资源评论
资源推荐
Linux 内核编译流程
1.Linux 内核 makefile 文件组成
Makefile.host 本机编译工具(hostprog-y)的编译规则。
Makefile.modpost 块编译的第二阶段,由.o 和.mod 生成.ko 时使用的规则。
Linux 内核 Makefile 体系核心的 Makefile 文件就两个:顶层 Makefile、
scripts/Makefile.build。
子目录中的 Makefile、kbuild 不是 Makefile 文件(完整的 Makefile 文件),只能算作
是 Makefile 的包含文件。
顶层 Makefile 文件负责将各个目录生成的*.built-in.o、lib.a 等文件连接到一起。而
scripts/Makefile.build 包含子目录中的 Makefile 文件来生成这些*.built-in.o、lib.a、
*.o 等文件。
2.linux 内核 make 过程分析
2.1 整体分析
当执行 make uImage 时,uImage 并不在顶层的 makefile 中定义,而是在
arch/arm/Makefile 中定义。
#顶层 makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
include $(srctree)/arch/$(ARCH)/Makefile
在 arch/arm/makefile 中可以找到 uImage 的定义。
#arch/arm/Makefile
zImage Image xipImage bootpImage uImage: vmlinux
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
可见 uImage 依赖于 vmlinux,vmlinux 在顶层 makefile 中定义,最后执行后面的命令
完成编译。
2.2 vmlinux 的生成
2.2.1 vmlinux 的依赖
vmlinux 依赖$(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o)这些目标。
#顶层 makefile
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o)
FORCE
下面来逐个分析这些依赖目标。
(1)vmlinux-lds:
链接脚本确认,在最后阶段需要使用到。
#顶层 makefile
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
(2)vmlinux-init:
vmlinux-init 依赖$(head-y)和$(init-y)
#顶层 makefile
vmlinux-init := $(head-y) $(init-y)
#一开始 init-y 是个目录
init-y := init/
#后续把 init-y 变量中所有符合%/的替换为%/built-in.o,这句之后 init-y 被赋值为
init/built-in.o
init-y := $(patsubst %/, %/built-in.o, $(init-y))
#arch/arm/Makefile
head-y := arch/arm/kernel/head$(MMUEXT).o
arch/arm/kernel/init_task.o
所以最终 vmlinux-init 实际上是:
1. arch/arm/kernel/head.o(这是 Image/vmlinux 的入口代码)。
2. arch/arm/kernel/init_task.o
3. init/built-in.o
三者链接而来的。
(3)vmlinux-main
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
可以看到 vmlinux-main 有四个依赖选项。
core-y := usr/
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2440/
core-y := $(patsubst %/, %/built-in.o, $(core-y))
编译内核的话,core-y 最终包含: usr/ kernel/ mm/ fs/ ipc/ security/ crypto/ block/目录
下的 built-in.o。
除此之外,core-y 还包含体系结构相关的 arch/arm/kernel mm、common 以及具体芯片
相关的:mach-xxx,plat-xxx 目录下 built-in.o 文件。
libs-y := lib/
libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
libs-y := $(libs-y1) $(libs-y2)
libs-y 也是包含具体体系结构相关的库,并且包括 lib.a 和 built-in.o 两个文件。
drivers-y := drivers/ sound/
drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
drivers-y 值最终等于 drivers/built-in.o sound/built-in.o
net-y := net/
net-y := $(patsubst %/, %/built-in.o, $(net-y))
net-y 最终等于 net/built-in.o。
vmlinux-main 是由以下四个目标组成的:
core-y:
包含体系结构无关的 usr/ kernel/ mm/ fs/ ipc/ security/ crypto/ block/ 目录下的 built-
in.o 文件(如果是编译 module,则只包含 usr/built-in.o)。
剩余14页未读,继续阅读
嘻嘻哒的小兔子
- 粉丝: 25
- 资源: 321
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0