曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5712|回复: 0
打印 上一主题 下一主题

[Kernel] vmlinux-init, vmlinux-main

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-7-19 20:24:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Makefile 对应内核版本:2.6.35.13

vmlinux-init 和 vmlinux-main 是 vmlinux 目标的两个依赖。在顶层 Makefile 中有一段注释图:
# vmlinux
#   ^
#   |
#   +-< $(vmlinux-init)
#   |   +--< init/version.o + more
#   |
#   +--< $(vmlinux-main)
#   |    +--< driver/built-in.o mm/built-in.o + more
它们的定义为:
[code=Makefile]vmlinux-init := $(head-y) $(init-y)
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)[/mw_shl_code]
上面 $(head-y) 变量一般定义在与架构相关的 Makefile 中,比如在 x86 上,它定义在 arch/x86/Makefile 里:
[code=Makefile]###
# Kernel objects

head-y := arch/x86/kernel/head_$(BITS).o
head-y += arch/x86/kernel/head$(BITS).o
head-y += arch/x86/kernel/head.o
head-y += arch/x86/kernel/init_task.o[/mw_shl_code]
head-y 所代表的对象文件一般放在编译出来的内核镜像文件的前面部分。

除去 $(head-y) 外,其它的 $(init-y),$(core-y), $(libs-y), $(drivers-y) 和 $(net-y) 这些变量都定义在顶层 Makefiel 中,它们一开始都被定义成相关的目录:
[code=Makefile]# Objects we will link into vmlinux / subdirs we need to visit
init-y          := init/
drivers-y       := drivers/ sound/ firmware/
net-y           := net/
libs-y          := lib/
core-y          := usr/
... ...
core-y          += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
[/mw_shl_code]
这里需要注意,上面这些定义在顶层 Makefile 中变量所表示的内容是与架构无关的,也就是任何架构都需要它们。但是在架构相关的 Makefile 中往往还会追加与架构相关的代码,比如在 arch/x86/Makefile 里就有:
[code=Makefile]libs-y  += arch/x86/lib/
... ...
# See arch/x86/Kbuild for content of core part of the kernel
core-y += arch/x86/[/mw_shl_code]

上面的变量只是初始设置,在编译 vmlinux 中,后面还会对这些指代不同目录的变量进行重新设置,在顶层 Makefile 中会看到:
[code=Makefile]
init-y          := $(patsubst %/, %/built-in.o, $(init-y))
core-y          := $(patsubst %/, %/built-in.o, $(core-y))
drivers-y       := $(patsubst %/, %/built-in.o, $(drivers-y))
net-y           := $(patsubst %/, %/built-in.o, $(net-y))
libs-y1         := $(patsubst %/, %/lib.a, $(libs-y))
libs-y2         := $(patsubst %/, %/built-in.o, $(libs-y))
libs-y          := $(libs-y1) $(libs-y2)[/mw_shl_code]
以 init-y 来说,它由原先指代目录,现在变成了指代该目录下的 built-in.o 文件了---几乎任何一个目录下都能看到 built-in.o 这个文件。在 x86 下,在 arch/x86/lib/ 和 lib/ 这两个目录下,还会看到 lib.a 这个库文件。在构建内核时,内核构建系统会一一产生这些 built-in.o,lib.a 以及其它一些对象文件,最后会将它们全部链接起来,从而形成 vmlinux 镜像文件。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 03:05 , Processed in 0.078791 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表