Qemu+gdb跟踪内核源码

1.编译安装Qemu

Qemu源码下载地址:http://wiki.qemu.org/Download

linux下可以直接用wget下载:

wget http://wiki.qemu.org/download/qemu-2.2.0.tar.bz

解压缩bz2文件:

tar -jxvf qemu-2.2.0.tar.bz

由于我只有模拟x86的需求,所以在编译之前先配置Qemu:

cd qemu-2.2.2
./configure --atrget-list=i386-softmmu
make
make install

编译安装完之后,可以从http://wiki.qemu.org/Testing下载一个镜像测试一下,我这里下载linux-0.2.img.bz2解压之后用qemu运行:

qemu-system-i386 -hda linux-0.2.img

到这里Qemu就编译安装好了。

2.编译Linux Kernel

kernel下载地址:https://www.kernel.org/pub/linux/kernel/

直接用wget下载最新的3.18.5

wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.5.tar.bz2

解压缩bz2文件:

zx -d linux-3.18.5.tar.bz2
tar xvf linux-3.18.5.tar

编译内核生成bzImage文件,由于我需要用gdb调试内核,所以这里配置时需要打开debug info

make menuconfig

在kernel hacking中选择compile the kernel with debug info

make bzImage

这里内核没有做裁剪,编译时间很长,后续调试可以参考http://www.jinbuguo.com/kernel/longterm-3_10-options.html进行裁剪编译。

3.用Qemu+gdb调试内核

首先将编译出的bzImage和之前下载的linux-0.2.img放在一个目录,然后启动Qemu:

qemu-system-i386 -S -kernel bzImage -hda linux-0.2.img -append "root=/dev/hda" -monitor stdio
-monitor stdio的意思是将qemu的控制台转移到终端内在qemu命令行下启动gdbserver
gdbserver tcp::1234

在编译内核的源码根目录下启动gdb

gdb vmlinux

在gdb命令行下执行远程调试命令,给内核start_kernel打个断点,就可以进入start_kernel函数了

target remote localhost:1234b start_kernelcontinue

时间: 2024-07-30 23:42:57

Qemu+gdb跟踪内核源码的相关文章

ubuntu下linux内核源码阅读工具和调试方法总结

http://blog.chinaunix.net/uid-20940095-id-66148.html 一 linux内核源码阅读工具 windows下当然首选source insight, 但是linux下就没有source insight这么优秀的工具了,但是也有不少的替代品,但觉绝对部分人会选择vim+ctags+cscope的组合,还有部分人或选择wine中的source insight或选择navigatror,当然对于代码阅读来说vim+ctags+cscope的组合还是比较好的一

linux内核源码级调试

一 linux内核源码阅读工具 windows下当然首选source insight, 但是linux下就没有source insight这么优秀的工具了,但是也有不少的替代品,但觉绝对部分人会选择vim+ctags+cscope的组合,还有部分人或选择wine中的source insight或选择navigatror,当然对于代码阅读来说vim+ctags+cscope的组合还是比较好的一个选择方案,但是,当我使用了eclipse之后,个人感觉用eclipse作为linux环境下源码阅读工具确

构建menuOS系统并跟踪查看内核源码

本次实验的主要内容是编译跟踪内核,过程真的是一波三折,不忍回首! 首先我们对ubuntu系统进行换源,加快其下载速度,步骤如下: 1. 备份源列表 Ubuntu配置的默认源并不是国内的服务器,下载更新软件都比较慢.首先备份源列表文件sources.list: # 首先备份源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup 2. 打开sources.list文件修改 选择合适的源,替换原文件的内容,保存编辑好的文件, 以阿里

Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】

原文地址:Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938390.html 在构架相关的汇编代码运行完之后,程序跳入了构架无关的内核C语言代码:init/main.c中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段, 下面我就顺这代码逐个函数的解释,但是这里并不会过于深入

Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938393.html 在分析start_kernel函数的时候,其中有构架相关的初始化函数setup_arch. 此函数根据构架而异,对于ARM构架的详细分析如下: void __init setup_arch(char **cmdlin

Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938395.html 前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化.在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就是创建并启动内核线

使用Eclipse跟踪JDK源码

首先我们要学会的是将JDK源码加载Eclipse中. 1.点"窗口"-->"首选项",选择左边的"Java"-->"已安装的JRE",然后选择我们安装的JRE,并单击它,然后选择右边的"编辑". 点"编辑"将出现如下的界面: 2.跟踪阅读源码 如上图,在我自己写的代码中包含了StringTokenizer类,我们要看它的具体定义,就只要按住"Ctrl"键,

centos7编译linux的内核源码

昨天编译了一个linux 内核源码,遇到一些问题, 今天把我遇到的问题和解决方法分享给大家.希望可以帮助到需要的人. 1)检查是否安装了相应的包(我第一次编译的时候只安装的“Development Tools” 包,”Compatibility Libraries“和”Development and Creative Workstation“没有安装) [[email protected] yum.repos.d]# yum groups list #查看包组列表 Loaded plugins:

Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938396.html 在基本分析完内核启动流程的之后,还有一个比较重要的初始化函数没有分析,那就是do_basic_setup.在内核init线程中调用了do_basic_setup,这个函数也做了很多内核和驱动的初始化工作,详解