采用eclipse + gdb来搭建调试qemu源码的环境
2016-03-29 00:00
489 查看
采用eclipse + gdb来搭建调试qemu源码的环境
2013-03-26 11:43:14
分类: 虚拟化
由于很多同学来信询问如何学习qemu,要看哪些资料,应该怎么入手之类的问题,我每次都回答:看代码。但是qemu的代码也是挺庞大的,如果没有一个好的方法和环境,将是一件非常痛苦的事情。因为qemu的相关资料太少了,并不像linux,有很多源码分析的资料可以对照的看。
对一个陌生的东西,最好的方法是跟踪它,所以,我们可以通过单步调试的方法来分析qemu的代码,下面就介绍一下如何通过eclipse+gdb来搭建qemu源码的调试环境。
在真正开始之前,先给个分析qemu源码的小建议(纯个人经验),注意:同样适用于分析linux代码。
先学习linux使用相关的知识,推荐书籍《鸟哥的linux私房菜》,其次学习linux环境编程,推荐书籍《Unix环境高级编程》,最后学习qemu/linux源码分析,推荐书籍《深入理解linux内核》。
1. qemu源码编译
(1)configure配置选项,根据不同的体系结构和需求进行配置,我的配置如下:
./configure --target-list=i386-softmmu,i386-linux-user --disable-xen --disable-vnc --disable-vnc-png --disable-vnc-jpeg --disable-vnc-sasl --disable-vnc-tls --disable-blobs --disable-bluez --disable-bsd-user --disable-darwin-user --disable-user --disable-vnc-thread
(2)eclipse 项目配置
在
eclipse
中创建
Makefile
工程,将
configure
后的源码拷贝到新建工程中,执行
Build,然后就想调试helloworld一样对qemu进行调试了。
2. qemu的Makefile文件分析
/*Makefile*/
all: build-all
include config-host.mak
include $(SRC_PATH)/rules.mak
config-host.mak:$(SRC_PATH)/configure
@echo $@ is out-of-date, running configure
@sed –n “/.*Configured with/s/[^:]*: //p” $@ | sh
/*config-host.mak*/
SRC_PATH = /home/workspace/qemu-1.0
CFLAGS=-O2 –g ? CFLAGS=O0 –g /*避免调试时指令乱序执行*/
%.o:%.c /*Makefile中的模式匹配,将所有的.c文件生成对应的.o*/
$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) –c –o $@ $<,”CC $(TARGET_DIR)$@”)
/*上面规则的含义即为调用函数quiet-command, 并且函数有两个参数:
* $1 = (CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) *$(CFLAGS) –c –o $@ $<
* $2 = ”CC $(TARGET_DIR)$@”
*/
quiet-command = $(if $(V), $1,$(if $(2), echo $2 &&$1, @$1))
/*这条规则的含义为,如果$(V) !=NULL,则执行参数1($1), 否则,如果$(2)!=NULL,则先打印出$2,再执行$1*/
%.o:%.S /*原理同上*/
/*经过以上两步之后,已经把所有的.c和.S生成了对应的.o文件*/
LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(1) $(LIBS)," LINK $(TARGET_DIR)$@")
/*上面规则的含义为: gcc –o qemu-system-i386 *.o */
从Makefile可以得到如下信息:
Qemu
支持系统仿真和用户仿真两种模式,可以简单的作如下理解:
(1)系统仿真,仿真一台完整的pc机,包括cpu,总线,内存,硬盘,外设等,调用i386-softmmu/qemu-system-i386。系统仿真模式包括的所有文件,参见附录A, 从附录A中可以很清晰的知道系统仿真模式由哪些文件编译生成(configure时的配置不同,略有差异),依赖了哪些库(蓝色加粗)等。
(2)用户仿真,仅仅仿真cpu,调用i386-linux-user/qemu-i386命令。用户仿真模式包括的所有文件,参见附录B,可以很清楚的知道用户仿真模式的命令qemu-i386由哪些文件编译生成configure时的配置不同,略有差异),依赖了哪些库(蓝色加粗),需要哪个链接脚本文件等等。
2013-03-26 11:43:14
分类: 虚拟化
由于很多同学来信询问如何学习qemu,要看哪些资料,应该怎么入手之类的问题,我每次都回答:看代码。但是qemu的代码也是挺庞大的,如果没有一个好的方法和环境,将是一件非常痛苦的事情。因为qemu的相关资料太少了,并不像linux,有很多源码分析的资料可以对照的看。
对一个陌生的东西,最好的方法是跟踪它,所以,我们可以通过单步调试的方法来分析qemu的代码,下面就介绍一下如何通过eclipse+gdb来搭建qemu源码的调试环境。
在真正开始之前,先给个分析qemu源码的小建议(纯个人经验),注意:同样适用于分析linux代码。
先学习linux使用相关的知识,推荐书籍《鸟哥的linux私房菜》,其次学习linux环境编程,推荐书籍《Unix环境高级编程》,最后学习qemu/linux源码分析,推荐书籍《深入理解linux内核》。
1. qemu源码编译
(1)configure配置选项,根据不同的体系结构和需求进行配置,我的配置如下:
./configure --target-list=i386-softmmu,i386-linux-user --disable-xen --disable-vnc --disable-vnc-png --disable-vnc-jpeg --disable-vnc-sasl --disable-vnc-tls --disable-blobs --disable-bluez --disable-bsd-user --disable-darwin-user --disable-user --disable-vnc-thread
(2)eclipse 项目配置
在
eclipse
中创建
Makefile
工程,将
configure
后的源码拷贝到新建工程中,执行
Build,然后就想调试helloworld一样对qemu进行调试了。
2. qemu的Makefile文件分析
/*Makefile*/
all: build-all
include config-host.mak
include $(SRC_PATH)/rules.mak
config-host.mak:$(SRC_PATH)/configure
@echo $@ is out-of-date, running configure
@sed –n “/.*Configured with/s/[^:]*: //p” $@ | sh
/*config-host.mak*/
SRC_PATH = /home/workspace/qemu-1.0
CFLAGS=-O2 –g ? CFLAGS=O0 –g /*避免调试时指令乱序执行*/
%.o:%.c /*Makefile中的模式匹配,将所有的.c文件生成对应的.o*/
$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) –c –o $@ $<,”CC $(TARGET_DIR)$@”)
/*上面规则的含义即为调用函数quiet-command, 并且函数有两个参数:
* $1 = (CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) *$(CFLAGS) –c –o $@ $<
* $2 = ”CC $(TARGET_DIR)$@”
*/
quiet-command = $(if $(V), $1,$(if $(2), echo $2 &&$1, @$1))
/*这条规则的含义为,如果$(V) !=NULL,则执行参数1($1), 否则,如果$(2)!=NULL,则先打印出$2,再执行$1*/
%.o:%.S /*原理同上*/
/*经过以上两步之后,已经把所有的.c和.S生成了对应的.o文件*/
LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(1) $(LIBS)," LINK $(TARGET_DIR)$@")
/*上面规则的含义为: gcc –o qemu-system-i386 *.o */
从Makefile可以得到如下信息:
Qemu
支持系统仿真和用户仿真两种模式,可以简单的作如下理解:
(1)系统仿真,仿真一台完整的pc机,包括cpu,总线,内存,硬盘,外设等,调用i386-softmmu/qemu-system-i386。系统仿真模式包括的所有文件,参见附录A, 从附录A中可以很清晰的知道系统仿真模式由哪些文件编译生成(configure时的配置不同,略有差异),依赖了哪些库(蓝色加粗)等。
(2)用户仿真,仅仅仿真cpu,调用i386-linux-user/qemu-i386命令。用户仿真模式包括的所有文件,参见附录B,可以很清楚的知道用户仿真模式的命令qemu-i386由哪些文件编译生成configure时的配置不同,略有差异),依赖了哪些库(蓝色加粗),需要哪个链接脚本文件等等。
相关文章推荐
- Java 书籍路线
- 详解java1.5新添特性------注解
- spring异常处理-HandlerExceptionResolver
- 在eclipse中安装SVN插件方法
- 笔记:Spring中获取classpath下的文件资源
- java的NIO基础知识
- Struts配置文件错误之type "package"
- Spring装配Bean的过程补充
- Java 容器(list, set, map)
- Eclipse技巧(不断更新中
- 360java笔试编程第二题20160328
- java中将double类型的数据保存为两位小数
- Java集合大整理
- struts2中ognl表达式%$#在jsp页面的使用总结以及<s:a title=%{title}>的作用
- Spring Bean的生命周期管理方法
- hadoop生态系统学习之路(三)java实现上传文件(本地或ftp)至hdfs
- Eclipse默认字体CourierNew
- [Think In Java]基础拾遗4 - 并发
- 【java】 java 集合类UML图
- Spring装配Bean的过程