[TED] 在用户空间Debug kernel

来源:互联网 发布:腾讯何时优化吃鸡 编辑:程序博客网 时间:2024/04/30 19:45

说到调试kernel大家第一个想到的估计是在kernel的配置文件中勾选debug项然后通过printk或者dump打印调试信息。

今天我们就介绍另一种方法,把kernel编译成一个可在用户和空间直接执行的应用程序,然后利用GDB直接调试这个应用程序。不但方便调试而且即使发生崩溃也不会影响到当前系统。特别适合初次接触linux kernel的筒子。做法其实也很简单:

首先下载你要调试的kernel源代码 解压,然后

make defconfig ARCH=um

这里采用linux的默认选项,当然你也可以通过make menuconfig ARCH=um自己定制

make ARCH=um

注意,如果你是在本机运行直接默认make ARCH=um就好如果编译机器和目标运行的OS不是同一平台就需要加上编译选项SUBARCH, 比如你编译机器是64位,而目标运行机器是32位的那么命令就是这样

make ARCH=um SUBARCH=i386

因为只是虚拟的linux所以大多驱动都被去掉而不会编译,所以一会功夫就ok了。完成后在当前目录下会生成一个linux的应用程序,你可以直接./linux运行,恩, 怎么回事,应用程序系统崩溃了?那是因为你还没有文件系统,kernel启动后找不到root OS当然会挂掉。 别急,你需要先做一个文件系统。

我们先虚拟一块128M的磁盘,在上面建立文件系统

dd if=/dev/zero of=/home/fs_root bs=1M count=128

mkfs.ext4 -f fs_root

将已经做好的root OS拷贝过去, 至于怎么做这个root OS可以先看看这里 http://blog.csdn.net/lalune/article/details/15498117

mount fs_root  /tmp_folder

cp -r -d /root_os /tmp_folder

好了, 现在让我们再看看, 这里ubda是指定root OS, mem指定内存大小, 默认是256M

./linux ubda=../fs_root  mem=128M

好了现在你就可以看到欢迎界面:

EXT4-fs (ubda): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) readonly on device 98:0.
devtmpfs: mounted
line_ioctl: tty0: unknown ioctl: 0x5600
EXT4-fs (ubda): re-mounted. Opts: data=ordered
Starting logging: OK
Starting mdev...
Initializing random number generator... done.
Starting network...
Starting input-event-daemon: input-event-daemon: open(/dev/input/event0): No such file or directory
done

Welcome to Vincent

剩下就是用GDB 调试了,

gdb linux


(gdb) b main
Breakpoint 1 at 0x60003c36: file arch/um/os-Linux/main.c, line 118.
(gdb) r ubda=../fs_root  mem=128M
Starting program: /data/work/linux-3.4/linux ./linux ubda=../fs_root  mem=128M


关于UML(可不是面向对象语言而是user mode Linux用户空间的linux)我们抛砖引玉到这,其实它的功能远不止这么多,有待大家继续挖掘。






原创粉丝点击