通过分析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代码理解和裁剪的效率。
相关推荐
qemu源码分析--qemu是开源的二进制翻译器,支持多种平台,具有很好的移植性。
本文档是qemu以及linux kernel中kvm模块代码解析,供参考
qemu源码分享
qemu 是使用动态二进制翻译的 cpu 模拟器,它支持两种运行模式:全系统模拟和用户态模拟。在全系统模拟下,qemu 可以模拟处理器和各种外设,可以运行操作系统。...该文档对qemu关键代码进行了分析。
QEMU的关键源代码分析, 包括 内存仿真,二进制翻译,CPU仿真,初始化过程等
QEMU 0.14.0 源码 aaaaaaaaaaaaaaa
qemu-3.0.0.tar.xz是qemu官网下载下来的源码文件,编译过程参考官方文档
用于qemu虚拟机的BIOS源代码。
本人安装的心得体验,包括安装编译的全过程一步步图文介绍及安装中所遇到的系列坑,如In s无连接问题、subdir-dtc、subdir-capstone等系列问题解决及问题分析。
qemu-kvm-1.1 源码 qemu1.1 qemu1.1 源码源码 官方git下载
使用qemu虚拟机环境实现linux内核源码级的调试
qemu 启动虚拟机流程分析
qemu大神写的虚拟机源码,这个一定要推荐一下。
qemu-2.6.0模拟器源码
易语言源码控制qemu虚拟机.rar
这是qemu0.14.1的源码,最然最新的已经更新到1.4了,还是欢迎下载
详细描述当前最流行的cpu仿真器qemu核心技术:二进制动态翻译器的原理及实现
最新源代码,按照版本号来说,是稳定版。但是本人自用过程中还是有些不明因素导致运行不畅,上传上来与大家分享,希望同进步。
Qemu Manager v7.0 (April 2010) with Qemu 0.11.1 and KQEMU Support ------ windows下的qemu模拟器 QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。它与Bochs,PearPC近似,但其具有某些后两者所不...
qemu 是使用动态二进制翻译的 cpu 模拟器,它支持两种运行模式:全系统模拟和用户态模拟。在全系统模拟下,qemu 可以模拟处理器和各种外设,可以运行操作系统。用户态可以运行为另外一种 cpu 编译的进程,前提是两者...