Linux 内核调试1-UML


最近看了些Linux内核源码,之前认为最好的调试内核源码最好的方式使用Qemu虚拟机,结合GDB调试,虽然在网上也看到一些这种调试方式的弊端,但感觉虚拟机支持调试是最完美的事情,虽然Bochs更为灵活甚至内置调试器,但速度太慢。

之前一直觉得KGDB这种双机调试的方式很不完美,还必须使用一个调试机,不过在Windows下使用WinDbg调试虚拟机多了,感觉这种方式很合理,起 码被调试机当机的情况下,调试机还是活的。而且这样看上去很酷,而且比SoftICE这样“不稳定”的调试方式要好的多。

这两天看到一种 UML(User Mode Linux)的调试方式,居然早已加入内核,我才听闻,真是落后时代啊。这种UML方式是把linux内核当作本地一个普通的应用程序执行,当然也很方便 调试,这个类似于Xen虚拟机。不过在64位Fedora上没有配好环境,在i386却很容易配置,打开控制台转到内核源码,例如linux- 2.6.34:

编译内核命令要在普通方式后加入构架um参数:

# 配置内核
make menuconfig ARCH=um
# 编译内核
make linux ARCH=um

编译完成后会在源码根目录下生成可执行文件 linux。

到这里似乎很简单,下面需要创建 Linux 根文件系统,也就是除内核以外的硬盘文件,这个根文件系统包括Linux文件组织数,以及启动系统所必须的一些辅助程序。

一种方法就是手工制作:

# 创建一个2G的文件作为硬盘
dd if=/dev/zero of=rootfs.img bs=1M count=2048
# 格式化文件
mkfs.ext3 rootfs.img
# 映射此文件到主机文件夹
mount -o loop rootfs.img /mnt/temp

如此便可通过拷贝文件到/mnt/temp/目录,等同于拷贝文件到rootfs.img硬盘文件。这里可以直接通过主机的文件目录组织去构建跟文件系统,也可以直接安装一个linux到此目录。

使用最简单的方式就是直接使用现成的根文件系统。在UML网站 The User-mode Linux Kernel Home Page 有相关链接可以下载,比如下载 DSL-4.4-root_fs.bz2 文件,首先解压运行之:

bunzip2 DSL-4.4-root_fs.bz2
./linux udba=DSL-4.4-root_fs

运行后出现 Unable to mount root fs on unknown-block(0,0) 错误后程序崩溃,这里可能是内核有关文件系统编译选项的问题,明天继续研究。。。

到这里有几个问题:
1、64位系统下UML编译,要设置子系统等,如何设置?
2、根文件系统建立,一个Linux最小单元的根文件系统需要哪些文件和目录?
3、内核编译选项问题;
4、调试UML方法和UML启动参数,比如网络设置等等。

相关系列文章:
Linux 内核调试1-UML
Linux 内核调试2-UML调试内核
Linux 内核调试3-UML网络配置
Linux 内核调试4-Qemu调试Linux内核
Linux 内核调试5-UML和Qemu调试模块
Linux 内核调试6-使用KGDB双机调试

相关内容