提要
继续学习Linux.
今天要做是的搭建Linux的内核调试环境。
环境:Ubuntu13.04 gcc4.7.3
安装QEMU
QEMU简介
QEMU是一套由Fabrice Bellard所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQMEU这个开源的加速器,QEMU能模拟至接近真实电脑的速度。
最简单的方法就Ubuntu的软件中心安装:
找不到的话可以尝试更新源,然后update。
其他发行版的linux可以从源码进行安装 - http://wiki.qemu.org/Main_Page。
编译linux的内核
之前有一篇文章介绍内核编译的,可以参考-Linux操作系统分析(4)- 更新内核与添加系统调用
这里需要重新编译一下,添加调试信息。
首先下载最新版本的内核
https://www.kernel.org/pub/linux/kernel/v3.x/
下载linux-3.9.tar.gz
解压后终端进入文件夹,执行:
make menuconfig
在Kernel hacking项目里面将Compile the kernel with debug info和Compile the kernel with frame pointers,两项勾选。这些项目可以让编译时添加调试信息,类似我们平时用的-g选项。
接着执行:
make -j2 bzImage
编译内核,我的是双核的cpu,所以是 -j2,四核的话 -j4。
进行调试
去http://wiki.qemu.org/Testing下载linux-0.2.img.bz2,解压后丢到linux源码的目录下。
终端执行:
qemu -S -kernel arch/i386/boot/bzImage -hda linux-0.2.img -append "root=dev/hda"
# -kernel 用来指定内核,注arch/x86/bzImage是不带调试信息的内核,vmlinux是带有调试信息的内核.
#-hda 指定IDE硬盘
#-append cmdline use 'cmdline' as kernel command line
之后弹出一个小黑窗口,qemu就算起来了。
ctrl+alt+1 与 ctrl+alt+2可以切换界面,前者是屏幕输出,后者是qemu控制台
运行起来后是黑屏,我们要切换到控制台,用鼠标点击窗口,然后ctrl+alt+2,
在QEMU的命令行中 运行:
gdbserver tcp::1234启动gdbserver,并在tcp的1234端口监听,-S表示在开始的时候冻结CPU直到远程的gdb输入相应的控制命令
新起一个终端,用gdb调试vmlinux.
gdb vmlinux
target remote localhost:1234
软件开发技巧
现在 QEMU 已安装并运行客户操作系统,现在可以开始开发软件。既可用模拟器下的原有编译器,也可用主机上的跨编译器。对于需要在客户操作系统反复编译和测试软件的大型开发项目,跨编译器可能更快,但其安装配置已超出本文范围。模拟器下运行的编译器适合于小型项目,或不经常编译软件的项目。对于软件,计算机就像是目标平台的真实例子,可用于最实际的用途。一些特性,如字节顺序、CPU 一致性以及其他硬件基本特性就像在一台真实计算机上一样运行正常。我使用过真实的 PowerPC Apple iMac 和基于 QEMU 的 PowerPC 系统开发和测试全局惟一标识符(GUID)分区表(GPT) fdisk 程序的 PowerPC 版本,该程序需要知道 CPU 的字节顺序,在我看来,基于 QEMU 的系统与真实的 iMac 别无二致,除了 QEMU 系统有些慢。
这说明,如果深入探究,确实有些差异。例如,QEMU 的模拟硬盘会返回 “QEMU HARDDISK” 的模式字符串,与真实的硬盘驱动器不同。总的来说,QEMU 的虚拟硬盘有些过时;硬盘都是 PATA 或 Small Computer System Interface (SCSI) 设备,这根据具体平台,视频硬件也过时了。可以在 QEMU 文档中找到虚拟硬件的详细信息。请注意各个版本的详细信息都不同。
在 Linux 下,QEMU 会话占用很少的 CPU 时间,除了客户操作系统工作时。但 QEMU 会话会占用指定给它的 RAM 容量。因此,从实际出发,需要给主机系统大量内存,尤其是打算同时运行多于一个或两个 QEMU 会话时。