前言用户模式的Linux(UML:User-ModeLinux)是指将Linux作为一个独立的、可移植的Linux内核而创建,其实现包含在子目录arch/um中。然而,它并不是运行在某种新的硬件之上,而是运行在基于Linux系统调用接口所实现的虚拟机之上。因此用户模式的Linux可以使得Linux内核成为一个运行在Linux系统之上的、独立的用户模式进程。
将一个内核的副本当做用户模式下的进程来运行有多个优势。首先其运行在一个受约束的虚拟处理器上,所以有错误的内核不会破坏“真正”的系统;其次对软/硬件的不同配置可以在相同的框架下进行不同的尝试;更重要的是对Linux内核开发人员来说,可以轻易利用gdb对用户模式Linux进行调试,因为归根到底它始终是一个进程。因此利用UML一方面可以加快Linux内核的开发过程;另一方面也有助于我们对Linux内核运行机制的了解。本文研究如何搭建gdb+uml的调试环境。
备注:我使用的系统是Debian-6.07。
第一部分 UML系统搭建
第一步:下载Linux内核
下载linux-2.6.38.tar.bz2:
第二步:解压内核,生成基于um的配置文件
$cd /home/tom
$tar xvflinux-2.6.38.tar.bz2
$cd linux-2.6.38
$make ARCH=um defconfig
示意图如下:
第三步:修改配置文件
$make menuconfig ARCH=um
1.配置General Setup->Initial RAM filesystem andRAM disk(initramfs/initrd)support
示意图如下:
2.选择Kernel hacking->Kernel debugging
示意图如下:
3.选择Kernel hacking->Compile the kernel with debuginfo
示意图如下:
第四步:编译内核
$make ARCH=um2>&1 | tee build.log
示意图如下:
第五步:下载linux根文件系统Debian-Squeeze-x86-root_fs.bz2
下载地址:
http://fs.devloop.org.uk/
备注:当然了,我们也可以自己制作根文件系统,O(∩_∩)O~。
将Debian-Squeeze-x86-root_fs.bz2下载到/home/tom/Public/目录下,运行命令:
$bunzip2Debian-Squeeze-x86-root_fs.bz2
解压生成Debian-Squeeze-x86-root_fs根文件系统。
第六步:切换到root用户,运行User-mode Linux
$cd ~/Public/linux-2.6.38
$sudo bash //将bash运行在root权限下
#./linuxudb0=../Debian-Squeeze-x86-root_fs mem=32m
执行结果如下:
第三部分 gdb+uml调试
保持第二部分User-mode Linux处于正在运行,开启另外一个终端,在该终端中首先查询User-modeLinux进程的进程号。
$ps –el |grep linux
备注:其中的uml根进程号为17425,但是gdb绑定的是其子进程17427.
启动gdb,连接User-Mode Linux进程,设置断点,并进行调试。
$cd ~/Public/linux-2.6.38
$sudo bash
#gdb linux
示意图如下:
在gdb的调试环境下连接到User-Mode Linux进程,设置断点,即可进行调试。
使用命令:
$attach 17427
$break sys_clone
$info break
$continue
示意图如下:
此时我们在User-Mode Linux环境中打入ls –l/命令,系统将会在sys_clone()函数处停下来,示意图如下:
现在就可以在gdb中查看sys_clone()函数运行的状态。
此时我们就可以用常用的gdb命令,对sys_clone()函数进行跟踪、调试。
参考资料:
关于uml参考:
关于gdb调试参考
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。