使用qemu进行内核源码级调试.doc_第1页
使用qemu进行内核源码级调试.doc_第2页
使用qemu进行内核源码级调试.doc_第3页
使用qemu进行内核源码级调试.doc_第4页
使用qemu进行内核源码级调试.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用qemu进行内核源码级调试 内核源码调试对于内核初学者而言是一件有一定难度的事.工欲善其事,必先利其器,要想成功地进行内核源码级的调试,首先,必须现找到一个合适的工具,下面,笔者就来介绍内核源码调试的一款工具QEMU.QEMU是一个通用并开放源代码的模拟器,其功能相当的强大,例如:可以用QEMU来模拟一个完整的系统,同时,也可以用QEMU来实现系统源码级的调试.如果您想对QEMU仿真器有更加深入的了解,请参阅其官方网站:/ 下面笔者从如何得到QEMU,以及如何在linux下安装QEMU并进行源码级的调试做一个详细的介绍.(一) qemu的获得以及安装得到qemu是相当方便的,到其官方网站/qemu/download.html下载QEMU Linux下载最新版本即可.接下来是在linux下安装qemu的详细步骤:第一步:把下载的文件放到工作目录下,解压缩:例如:huanghucaihuanghucai-laptop:/kernel_learning$ tar zxvf qemu-0.10.5.tar.gz第二步:切换到qemu目录下huanghucaihuanghucai-laptop:/kernel_learning$ cd qemu-0.10.5第三步:配置安装huanghucaihuanghucai-laptop:/kernel_learning/qemu-0.10.5$ ./configurehuanghucaihuanghucai-laptop:/kernel_learning/qemu-0.10.5$ sudo makehuanghucaihuanghucai-laptop:/kernel_learning/qemu-0.10.5$ sudo make install这样,qemu就安装好了,安装好了之后,对于一个新的软件,我们需要查看其具体的使用方法,那么请查看它的man手册.或者是到其官方网站去了解其基本的应用.(二) 使用QEMU进行内核源码级调试接下来,就是利用QEMU进行内核源码调试.要想在QEMU下进行内核源码调试,和其他内核调试方式一样,首先是准备内核镜像.为了能够进行源码级的跟踪、调试,需要一个包含调试信息的内核镜像.下面将会以linux-内核版本为例来进行讲解.首先是到linux内核官方网站获得linux-内核源码linux-.tar.gz,下载后解压缩,将源代码放到工作目录下,例如:放到目录huanghucaihuanghucai-laptop:/kernel_learning$(这里说点题外话,这里笔者推荐一款下载工具axel,下载速度很快的,为了尽快的得到源代码,安装axel,复制链接,之后终端执行下面命令:axel -n 50 -o . /pub/linux/kernel/v2.6/linux-.tar.gz不过60秒,你就可以得到linux内核源码了,上面的.表示你把下载源代码放在了当前工作目录下,使用了50线程,要想对axel有深入的了解,你可以man一下就OK了)下载内核源代码之后,解压缩,并进入内核源码目录:huanghucaihuanghucai-laptop:/kernel_learning$ tar zxvf linux- linux-.tar.gzhuanghucaihuanghucai-laptop:/kernel_learning$ cd linux-第一步、生成新的.config文件,其中的配置采用默认的选项就可以了 huanghucaihuanghucai-laptop:/kernel_learning/linux-$ defconfig 第二步、修改已有的.config文件,在这个步骤中,添加新的内核选项huanghucaihuanghucai-laptop:/kernel_learning/linux-$ make memuconfig进入顶级选项Kernel hacking选项,选中kernel debugging,之后再次选中Compile kernel with debug info选项,选择以后出来并保存就可以了;第三步、创建大内核镜像bzImagehuanghucaihuanghucai-laptop:/kernel_learning/linux-$ make bzImage第三步运行结束需要较长的时间,当第三步完成之后,如果没有出现什么问题,就可以直接略去下面的这些内容跳到第四步就OK了;如果你使用的是gcc 4.3,那么很有可能会出现创建失败的情况,错误提示如下所示: . .LD .tmp_vmlinux1kernel/built-in.o: In function getnstimeofday:(.text+0x1b2b1): undefined reference to _umoddi3kernel/built-in.o: In function do_gettimeofday:(.text+0x1b36c): undefined reference to _udivdi3kernel/built-in.o: In function do_gettimeofday:(.text+0x1b38f): undefined reference to _umoddi3kernel/built-in.o: In function timekeeping_resume:timekeeping.c:(.text+0x1b520): undefined reference to _udivdi3timekeeping.c:(.text+0x1b543): undefined reference to _umoddi3kernel/built-in.o: In function update_wall_time:(.text+0x1bb9d): undefined reference to _udivdi3kernel/built-in.o: In function update_wall_time:(.text+0x1bbc0): undefined reference to _umoddi3kernel/built-in.o: In function update_wall_time:(.text+0x1bc57): undefined reference to _udivdi3kernel/built-in.o: In function update_wall_time:(.text+0x1bc81): undefined reference to _umoddi3make: * .tmp_vmlinux1 Error 1这个错误的原因是因为gcc 4.3在处理64位整数运算的时候出现的问题,解决的办法据我所知有两种,这里介绍其中一种.在linux目录下的Makefile文件中给变量CFLAGS_KERNEL赋值为:-fno-tree-scev-cprop,改变值之后重新编译一次就OK了.如果出现了undefined reference to _stack_chk_fail,可以在文件Makefile中的CFLAGS设置值-fno-stack-protector,即关闭掉栈的保护.如果出现其他编译失败的情况,你可以借助于google找到相关的解决方案.第四步就是准备根文件系统镜像,这里我从qemu的官方网站下载了linux-0.2.img.bz2,解压缩并将解压缩后的文件放到源代码目录下.经过上面四个步骤的工作,现在你已经将内核源码级的调试环境搭建完了,下一步就来进入qemu下的内核源码级调试.(三) QEMU下内核源码级调试首先是启动qemu:可以运行类似于下面命令来启动qemu:qemu -S -kernel arch/i386/boot/bzImage -hda linux-0.2.img -append root = dev/hda -no-kqemu截图如下所示:运行了此命令后就可以进行源码级的调试了.当执行了上面的启动命令之后,会弹出下面的QEMU工作终端,此时QEMU工作终端是一个黑色方框,没有任何内容,现在要切换进QEMU,按下Ctrl+Alt+2即切换到QEMU工作台下.启动gdb服务,并设置主机连接端口,使用下面命令即可实现:gdbserver 1234这里要理解的一点是:当启动QEMU后,QEMU仿真器在等待着gdb的连接.如图所示:要在仿真器下进行源代码级的调试,需在另外一个终端下启动vmlinux调试,对应的命令为:gdb vmlinux.这些工作都是在源码目录下实现的。之后,在调试状态下进行QEMU的连接:target remote localhost:1234建立QEMU连接后,就可以进行gdb的正常使用了,例如,通过c命令启动内核(gdb) c参考:linux2.6 内核标准教程 河泰 王洪涛 编著发表于: 2009-07-26 ,修改于: 2009-08-03 10:13,已浏览1846次,有评论9条 推荐 投诉 网友评论内容:我按照上面做了,还有一个问题是,couldnotopengdbserverondevice1234?Blog作者的回复:你可以改另外一个端口试试,例如gdbser1212本站网友评论于:2009-08-07 18:09:42 (221.237.191.) 内容:我感觉不是端口的问题,我试了很多的端口,都是这种错误,能请教一下是什么原因吗。Blog作者的回复:这样的问题我也没有遇到过,在网上搜索了一下,可能是gdbserver启动失败,这个问题我暂时也解决不了,很抱歉.本站网友评论于:2009-08-08 17:40:28 (125.71.127.) 内容:我按照上面的作了,但是每次执行:qemu-S-kernelarch/i386/boot/bzImage-hdalinux-0.2.img-appendroot=dev/hda-no-kqemu。总是出现VNCserverrunningon:5901,xucaiyi 评论于:2009-12-16 13:24:42 (218.9.122.) 内容:这时候你可以通过一个VNC客户端连过去本站网友评论于:2010-03-05 09:53:23 (125.69.76.) 内容:我走到了最后一步。当我输入c时.屏幕显示Continuing(如帖子最后一幅图显示的那样)但是这之后,就没有别的反应了.接下来该怎么办呢?本站网友评论于:2010-04-17 12:53:11 (192.55.46.) 内容:这么使用:gdbservertcp:1234可以解决你的问题greek_zjb 评论于:2010-04-26 11:37:38 (61.135.165.) 内容:还需要Ctrl+Alt+1切换回运行模式。本站网友评论于:2010-11-05 09:49:35 (61.148.56.) 内容:怎么通过VNC客户端连过去?我也遇到提示VNCserverranningon.本站网友评论于:2011-03-12 13:44:34 (112.80.193.) 内容:怎么通过VNC客户端连过去?我也遇到提示VNCserverranningon.本站网友评论于:2011-03-12 13:44:34 (112.80.193.) 使用qemu进行内核源码级调试(错误解决办法):操作平台:vmware6.0+ubuntu11.04+qemu-0.14.1+linux-.tar.gz1.defconfig命令不对,应该是make defconfig 2.make menuconfig错误,原因是缺少ncurses。Ubuntu 安装ncurses,包的全称是libncurses5-devsudo apt-get install libncurses5-dev3.make bzImage之后提示以下错误信息:arch/i386/boot/boot.h: Assembler messages:arch/i386/boot/boot.h:110: Error: bad register name %dilmake1: * arch/i386/boot/video.o Error 1make: * bzImage Error 2对照错误提示在网上看到一个解决办法,将arch/i386/boot/boot.h文件中asm volatile(movb %fs:%1,%0 : =r (v) : m (*(u8 *)addr)中的r改为q,这样改后确实可以编译通过。(但是用新内核无法启动系统,参考网址:网址/forum/viewtopic.php?f=2&t=685 -这个问题我没有发现)4.调试方法:打开一个终端,进入内核源码的目录,我的是/kernel_learning/linux-/,运行下面命令来启动qemu:qemu -S -kernel arch/i386/boot/bzImage -hda linux-0.2.img -append root=/dev/hda ,注意不能是root=dev/hda,否则根文件系统挂载不了,系统无法启动。-no-kqemu参数也不能用,因为系统不识别。此时系统显示:VNC server running on :5900,并没有出现文章中所说的QEMU工作终端的黑色方框。网友评论中提到这时候你可以通过一个VNC客户端连过去,说明需要通过VNC客户端连过去。google发现VNC客户端命令是vncviewer,重新打开一个终端,输入vncviewer,系统提示vncviewer未安装,按照系统提示安装一个,sudo apt-get install vncviewer就OK了。可以安装先一个sudo apt-get install vnc4server。重新打开一个终端,进入内核源码的目录,输入vncviewer,系统提示Server: ,此时输入:5900,连过去之后就可以看到QEMU工作终端的黑色方框了,按下Ctrl+Alt+2即切换到QEMU工作台下.启动gdb服务,并设置主机连接端口,使用下面

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论