使用qemu进行内核源码级调试 您所在的位置:网站首页 qemu源码调试 使用qemu进行内核源码级调试

使用qemu进行内核源码级调试

2024-07-16 17:53| 来源: 网络整理| 查看: 265

使用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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有