3. Hyper-V的调试
下面我们介绍Hyper-V的调试方法。在前面,我们简单介绍了Hyper-V的结构,它的虚拟机和宿主机运行在同一个权限下,并且,由Windows系统中的驱动虚拟出对应的虚拟设备。所以,在调试方面,Hyper-V便显得略繁琐。如果要调试Hyper-V在宿主机中的驱动的话,不得不要进行Windows内核的调试。
而且,由于Hypervisor层的权限要高于Windows内核权限,所以当需要调试Hypervisor层代码时,仅仅调试Windows内核并不能满足这一要求。
下面,我们介绍两种不同的方法来调试Hyper-V。一种是实体机双机调试,一种是VMware调试Hyper-V,并且我们会分别介绍两种方法的优缺点。
3.1. 需要准备的工具
在介绍两种调试方法之前,我们需要做一些准备。首先,我们要确定以哪种方式进行调试。如果你使用的机器是笔记本或者电脑主机没有串口接口,并且确定主机的CPU支持Intel VT-X和VT-d技术(如果您的CPU是AMD,请确认是否支持AMD-V和AMD-Vi)。拿笔者主机的CPU为例,如图1-20,支持Intel VT-x & VT-d。那么,您可以优先选择使用VMware双机调试Hyper-V。
图1-20 CPU型号为Intel i7- 4790
如果您的机器不支持Intel VT-d(AMD-Vi)的话,只能使用双实体机双机调试的办法调试Hyper-V。
在调试方法上,一般情况下,无论是实体机双机调试还是VMware双机调试,笔者还是优先选择使用网络调试的办法。因为网络调试的速度快,配置容易,调试效率极高。但是,在网络调试的调试底层代码过程中,可能因为网络调试引入新的问题,影响调试的结果。但串口调试不会产生这种“干扰”,但随着而来的是调试效率的极度下降。所以一般来说,笔者会使用网络调试作为一般情况下调试的方法。如果发现问题,会再在串口调试的环境下重新调试一遍,以排除干扰。而且,一般来说比较旧的机型保留串口的几率要大些,可以充分利用身边淘汰下来的旧机器作为串口调试机器。除此之外,也有1394线的调试办法,介于1394接口已经在现在的主机上消失了,现在使用1394线调试还需要自行安装1394 PCI板载卡。过程比较麻烦,所以在此不做考虑。
硬件工具
首先,需要确定您的主机后面板是否有串口接口,如果没有,那只能通过网络调试的办法进行双机调试。这需要您将两台主机连接在一个局域网内,并且能保证双方的正常通信。
如果主机后面板有串口接口,那么您可以使用串口进行双机调试。那么您需要一根RS232 Null- modem线。Null-modem线的接线见表1-4。
表1-4 Null-modem接线方式
Null-modem线一般在商场中是买不到的,所以可能需要你自己做或者找能定做线缆的商家定做。事实上,笔者在调试时,只需要将9针串口线两端的2,3脚对调,其他线路直连便可正常进行双机的通信和调试。
图1-21 9针串口管脚定义(左公右母)
图1-21为9针串口管脚定义,左边为公头,右边为母头。
软件工具
软件方面需要安装好WinDbg,最新版的SDK安装包可以到微软官方下载(https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit)。除此之外,我们还需要微软的符号文件,请根据你被调试的系统到微软官方下载符合您被调试系统的符号文件包(https://developer.microsoft.com/en-us/windows/hardware/download-symbols)。
如果使用双实体机串口调试,那么还需要安装好HyperTerminal(http://www.hilgraeve.com/hyperterminal-trial/),或者其他串口通信的软件,用于检测串口是否正常通信。
下面我们配置WinDbg符号文件地址。我们需要新建一个环境变量,如图1-22所示。
图1-22 添加系统环境变量
在“环境变量”对话框中,点击“新建”按钮来新建一个系统环境变量。在“新建用户变量”对话框中,在“变量名”中填入“_NT_SYMBOL_PATH”,在“变量值”中填入“SRV*d:\symbols*http://msdl.microsoft.com/download/symbols”,然后确定保存。其中,“变量值”一栏中“d:\symbols”代表你安装符号文件包时选择的安装位置;“http://msdl.microsoft.com/download/symbols”代表微软的符号文件服务器,如果本地符号文件中没有匹配的符号文件时,便会从微软符号文件服务器上下载所需的符号文件。这个新建的环境变量用于配置全局符号文件地址,由于我们添加在了系统环境变量中,所以不用每次启动WinDbg再去重新设置符号文件地址。。由于笔者之前配置过环境变量,所以图中显示的是“编译用户变量”对话框。
如果您用WinDbg附加到任意一个进程时,输入命令“.sympath”如图1-23所示,那么说明符号已经设置成功了。
图1-23
3.2. 实体机双机调试环境搭建
下面我们介绍实体机的双机调试,这部分只介绍使用串口进行双机调试的方法。通过网络双机调试方法和下面“VMware双机调试环境搭建”大部分是一样的,只不过实体机双机网络调试用的是真实的网络设备而已。
首先,用Null-modem线或者2,3口交叉的RS232线将两台实体机连接起来。然后开机,分别在“设备管理器”中查看“端口”。如图1-24所示,左边是调试机,已经把另一端的被调试机主机串口识别为COM2;右边是被调试机,把调试机主机的串口识别为COM1。
图1-24
下面,设备双方串口的波特率,我们以调试机为例。在“设备管理器”的“端口”项中右键单击“通信端口”,“属性”,然后选择“端口设置”选项卡,如图1-25。
图1-25
然后将选项卡中的内容选择和图1-25一样,单击确定后保存退出。被调试机也是这样设置,并且一定要和调试机设置成一样的配置。然后两台实体机分别打开HyperTerminal,选择对方的端口进行通信,如果双方信息的收发都没有问题,那么恭喜您,串口已经能正常通信了。
如果两台实体机之间能稳定通过串口通信,那么下面还需要配置被调试机。笔者被调试机系统版本是Windows 10 14393 rs1,我们需要修改系统的BCD来完成被调试机一端的配置。下面的配置过程都是在命令提示符中操作的。
首先,先设置被调试机的Root Partition(Windows 内核)部分的配置。输入以下命令。
上面三句分别为:设置调试中用于通信的文件;设置调试方法为串口调试,并且使用com1口(这里的com1端口,便是上文中被调试机识别出的调试机端口号)作为调试端口,波特率为115200;设置调试开关为开启。
下面是设置Hypervisor层代码调试的配置。命令如下。
上面语句用来设置Hypervisor层代码由com1口作为调试端口,设备波特率为115200,并开启Hypervisor层代码的调试开关。
如果上面的命令都成功的执行,便可以开始设置调试机配置了。
首先,在调试机上新建一个connect.bat文件,打开编辑器,输入下面代码。
然后保存退出编辑器。
这个命令的意思是,打开串口号为com2的串口,并且自动设置波特率,然后创建两个管道文件,分别供Hypervisor代码和Windows内核代码调试用。
下面新建一个快捷方式,在“请键入对象的位置”中填入“"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -k com:port=\\.\pipe\vm0,baud=115200,pipe,reconnect”。“"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe"”部分是WinDbg的地址,然后跟的是参数。这些参数意思是,开始内核调试,并通过端口“\\.\pipe\vm0”,波特率为115200。这里面“\\.\pipe\vm0”便是vmdemux.exe创建的管道文件,vm0用于调试Hypervisor层代码用。最后将快捷方式重命名为“hypervisor”。
再新建一个快捷方式,和上面一样,但是这次在“请键入对象的位置”中填入“"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -k com:port=\\.\pipe\vm1,baud=115200,pipe,reconnect”。这个用来调试Windows内核代码,并将快捷方法重命名为“kernelroot”。
到此,双机调试的准备已经完成了。下面要先运行connect.bat然后在运行两个快捷方式“hypervisor”和“kernelroot”。开启被调试机电源,观察WinDbg的回显。
如图1-26所示,双机环境便搭建完成了,调试机可以随时中断被调试机的运行。
图1-26
3.3. VMware双机调试环境搭建
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课