使用KGDB调试内核 on QEMU
来源:互联网 发布:网络侦探 七只 编辑:程序博客网 时间:2024/05/16 05:23
本文由daviyang35起草,DDD最终完成。
对于本文有任何疑问,可直接在文章后评论询问。
1: 编译Linux + KGDB
1.1: 安装编译工具
请参考其他相关教程,推荐在安装系统的时候就选择上编译器及支持库
1.2: 下载最新内核代码
在lmkl.org下载最新的内核源码, 可以直接使用浏览器下载代码,当然也可以使用命令wget来下载,下载后需使用tar来解压源代码。这里我们选择linux-2.6.34.1来演示。
假设缺省工作目录为/usr/src/work
sudo mkdir -p /usr/src/worksudo chmod 777 /usr/src/work -Rcd /usr/src/workwget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.1.tar.bz2tar -jxvf linux-2.6.34.1.tar.bz2
1.3: 配置内核选择
使能kgdb调试,并使用kgdboc作为与gdb通信模块。
cd linux-2.6.34.1make defconfigmake menuconfig
需确保如下选项被选中(参考kgdb内核选项配置)
General setup ---> [ * ] Prompt for development and/or incomplete code/driversKernel 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: 编译
make
如果你的机器是多核的,可以使用-j+CPU数来进行并行编译,从而加快编译速度,如:
make -j2
编译完成后,复制bzImage和vmlinux到工作目录下备用
cp arch/x86/boot/bzImage /usr/src/workcp vmlinux /usr/src/work
2: 制作自己的文件系统
2.1: 下载busybox
去busybox站点下载一个busybox源码包,并解压。
cd /usr/src/workwget http://www.busybox.net/downloads/busybox-1.17.0.tar.bz2tar -jxvf busybox-1.17.0.tar.bz2cd 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 /usrMiscellaneous Utilities ---> [ ] flashcp [ ] flash_lock[ ] flash_unlock[ ] flash_eraseall 注:[ ] 表示不选择
保存配置文件后开始编译和安装
makemake install
此时在当前目录下生成了一个_install目录,里面就是busybox的执行文件
2.3: 制作文件系统
使用如下命令来创建一个虚拟文件系统磁盘文件,
在当前目录下创建一个名为busybox.img,大小为100M的文件,并将其格式化为ext3的文件系统
cd /usr/src/workdd if=/dev/zero of=./busybox.img bs=1M count=100mkfs.ext3 busybox.img
将这个虚拟磁盘文件到本地系统中,这样我们可以像访问本地文件一样访问它,
并将生成好的busybox的文件拷贝到这个文件里。
sudo mkdir /mnt/disksudo mount -o loop /usr/src/work/busybox.img /mnt/disksudo 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/etcsudo 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/worksudo 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,115200kgdbwait" -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:4321Remote debugging using localhost:4321kgdb_breakpoint () at kernel/debug/debug_core.c:983983wmb(); /* 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 devRedirect the virtual serial port to host character device dev. The default deviceis "vc" in graphical mode and "stdio" in non graphical mode. This option can beused several times to simulate up to 4 serials ports.
http://www.kgdb.info/kgdb/use_kgdb/using_kgdb_base_qemu/
- 使用KGDB调试内核 on QEMU
- 使用KGDB调试内核 on QEMU
- 使用KGDB调试内核 on QEMU
- 使用qemu + KGDB调试内核
- 使用KGDB调试内核 on QEMU(一步一步跟我学)
- 使用KGDB调试内核 on QEMU(一步一步跟我学)
- 使用qemu和kgdb调试内核
- QEMU + KGDB调试内核模块
- 使用qemu进行内核kgdb调试(ubuntu)
- qemu+kgdb调试内核模块笔记
- QEMU 调试 内核模块(without kgdb)
- QEMU+KGDB 调试ARM内核模块
- 使用 KGDB 调试 Linux 内核
- 使用 KGDB 调试 Linux 内核
- 使用 KGDB 调试 Linux 内核
- 使用KGDB调试Linux内核
- ARM-使用KGDB调试内核
- 使用kgdb调试内核之模块调试
- Java常用基础技术
- ASP.NET RegularExpressionValidator 控件
- Java发邮件工具类
- windows 安装 配置 metasploit
- 经典的makefile教材(bakup reason)
- 使用KGDB调试内核 on QEMU
- Python邮箱地址检查
- C++ 算法
- Asp.net Mvc 学习资料总结
- 使用直接定址表遇到的问题
- web常见报错
- 反汇编 this 指针分析
- 顶级开发商教你如何测试Android系统
- 现代操作系统杂记