使用qemu进行内核源码级调试
来源:互联网 发布:nba2k17球员数据 编辑:程序博客网 时间:2024/05/16 10:39
使用qemu进行内核源码级调试
QEMU是一个通用并开放源代码的模拟器,其功能相当的强大,例如:可以用QEMU来模拟一个完整的系统,同时,也可以用QEMU来实现系统源码级的调试.如果您想对QEMU仿真器有更加深入的了解,请参阅其官方网站:
http://www.qemu.org/
下面笔者从如何得到QEMU,以及如何在linux下安装QEMU并进行源码级的调试做一个详细的介绍。
(一) qemu的获得以及安装
得到qemu是相当方便的,到其官方网站
http://www.nongnu.org/qemu/download.html下载QEMU Linux
下载最新版本即可。
接下来在linux安装qemu的详细步骤:
第一步:
把下载的文件放到工作目录下,解压缩:
例如:
huanghucai@huanghucai-laptop:~/kernel_learning$ tar zxvf qemu-0.10.5.tar.gz
第二步:切换到qemu目录下
huanghucai@huanghucai-laptop:~/kernel_learning$ cd qemu-0.10.5
第三步:配置安装
huanghucai@huanghucai-laptop:~/kernel_learning/qemu-0.10.5$ ./configure
huanghucai@huanghucai-laptop:~/kernel_learning/qemu-0.10.5$ sudo make
huanghucai@huanghucai-laptop:~/kernel_learning/qemu-0.10.5$ sudo make install
这样,qemu就安装好了,安装好了之后,对于一个新的软件,我们需要查看其具体的使用方法,请查看它的man手册。
(二)使用QEMU进行内核源码级调试
接下来,就是利用QEMU进行内核源码调试要想在QEMU下进行内核源码调试,和其他内核调试方式一样,首先是准备内核镜像为了能够进行源码级的跟踪、调试,需要一个包含调试信息的内核镜像。
下面将会以linux-2.6.23.2内核版本为例来进行讲解。
首先是到linux内核官方网站www.kernel.org获得linux-2.6.23.2内核源码linux-2.6.23.2.tar.gz,下载后解压缩,将源代码放到工作目录下,
例如:放到目录huanghucai@huanghucai-laptop:~/kernel_learning$
(这里说点题外话,这里笔者推荐一款下载工具axel,下载速度很快的,为了尽快的得到源代码,安装axel,复制链接,之后终端执行下面命令:
axel -n 50 -o .http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.2.tar.gz不过60秒,你就可以得到linux内核源码了,上面的.表示你把下载源代码放在了当前工作目录下,使用了50线程,要想对axel有深入的了解,你可以man一下就Ok了)
下载内核源代码之后,解压缩,并进入内核源码目录:
huanghucai@huanghucai-laptop:~/kernel_learning$ tar zxvf linux-2.6.23.2 linux-2.6.23.2.tar.gz
huanghucai@huanghucai-laptop:~/kernel_learning$ cd linux-2.6.23.2
第一步、生成新的.config文件,其中的配置采用默认的选项就可以了
huanghucai@huanghucai-laptop:~/kernel_learning/linux-2.6.23.2$ defconfig
第二步、修改已有的.config文件,在这个步骤中,添加新的内核选项
huanghucai@huanghucai-laptop:~/kernel_learning/linux-2.6.23.2$ make memuconfig
进入顶级选项Kernel hacking选项,选中kernel debugging,之后再次选中Compile kernel with debug info选项,选择以后出来就可以了;
第三步、创建大内核镜像bzImage
huanghucai@huanghucai-laptop:~/kernel_learning/linux-2.6.23.2$ make bzImage
第三步运行结束需要较长的时间,当第三步完成之后,如果没有出现什么问题,就可以直接略去下面的这些内容跳到第四步就OK了;如果你使用的是gcc 4.3,那么很有可能会出现创建失败的情况,错误提示如下所示:
......
......
LD .tmp_vmlinux1
kernel/built-in.o: In function `getnstimeofday':
(.text+0x1b2b1): undefined reference to `__umoddi3'
kernel/built-in.o: In function `do_gettimeofday':
(.text+0x1b36c): undefined reference to `__udivdi3'
kernel/built-in.o: In function `do_gettimeofday':
(.text+0x1b38f): undefined reference to `__umoddi3'
kernel/built-in.o: In function `timekeeping_resume':
timekeeping.c.text+0x1b520): undefined reference to `__udivdi3'
timekeeping.c.text+0x1b543): undefined reference to `__umoddi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bb9d): undefined reference to `__udivdi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bbc0): undefined reference to `__umoddi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bc57): undefined reference to `__udivdi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bc81): undefined reference to `__umoddi3'
make: *** [.tmp_vmlinux1] Error 1
这个错误的原因是因为gcc 4.3在处理64位整数运算的时候出现的问题,解决的办法据我所知有两种,这里介绍其中一种.在linux2.6.23.2目录下的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:
ChinaUnix网友:Chinahucai
内核源码调试对于内核初学者是一件有一定难度的事。工欲善其事,必先利其器,要想成功地进行内核源码级的调试,首先,必须现找到一个合适的工具,下面,笔者就来介绍内核源码调试的一款工具QEMU。QEMU是一个通用并开放源代码的模拟器,其功能相当的强大,例如:可以用QEMU来模拟一个完整的系统,同时,也可以用QEMU来实现系统源码级的调试.如果您想对QEMU仿真器有更加深入的了解,请参阅其官方网站:
http://www.qemu.org/
下面笔者从如何得到QEMU,以及如何在linux下安装QEMU并进行源码级的调试做一个详细的介绍。
(一) qemu的获得以及安装
得到qemu是相当方便的,到其官方网站
http://www.nongnu.org/qemu/download.html下载QEMU Linux
下载最新版本即可。
接下来在linux安装qemu的详细步骤:
第一步:
把下载的文件放到工作目录下,解压缩:
例如:
huanghucai@huanghucai-laptop:~/kernel_learning$ tar zxvf qemu-0.10.5.tar.gz
第二步:切换到qemu目录下
huanghucai@huanghucai-laptop:~/kernel_learning$ cd qemu-0.10.5
第三步:配置安装
huanghucai@huanghucai-laptop:~/kernel_learning/qemu-0.10.5$ ./configure
huanghucai@huanghucai-laptop:~/kernel_learning/qemu-0.10.5$ sudo make
huanghucai@huanghucai-laptop:~/kernel_learning/qemu-0.10.5$ sudo make install
这样,qemu就安装好了,安装好了之后,对于一个新的软件,我们需要查看其具体的使用方法,请查看它的man手册。
(二)使用QEMU进行内核源码级调试
接下来,就是利用QEMU进行内核源码调试要想在QEMU下进行内核源码调试,和其他内核调试方式一样,首先是准备内核镜像为了能够进行源码级的跟踪、调试,需要一个包含调试信息的内核镜像。
下面将会以linux-2.6.23.2内核版本为例来进行讲解。
首先是到linux内核官方网站www.kernel.org获得linux-2.6.23.2内核源码linux-2.6.23.2.tar.gz,下载后解压缩,将源代码放到工作目录下,
例如:放到目录huanghucai@huanghucai-laptop:~/kernel_learning$
(这里说点题外话,这里笔者推荐一款下载工具axel,下载速度很快的,为了尽快的得到源代码,安装axel,复制链接,之后终端执行下面命令:
axel -n 50 -o .http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.2.tar.gz不过60秒,你就可以得到linux内核源码了,上面的.表示你把下载源代码放在了当前工作目录下,使用了50线程,要想对axel有深入的了解,你可以man一下就Ok了)
下载内核源代码之后,解压缩,并进入内核源码目录:
huanghucai@huanghucai-laptop:~/kernel_learning$ tar zxvf linux-2.6.23.2 linux-2.6.23.2.tar.gz
huanghucai@huanghucai-laptop:~/kernel_learning$ cd linux-2.6.23.2
第一步、生成新的.config文件,其中的配置采用默认的选项就可以了
huanghucai@huanghucai-laptop:~/kernel_learning/linux-2.6.23.2$ defconfig
第二步、修改已有的.config文件,在这个步骤中,添加新的内核选项
huanghucai@huanghucai-laptop:~/kernel_learning/linux-2.6.23.2$ make memuconfig
进入顶级选项Kernel hacking选项,选中kernel debugging,之后再次选中Compile kernel with debug info选项,选择以后出来就可以了;
第三步、创建大内核镜像bzImage
huanghucai@huanghucai-laptop:~/kernel_learning/linux-2.6.23.2$ make bzImage
第三步运行结束需要较长的时间,当第三步完成之后,如果没有出现什么问题,就可以直接略去下面的这些内容跳到第四步就OK了;如果你使用的是gcc 4.3,那么很有可能会出现创建失败的情况,错误提示如下所示:
......
......
LD .tmp_vmlinux1
kernel/built-in.o: In function `getnstimeofday':
(.text+0x1b2b1): undefined reference to `__umoddi3'
kernel/built-in.o: In function `do_gettimeofday':
(.text+0x1b36c): undefined reference to `__udivdi3'
kernel/built-in.o: In function `do_gettimeofday':
(.text+0x1b38f): undefined reference to `__umoddi3'
kernel/built-in.o: In function `timekeeping_resume':
timekeeping.c.text+0x1b520): undefined reference to `__udivdi3'
timekeeping.c.text+0x1b543): undefined reference to `__umoddi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bb9d): undefined reference to `__udivdi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bbc0): undefined reference to `__umoddi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bc57): undefined reference to `__udivdi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bc81): undefined reference to `__umoddi3'
make: *** [.tmp_vmlinux1] Error 1
这个错误的原因是因为gcc 4.3在处理64位整数运算的时候出现的问题,解决的办法据我所知有两种,这里介绍其中一种.在linux2.6.23.2目录下的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
- 使用qemu进行内核源码级调试
- 利用qemu进行内核源码级调试
- 利用qemu进行内核源码级调试
- 利用qemu进行内核源码级调试
- 利用qemu进行内核源码级调试
- 利用qemu进行内核源码级调试
- 利用qemu进行内核源码级调试
- 用DDD+GDB+QEMU 进行linux内核源码级调试
- 利用Qemu + Buildroot 进行内核源码级调试
- 基于Openwrt + Qemu进行内核源码级调试
- 用DDD+GDB+QEMU 进行linux内核源码级调试
- 利用Qemu + Buildroot 进行内核源码级调试
- 使用qemu进行内核kgdb调试(ubuntu)
- 如何使用gdb结合qemu调试linux内核源码
- 如何使用gdb结合qemu调试linux内核源码
- 如何使用gdb结合qemu调试linux内核源码
- 使用qemu调试linux内核
- 使用qemu + KGDB调试内核
- 32位保护模式下的寻址方式
- android文件存储的4种方式
- SAP MM 移动类型-入门篇
- Andriod OpenGL 教程 10 - 3D世界
- poj 1163 The Triangle 因为这个,发现DP很有意思
- 使用qemu进行内核源码级调试
- sqlserver查看数据库编码
- 关于文件的读写问题
- 不加new的初始化
- Logback日志系统配置攻略
- android 系统开发APK签名方法
- android 入门xml布局文件
- 学习Emacs系列教程(四):Minibuffer
- SQL-触发器