1.首先在QEMU官网下载QEMU最新版的源代码,最好别用apt get install qemu 来安装,这个安装会出现某些问题,GDB远程调试的时候会导致packet过长无法调试。
2.安装一些有用的包。
sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
sudo apt-get install git-email
sudo apt-get install libaio-dev libbluetooth-dev libbrlapi-dev libbz2-dev
sudo apt-get install libcap-dev libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev
sudo apt-get install libibverbs-dev libjpeg8-dev libncurses5-dev libnuma-dev
sudo apt-get install librbd-dev librdmacm-de
sudo apt-get install libsasl2-dev libsdl1.2-dev libseccomp-dev libsnappy-dev libssh2-1-dev
sudo apt-get install libvde-dev libvdeplug-dev libvte-2.90-dev libxen-dev liblzo2-dev
sudo apt-get install valgrind xfslibs-dev
sudo apt-get install libnfs-dev libiscsi-dev
3.编译QEMU
# Switch to the QEMU root directory.
cd qemu
# Prepare a native debug build.
mkdir -p bin/debug/native
cd bin/debug/native
# Configure QEMU and start the build.
../../../configure --enable-debug
make
# Return to the QEMU root directory.
cd ../../..
4.编译内核
sudo apt get install libcurses5-dev
从www.kernel.org下载内核
cd 到内核文件夹
make menuconfig 把kernel hacking里面的compile with debugging info勾上 save 然后退出。
make
这一步时间比较长,完成之后会在/arch/x86/boot/里面生成bzimage文件。
5.GDB调试
然后跑qemu-system-x86_64(这个QEMU不能是apt-get安装的qemu否则会报TCP REMOTE错这个错误非常蛋疼)用-kernel 参数挂载这个bzimage文件 并且-s -S
另外开一个terminal,cd 到linux 主目录下 gdb vmlinux
然后监听1234端口 target remote:1234
然后设置断点 b start_kernel 然后c 就断下来了。
至此QEMU 调试LINUX 内核的基本环境就搭建好了。
接下来要研究的问题就是如何调试呢?比如我在应用层有一个程序 这个程序会有系统调用。那么假如我现在想调试这个程序,并且观测它系统调用进入内核之后的状态,该怎么做呢?直接只用上面提到的那个kernel是做不到的。
由于我现在对LINUX内核理解还不深入。我暂时主要有这么几个想法。
1.LINUX是否可以更换内核。比如我在自己的linux新编译了一个内核,那么是否我可以把老的内核替换掉。也就是说用新的内核依然进入到我的现在的操作系统,这样我就可以直接对这个操作系统进行调试。(目前查阅了一些资料,感觉上是可行的,需要进一步学习linux boot加载的机制,有点类似于嵌入式系统)
2.把应用层的代码弄成机器码或者编译成内核模块的形式 想办法植入到内核里面,然后启动内核直接调。这个方法不需要对操作系统对什么额外的工作。
目前我还不知道这两个方法的可行性,接下来继续做实验。