Linux UML 内核调试方法

Linux UML 内核调试方法小结

一 UML环境的搭建

1 下载內核

从官网www.kernel.org 选择版本 linux-3.10.57.tar.xz

解压到相应路径 ????/opt/um/linux-3.10.57

?

2 基于 um的内核配置

#cd /opt/um/linux-3.10.57

#cp cd /boot/config-3.8.13.13-cdos .config

# make olddefconfig ARCH=um

?

为方便进行调试,修改配置文件

#make mrproper

#make mrproper ARCH=um

# make menufconfig ARCH=um

在选择配置时确保选中:

Kernel Hacking->

Compile the kernel with debug info(对应的DEBUG_INFO配置为yes)

和Compile the kernel with frame pointers(对应的FRAME_POINTER配置为yes)

这样生成的二进制内核linux中才有详细的调试信息。

?

同时,生成完.config文件后,编译之前,可以用编辑器打开源码根目录下的Makefile文件,把编译优化等级-O2调成-O1,这样可以在保证编译通过的前提下生成的内核文件具有较好的调试效果。

3 编译内核及模块

#make linux ARCH=um

#make modules ARCH=um

#make modules_install ARCH=um

?

生成我们需要的内核了,而且支持调试了。

?

4 制作文件系统

直接启动会有问题的,提示找不到root文件系统。这样我们用人家现成的。

http://fs.devloop.org.uk/ 下载 CentOS6.x-x86-root_fs.bz2

通过gunzip2 解压 得到 CentOS6.x-x86-root_fs

注: CentOS 经过实践可用,同样的 Ubuntu Trusty 运行时会遇到各种问题.

当下载或制作好更文件系统中后,可以将上一步生成的modules拷贝到UML根文件系统的对应目录中去。在Host Linux和UML根文件系统之间传递文件,最简单的方式就是使用挂载UML根文件系统到Host Linux中的目录,然后使用cp。拷贝Host Linux中源码根目录下mods中的文件到UML根文件系统中:

#mount -o loop CentOS6.x-x86-root_fs /mnt

#cp –R /opt/um/linux-3.10.57/mods/lib/modules/3.10.57 /mnt/lib/modules

#umount /mnt

?

5 制作文件交换系统

一般情况下不使用交换文件系统也是可以的,使用交换系统可能对系统的稳定性有些好处。

使用以下命令生成:

#dd if=/dev/zero of=swap_fs bs=1M count=512

?

#mkswap ./swap_fs

?

?

二 gdb 调试UML

经过以上步骤,调试所需要的环境已经准备好,接下来就可以开始调试工作了。

1 运行 User-Mode Linux

在 编译好的/opt/um/linux-3.10.57 根目录下,执行Linux运行

# ./vmlinux ubda=.CentOS6.x-x86-root_fs ubdb=swap_fs

或者 # ./linux ubda=.CentOS6.x-x86-root_fs ubdb=swap_fs

?

出现以下信息,说明UML运行成功,默认使用root 账户登录,无密码。

CentOS release 6.5 (Final)

Kernel 3.10.57 on an i686

?

localhost login:

?

2 gdb 调试uml

保持上一步中的UML 保持运行状态,开启另一个终端。

首先查询UML 的进程号,可以看到其中的uml根进程号为29142,但是gdb绑定的是其子进程29143。

root@liuyw-OptiPlex-9010:/opt/um/linux-3.10.57# ps -el|grep linux

4 S 0 29413 30142 27 80 0 - 8836 hrtime pts/22 00:00:02 linux

1 S 0 29420 29413 0 80 0 - 8836 SyS_io pts/22 00:00:00 linux

1 S 0 29421 29413 0 80 0 - 8836 unix_s pts/22 00:00:00 linux

1 S 0 29422 29413 0 80 0 - 8836 poll_s pts/22 00:00:00 linux

1 t 0 29423 29413 0 80 0 - 346 ptrace pts/22 00:00:00 linux

1 t 0 29551 29413 0 80 0 - 167 ptrace pts/22 00:00:00 linux

1 t 0 29702 29413 0 80 0 - 172 ptrace pts/22 00:00:00 linux

1 t 0 30000 29413 0 80 0 - 242 ptrace pts/22 00:00:00 linux

1 t 0 30025 29413 0 80 0 - 357 ptrace pts/22 00:00:00 linux

1 t 0 30032 29413 0 80 0 - 381 ptrace pts/22 00:00:00 linux

?

启动gdb,进入gdb调试环境

#gdb linux

#attach 29143

?

3 测试gdb

在gdb 环境中设置断点在sys_clone。

#b sys_clone

#i b

?

在UML环境中执行命令ls -l,系统将会在sys_clone()函数处停下来,现在就可以在gdb中查看sys_clone()函数运行的状态。

?

至此,UML 调试环境已经搭建起来了,我们就可以对linux 内核进行基本的调试了。

?

参考文档

1 http://blog.csdn.net/ztz0223/article/details/7874759

2 http://blog.chinaunix.net/uid-21525518-id-1824661.html

3 http://blog.sina.com.cn/s/blog_70dd16910101akk2.html

?

?

?

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。