[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)我们抛砖引玉到这,其实它的功能远不止这么多,有待大家继续挖掘。
- [TED] 在用户空间Debug kernel
- 在KERNEL中加入DEBUG
- 在KERNEL中加入DEBUG .
- 窥探 kernel,just for fun --- 系统调用在用户空间的访问
- 窥探 kernel,just for fun --- 系统调用在用户空间的访问
- 基于ext4文件系统实现在用户程序空间修改kernel命令行参数
- Linux Kernel 2:用户空间的初始化
- linux 用户空间调用kernel 的api
- Kprobe在Linux kernel debug中的应用
- Kprobe在Linux kernel debug中的应用
- Linux下把kernel空间映射到用户进程空间
- PMEM- kernel空间映射到用户进程空间
- 内核空间(kernel-space) VS 用户空间(user-space)
- kernel debug:
- kernel debug
- kernel debug
- [TED] 用git下载kernel源码
- 用户和kernel空间使用mmap共享内存
- java学习之路----项目经验----关于TOMCAT中文乱码问题的总结
- SOM自组织神经网络
- Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.解决方法
- 批处理关机命令
- mysql 实现远程访问,phpmyadmin实现远程连接mysql
- [TED] 在用户空间Debug kernel
- [java]Struts2防止用户重新登陆的实现
- BO3.1Script
- Android webkit image的加载过程解析(二)
- 交流群里遇到的一个小问题
- 解决“Unable to get debug signature key”的办法
- EPOLLIN和EPOLLOUT究竟什么时候触发?
- C++父类定义虚函数其派生类的同名函数使用virtual关键字吗?
- [JAVA]Hibernate 有选择性的更新--控制insert和update语句