2.1 传统调试器原理
传统的内核调试器在实现断点功能时,都是修改中断向量表,捕获CPU的单步异常和断点异常来实现的。被调试软件只要检测中断向量表是否被修改就可以判断当前是否运行了内核调试器。
图2-1-1原理图:操作系统正常的CPU异常处理
图2-1-2原理图:传统调试器
2.2 硬件虚拟化技术的调试器原理
基于VT-x技术的内核调试器主要原理是创建一个虚拟机,将当前操作系统转置于虚拟CPU中运行。这时调试器属于VMM,客户机引发的CPU异常是会被VMM最先捕获到的。捕获异常并处理完毕后才会下发回客户机。调试器作为VMM只需处理与调试相关的单步和断点异常,并不需要做真正虚拟机做的大量虚拟工作。
图2-2-1原理图:基于虚拟化技术的调试器
总的来说虚拟化调试器的最终实现是:不修改中断向量表,且优于操作系统捕获到异常,并且可以决定是否将异常下发到虚拟CPU(操作系统)。而实现的最重要思路就是利用硬件虚拟化技术创建虚拟CPU,并将当前物理CPU上运行的操作系统转到虚拟CPU中。实际上就是CPU控制权的转移,或者说是CPU上下文的转移。
2.3 开发环境搭建
硬件环境:Intel CPU 32-bit 支持虚拟化(VT-x) 具体可通过查看/proc/cpuinfo 是否有“vmx” 这个flag:$ grep vmx /proc/cpuinfo
软件环境:32位非PAE内核发行版(distro)没有特定的要求目前已测试支持Ubuntu, Fedora, RHEL6(RHEL5 不支持,是因为本项目中使用的一些宏在KVM的库文件中,而RHEL5的内核并没有合并KVM的代码,这样导致在RHEL5中有编译错误)本软件是在Ubuntu环境下开发的。
开发环境:需要gcc、yasm和code::block集成开发环境
code::block是一款支持C/C++等多种语言编辑的跨平台集成开发环境。他有良好的用户接口,使用apt-getinstall codeblock即可一步安装。
yasm是一款汇编编译器,完全支持nasm语法,与微软的masm语法基本相同。它支持x86和AMD64指令集,有windows和linux等多种操作系统下运行的版本。使用apt-get install yasm 也可一步安装,在fedora下不能直接安装,可下载源码自行安装,下载地址:http://linux.softpedia.com/get/Programming/Assembler-Tools/Yasm-621.shtml
特殊要求:调试器需要在单核模式下运行,因此需要改变grub配置文件,为kernel加入maxcpus=1这个参数。