`
被触发
  • 浏览: 36292 次
文章分类
社区版块
存档分类
最新评论

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代码理解和裁剪的效率。

分享到:
评论

相关推荐

    linux 2.6 kernel移植到QEMU Mips的源代码文档。

    - 在 `Makefile` 文件中,找到 `obj-$(CONFIG_MTD_CDB89712)`,在其后添加 `obj-$(CONFIG_MTD_QEMU_EMUFLASH) += qemuflash.o`。 **构建步骤 4**:理解 `qemuflash.c` 文件 - `qemuflash.c` 文件中注释说明了各个...

    linux 2.6 kernel移植到QEMU Mips的源代码文档. (更新版本)

    5. **文件系统分析**: - 公司文件系统包含四个 MTD 分区: - BusyBox => MTD1 - 内核 => MTD2 - 工作目录 => MTD3 - jffsetc 文件夹 => MTD4 - 此步骤的目标是挂载这四个分区。 6. **挂载磁盘映像和网络支持...

    重庆大学操作系统实验源码和答案.zip

    重庆大学提供的这个“操作系统实验源码和答案”压缩包,显然是为了教学目的,让学生通过实践来理解操作系统的原理和实现。下面将详细讲解其中包含的文件和可能涉及的知识点。 1. **Makefile.inc 和 Makefile**: 这...

    Bootloader版源码

    Bootloader是嵌入式系统和计算机硬件启动过程中至关重要的第一段软件代码,它负责初始化硬件设备,设置内存管理单元(MMU),...通过分析和修改Bootloader源码,我们可以定制自己的启动流程,以满足特定项目的需求。

    内核编译安装与调试相关问题与解决方法(1)

    内核源码可以从官方网站下载,以确保源码的完整性和安全性。在Ubuntu 18.04等Linux发行版中,使用make modules_install和make install命令安装模块和内核时,需要管理员权限,通常通过sudo命令来获取。 对于多核CPU...

    linux-0.12.zip

    接下来,我们需要配置编译环境,这通常包括GCC编译器、Makefile配置以及相关的交叉编译工具链。对于Windows用户,可能需要安装Cygwin或MinGW来提供类Unix的开发环境。 编译Linux内核的过程分为几个步骤:配置、编译...

    geekos-0.3.0.rar

    3. **源码分析** - **结构化编程**:GeekOS源码遵循清晰的模块化设计,每个项目都有明确的职责划分,便于理解和修改。 - **汇编与C语言结合**:部分关键功能如中断处理和启动加载使用汇编语言编写,其余部分使用...

    VMware-mount-loop-linux.zip

    如果涉及编译源码,那么用户还需要了解基本的编译流程,包括makefile,gcc/g++等编译器的使用。 总之,"VMware-mount-loop-linux.zip"提供的资源旨在帮助Linux用户无需启动VMware虚拟机就能访问.vmdk文件。这涉及...

    嵌入式Linux应用程序开发详解嵌入式Linux网络编程,嵌入式Linux应用程序开发详解,C,C++源码.rar

    5. **源码分析**:压缩包中的源码可能是为了示例上述概念的应用,例如,可能包含简单的网络服务器或客户端程序,展示了如何使用socket API进行网络通信,或者演示了如何在嵌入式Linux系统上编写控制硬件的驱动程序。...

    操作系统开发简单案例分享.pdf

    - **GCC (GNU Compiler Collection)**: 用于编译C、C++等语言源码。 - **Clang**: 一种基于LLVM的C/C++/Objective-C编译器,提供更好的诊断和错误提示。 - **Make**: 自动化构建系统,通过Makefile来管理软件构建...

    嵌入式LINUX教程

    学习如何从源码编译Linux内核,理解Makefile,以及如何根据需求裁剪内核配置。这包括设备驱动、文件系统、网络支持等方面的设置。 6. **文件系统制作**: 创建适合嵌入式设备的文件系统,如 BusyBox 提供基本...

    bochs-2.6.8.tar.gz

    Bochs是一款开源的、跨平台的x86模拟器,它允许用户在各种操作系统上运行x86指令集的程序,包括Linux、Windows、Mac OS X等。...此外,Bochs还可以与其他工具(如QEMU、GDB)结合使用,以实现更复杂的调试和分析任务。

    清华OS实验指导书ucore_os_docs1

    - **基于硬件模拟器实现源码级调试**:使用QEMU等模拟器进行源码级别的调试。 - **Linux环境下的源码级安装过程**:学习如何在Linux环境下从源码构建操作系统。 通过以上介绍,我们可以看出该实验指导书涵盖了操作...

    使用FreeRTOS在Linux跑的运行Demo

    4. **编译和链接**:使用交叉编译工具链对Demo源码进行编译,并链接到Linux下的模拟环境,如QEMU,或者直接在硬件板上运行。 5. **运行和调试**:通过GDB等调试工具连接到运行环境,观察任务执行情况,验证实时性。...

    TuanHADKSpecialEdition

    3. **模拟器/虚拟机**:如QEMU,允许开发者在无需实际硬件的情况下测试他们的软件。 4. **驱动程序框架**:提供编写和管理驱动程序的基本结构,比如Linux的Kernel Driver Model。 5. **设备树编辑器**:用于创建和...

    嵌入式Linux系统教学PPT

    - Linux历史与特性:开放源码、跨平台、稳定、高效。 - Linux内核:操作系统的核心,负责管理硬件资源和提供系统服务。 - Linux发行版:Ubuntu、Debian、Fedora等,针对不同应用场景。 4. **嵌入式Linux开发环境...

    NachOS 4.1 64位gcc修改版

    4. **模拟器运行**:由于 NachOS 通常是为模拟环境设计的,如QEMU,所以编译完成后,需要在模拟器中启动 NachOS 进行测试和调试。 5. **实验与调试**:通过 NachOS 提供的用户接口,执行实验,如创建进程、分配内存...

    edk10.1的实验

    7. **实例分析**:分析每个实验案例,理解其设计目的和实现原理,例如如何创建一个简单的UEFI Shell应用,如何编写一个设备驱动等。 8. **固件更新和安全**:学习固件更新机制,如EFI变量和固件升级包的制作,同时...

Global site tag (gtag.js) - Google Analytics