qemu源码分析之Makefile

通过分析qemu的Makefile可以了解qemu代码的组织方式以及qemu功能模块的划分,一方面,有助于理解qemu源代码设计思路,另一方面,有助于根据需求裁剪qemu代码,生成精简的符合制定要求的qemu。

为了更好的理解qemu的Makefile的设计,对于不熟悉makefile语法规则的同学建议阅读下面两篇文章:

1. 《Makefile常用函数分析》

2. 《跟我一起写makefile》

 

----------------------------------------------------------------------------------------

/*qemu的Makefile的依赖目标之间的关系*/

p, li { white-space: pre-wrap; }

all:build-all                                           (1)

 

build-all:$(TOOLS) recurse-all                          (2)

 

recurse-all: $(SUBDIR_RULES) $(ROMSUBDIR_RULES)         (3)

p, li { white-space: pre-wrap;SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))     (4)

ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS))      (5)

 

subdir-%: $(GENERATED_HEADERS)                          (6)

$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $* V="$(V)" TARGET_DIR="$*/" all,)

romsubdir-%:                                            (7)

$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pc-bios/$* V="$(V)" TARGET_DIR="$*/",)

上面即是qemu简化版的Makefile,下面就来详细分析下上面规则的含义。

-------------------------------------------------------------------------------------------

p, li { white-space: pre-wrap; }

SRC_PATH=/home/src/qemu-0.15.1

TOOLS=qemu-ga qemu-nbd qemu-img qemu-io  /*规则(2)中TOOLS的定义*/

TARGET_DIRS=i386-softmmu                 /*规则(4)中TARGET_DIRS的定义*/

ROMS=optionrom                           /*规则(5)中ROMSUBDIR_RULES的定义*/

--------------------------------------------------------------------------------------------

上述规则中最重要的规则就是两个函数的调用: p, li { white-space: pre-wrap; }

subdir-%: $(GENERATED_HEADERS)

$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $* V="$(V)" TARGET_DIR="$*/" all,)

上面规则等价于:

make --no-print-directory -C i386-softmmu V="" TARGET_DIR="i386-softmmu/" all

回想make -C的常用格式:

make -C path 参数

则上面规则的含义为:执行i386-softmmu下的Makefile中的依赖目标all, 传递的参数是V=""和TARGET_DIR="i386-softmmu/"

romsubdir-%:

$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pc-bios/$* V="$(V)" TARGET_DIR="$*/",)

与subdir-i386-softmmu一样,上面规则的含义就是:执行pc-bios/下的所有依赖目标,传递的参数为 V="$(V)" TARGET_DIR="$*/",需要注意的是这里的$*代表的是不包含扩展名的目标文件的名称。

自此,Makefile就进入了i386-softmmu和pc-bios两个目录下,执行相对应的Makfile

 

---------------------------------------------------------------------------------------------

从i386-softmmu/Makefile中能够清晰的找出哪些代码完成了qemu哪些功能模块的仿真。

1. cpu功能模块的仿真

libobj-y = exec.o translate-all.o cpu-exec.o translate.o

libobj-y += tcg/tcg.o

libobj-y += fpu/softfloat.o

libobj-y += op_helper.o helper.o

ifeq ($(TARGET_BASE_ARCH), i386)

libobj-y += cpuid.o

endif

libobj-$(CONFIG_NEED_MMU) += mmu.o

libobj-$(TARGET_ARM) += neon_helper.o iwmmxt_helper.o

 

libobj-y += disas.o

2. 硬件设备的仿真

# Hardware support

obj-i386-y += vga.o

obj-i386-y += mc146818rtc.o i8259.o pc.o

obj-i386-y += cirrus_vga.o sga.o apic.o ioapic.o piix_pci.o

obj-i386-y += vmport.o

obj-i386-y += device-hotplug.o pci-hotplug.o smbios.o wdt_ib700.o

obj-i386-y += debugcon.o multiboot.o

obj-i386-y += pc_piix.o

obj-i386-$(CONFIG_KVM) += kvmclock.o

obj-i386-$(CONFIG_SPICE) += qxl.o qxl-logger.o qxl-render.o

3. qemu中平台无关的代码(平台共用代码)

translate.o: translate.c cpu.h

 

translate-all.o: translate-all.c cpu.h

 

tcg/tcg.o: cpu.h

 

# HELPER_CFLAGS is used for all the code compiled with static register

# variables

op_helper.o user-exec.o: QEMU_CFLAGS += $(HELPER_CFLAGS)

 

# Note: this is a workaround. The real fix is to avoid compiling

# cpu_signal_handler() in user-exec.c.

signal.o: QEMU_CFLAGS += $(HELPER_CFLAGS)

 

4. kvm相关代码

obj-$(CONFIG_KVM) += kvm.o kvm-all.o

obj-$(CONFIG_NO_KVM) += kvm-stub.o

根据./configure时不能模块的使能,此Makefile还有其他功能模块,这些功能模块对应的代码在这里一目了然,能够有效的提高对qemu代码理解和裁剪的效率。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值