热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

在QEMU虚拟机中使用KGDB调试内核

1:编译Linux+KGDB1.1:安装编译工具请参考其他相关教程,推荐在安装系统的时候就选择上编译器及支持库1.2:下载最新内核代码在lmkl.org下载最新的内核源码,可以直接使用浏览器下载代码,当然也可以使用命令wget来下载,下载后需使用tar来解压源代码。
1: 编译Linux + KGDB 1.1: 安装编译工具

请参考其他相关教程,推荐在安装系统的时候就选择上编译器及支持库

1.2: 下载最新内核代码

在lmkl.org下载最新的内核源码, 可以直接使用浏览器下载代码,当然也可以使用命令wget来下载,下载后需使用tar来解压源代码。这里我们选择linux-2.6.34.1来演示。

假设缺省工作目录为/usr/src/work

sudo mkdir -p /usr/src/work
sudo chmod 777 /usr/src/work -R
cd /usr/src/work
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.1.tar.bz2
tar -jxvf linux-2.6.34.1.tar.bz2
1.3: 配置内核选择

使能kgdb调试,并使用kgdboc作为与gdb通信模块。

cd linux-2.6.34.1
make defconfig
make menuconfig

需确保如下选项被选中(参考kgdb内核选项配置)

General setup ---> [ * ] Prompt for development and/or incomplete code/drivers
Kernel hacking  ---> [ * ] Compile the kernel with debug info
[ * ] Compile the kernel with frame pointers
[ * ] KGDB: kernel debugger --->
<* > KGDB: use kgdb over the serial console
1.4: 编译

如果你的机器是多核的,可以使用-j+CPU数来进行并行编译,从而加快编译速度,如:

编译完成后,复制bzImage和vmlinux到工作目录下备用

cp arch/x86/boot/bzImage /usr/src/work
cp vmlinux /usr/src/work
2: 制作自己的文件系统 2.1: 下载busybox

busybox站点下载一个busybox源码包,并解压。

cd /usr/src/work
wget http://www.busybox.net/downloads/busybox-1.17.0.tar.bz2
tar -jxvf busybox-1.17.0.tar.bz2
cd busybox-1.17.0
2.2: 编译busybox
make menuconfig  
Busybox Settings  ---> Build Options  ---> [ * ] Build BusyBox as a static binary (no shared libs) Installation Options  ---> [ * ] Don't use /usr
 Miscellaneous Utilities ---> [ ] flashcp
 [ ] flash_lock
[ ] flash_unlock
[ ] flash_eraseall   注:[ ] 表示不选择

保存配置文件后开始编译和安装

此时在当前目录下生成了一个_install目录,里面就是busybox的执行文件

2.3: 制作文件系统

使用如下命令来创建一个虚拟文件系统磁盘文件,

在当前目录下创建一个名为busybox.img,大小为100M的文件,并将其格式化为ext3的文件系统

cd /usr/src/work dd if=/dev/zero of=./busybox.img bs=1M count=100 mkfs.ext3 busybox.img

将这个虚拟磁盘文件到本地系统中,这样我们可以像访问本地文件一样访问它,
并将生成好的busybox的文件拷贝到这个文件里。

sudo mkdir /mnt/disk sudo mount -o loop /usr/src/work/busybox.img /mnt/disk
sudo cp -rf /usr/src/work/busybox-1.17.0/_install/* /mnt/disk
创建必须的文件系统目录
cd /mnt/disk/
sudo mkdir dev sys proc etc lib mnt  
使用busybox默认的设置文件
sudo cp -a /usr/src/work/busybox-1.17.0/examples/bootfloppy/etc/* /mnt/disk/etc
sudo vi /mnt/disk/etc/init.d/rcS 
 将下面内容拷贝到rcS里:  
#! /bin/sh /bin/mount -a /bin/mount -t  sysfs sysfs /sys
 /bin/mount -t tmpfs tmpfs /dev
#动态添加虚拟机环境中的设备 /
sbin/mdev -s

做完上面对工作后,我们就可以卸载虚拟磁盘文件了。

cd /usr/src/work sudo umount /mnt/disk
3: 安装qemu
Ubuntu/Debian: sudo apt-get install qemu  
Fedora: sudo yum install qemu
4: 使用qemu运行自己编译的内核
qemu -kernel /usr/src/work/bzImage -append "root=/dev/hda" -boot c -hda /usr/src/work/busybox.img -k en-us   note: 如果你的硬盘是sata接口的,你也许需要将上面的 "root=/dev/hda" 替换为 "root=/dev/sda".

如果顺利的话,自己编译的内核+文件系统就会在那qemu黑乎乎的窗口里展现出来,
给自己倒杯水,庆祝下吧!

5: gdb + kgdb 调试内核

使能kgdb可以在内核启动时增加使能参数,也可以在内核启动后echo kgdboc模块的参数来达到目的,这里我们采取在内核启动时增加启动参数(kgdboc=ttyS0,115200 kgdbwait)的方式:

qemu -kernel /usr/src/work/bzImage -append "root=/dev/hda kgdboc=ttyS0,115200 kgdbwait" -boot c -hda /usr/src/work/busybox.img -k en-us -serial tcp::4321,server

这时,运行qemu的终端将提示等待远程连接到本地端口4321:
QEMU waiting for connection on: tcp:0.0.0.0:4321,server

这时使用另外一个控制台执行:

gdb /usr/src/work/vmlinux (gdb) target remote localhost:4321

然后qemu就可以继续正常运行下去,最后停止内核,并显示如下信息:
kgdb: Waiting for connection from remote gdb…

这时gdb这边就可以看到如下的提示:

(gdb) target remote localhost:4321
 Remote debugging using localhost:4321 kgdb_breakpoint () at kernel/debug/debug_core.c:983 983 wmb(); /* Sync point after breakpoint */ (gdb)

