使用UML调试linux内核

2020-07-08 00:00:00 编译 系统 内核 文件系统 调试

概述

UML这里不是统一建模语言,而是UserMode Linux的缩写,从字面上看,是在用户态运行

linux内核,即将内核当作一个应用程序在跑,这样我们就可以用调试应用层程序的方法调试内

核了,应用层的强大调试工具gdb就派上用场了。很多时候我们写内核代码,当遇到算法比较

复杂但又不涉及底层结构的时候总是喜欢现在应用层实现并调试,然后在写到内核层。为什

么,就是因为用户层调试比内核调试方便。但是UML的大局限性就是不能调试硬件关联性强

的代码,但是还是有很多方面可以应用的,比如调度算法、VFS等。用gdb像跟踪用户程序一

样跟踪这样的代码,相信你一定非常感兴趣,那么让我们马上开始步:搭建一个UML测试

环境。

安装

下载编译内核代码

1. 首先从网上下载你感兴趣的内核代码版本,比如我下载的版本是2.6.36.4。

2. 编译内核

在真正进入编译之前(make linux ARCH=um之前),需要先进行内核配置,具体配置可参考下图:

注意ARCH=um是必不可少的,否则就不是编译UML平台的内核了。如果编译过正常平台下

(如amd64, i386,ppc等)的内核的人会发现,这个配置列表和以往的有一些不同,这就是

ARCH=um的作用,我们现在要配置的是一个要跑在应用层的内核。除了选上你需要的功能对

应选项以外,还有一些选项是必要为UML选的:

* 在UML-specific options--->Host Processor typefeatures--->Processor family里选择你的处理器平台,如果你发现有Generic x86 support配置(不一定会出现),请保证它不生效。

* Character devices中的stderr console, Virtual serial line, nullchannel support, port channel support, pty channel support, tty channelsupport, xterm channel support等是需要选中的。

* Enable loadable module support 在UML中一般是不需要的,可以取消它,当然你不取消也没关系。

* Networking support 里的Amateur Radio support, IrDA (infrared)subsystem support, Bluetooth subsystem support等的也是可以去掉的。而UML Network Devices里的东西是需要依据具体情况而定的,我这里就使用了默认的配置,如果你有特殊需求还请根据自己的需求选。NetLabel subsystem support我选了,因为我需要调试网络标签。

* Block Devices---> Virtual block devices需要选中。

* File systems嘛……这个就比较复杂了,你需要什么就自己选吧。

* SCSI device support中可以不需要。

* Multiple devices driver support也可以不需要。

* Kernel Hacking是一个比较重要的,需要选中Kernel debugging, Compile the kernel with debuginfo这两个需要选上,Show timing information on printks可以选上,其它的选项根据你要调试需求自己选择。

好了,配置好后你就可以保存退出了。

构建运行环境

让uml的内核跑在一个独立出来的运行环境中,我们需要一块磁盘,并在这块磁盘上作一个文

件系统,即根文件系统,再在上面作一个可运行的小系统(因为要让系统可运行,需要的不

仅仅是一个内核,还有一些相关的运行环境的支持)。这里可以自己制作带小系统的根文件

系统,也可以从网上直接下载一个现成的,刚开始的时候我采用了自己制作的方法,但是系统

运行没有成功,我便从网上下载了一个现成的,终算是大功告成。我在这里分别给出两种办

法,任各位自己挑选。

手动制作方法:

1. 首先创建一个设备用来作为文件系统的载体并格式化成想要的文件系统:

 mkdir disk
 dd if=/dev/zero of=disk/um-rootbs=1024K count=1000
 mkfs.ext3 disk/um-root

相关文章