开始你的内核之旅吧~~~

如果gdb提示如下信息:
warning: Invalid remote reply:
可以使用Ctrl+C来终止当前gdb的操作,再次使用下面命令重新连接一次kgdb即可:
(gdb) target remote localhost:4321

6: gdb + kgdb 调试内核操作示例

待完善…

7: 引用/扩展阅读:

1: 使用 KGDB 调试 Linux 内核(on qemu)
该文章对qemu和kgdb的一些参数介绍得非常详细,本文的4和5章节都是参考它写的,强烈推荐大家看看。
2: setting up kgdb using kvmqemu
该文章也是关于qemu和kgdb,不过它介绍qemu如何联网等内容。PS:和上面的文章不同的是,它将qemu的虚拟串口导向到本地的一个”pty”设备上,
而前面我们是导向到一个socket端口上. qemu -serial参数介绍如下:

-serial dev Redirect the virtual serial port to host character device dev. The default device is "vc" in graphical mode and "stdio" in non graphical mode. This option can be used several times to simulate up to 4 serials ports.

推荐阅读
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • 本文介绍如何通过更改软件源来提前体验Ubuntu 8.10,包括详细的配置步骤和相关注意事项。 ... [详细]
  • 本文介绍了如何在Ubuntu 16.04系统上配置Nginx服务器,以便能够通过网络访问存储在服务器上的图片资源。这解决了在网页开发中需要使用自定义在线图标的需求。 ... [详细]
  • 本文探讨了Unix和Linux操作系统的起源和发展历程。从20世纪60年代计算机技术的初期阶段,到Unix的诞生及后续Linux的崛起,文章详细介绍了这些操作系统如何逐步成为现代计算不可或缺的一部分。 ... [详细]
  • 在Ubuntu 14.04 (Desktop AMD64) 上安装与配置ROS Indigo
    本文档详细介绍了如何在Ubuntu 14.04 (Desktop AMD64) 系统上安装和配置ROS Indigo。包括设置软件源、安装ROS核心组件、初始化rosdep以及创建ROS工作空间等步骤。 ... [详细]
  • 利用 Calcurse 在 Linux 终端高效管理日程与任务
    对于喜爱使用 Linux 终端进行日常操作的系统管理员来说,Calcurse 提供了一种强大的方式来管理日程安排、待办事项及会议。本文将详细介绍如何在 Linux 上安装和使用 Calcurse,帮助用户更有效地组织工作。 ... [详细]
  • 本文介绍了Linux操作系统的核心组成部分——内核及其版本分类,以及市面上常见的几种Linux发行版,旨在为初学者提供一个清晰的学习路径。 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • Parallels Desktop for Mac 是一款功能强大的虚拟化软件,能够在不重启的情况下实现在同一台电脑上无缝切换和使用 Windows 和 macOS 系统中的各种应用程序。该软件不仅提供了高效稳定的性能,还支持多种高级功能,如拖放文件、共享剪贴板等,极大地提升了用户的生产力和使用体验。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本文详细介绍了如何在PHP中进行数组删除、清空等操作,并提供了在Visual Studio Code中创建PHP文件的步骤。 ... [详细]
  • 2012年7月30日,语言岛团队宣布其智能记单词软件V0.3.4.554版本正式开源。该版本不仅支持跨平台使用,还引入了多项创新功能,旨在帮助用户更高效地记忆单词。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
author-avatar
等艺来绵阳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有