内核环境配置

来源:互联网 发布:如何在淘宝买三唑仑 编辑:程序博客网 时间:2024/05/16 07:49

虽然按照前面的设置,读者已经可以编译一个内核程序并在自己的计算机上运行了,但是这样的做法是不明智的,因为一旦出现错误就会出现蓝屏,这时代码就会丢失。比较明智的做法是安装一个虚拟机,然后把安装好的sys文件放在虚拟机中运行。

1.下载安装WinDbg

WinDbg似乎是微软的御用调试工具,不但可以调试内核,也可以调试应用程序,但是在调试内核时被设计为双机调试,即需要一台计算机(下面称之为调试机)来调试被调试的计算机(被调试机),WinDbg必须安装在调试机上,调试机与被调试机通过串口相连接。可能调试机和被调试机我说的有点啰嗦,我这么一说大家就明白了,我的计算机是Win7系统,充当调试机,虚拟机中安装XP系统,当做被调试机,我在Win7上写好代码编译之后产生的.sys文件拷贝到XP上,在XP上运行,WinDbg安装在Win7上,通过设置WinDbg和VMware,调试产生的信息会在WinDbg上显示出来。

2.设置Windows XP调试执行

我们调试代码需要让XP设置为调试执行,我们这样做:首先在文件夹选项中设置为显示所有文件,不隐藏系统保护文件,然后找到boot.ini文件,修改boot.ini文件为:

[boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetectmulti(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows XP Debug" /noexecute=optin /debug /debugport=com2 /baudrate=115200
保存,重启系统会发现出现这样的选择项:


3.设置VMware的管道虚拟串口

在调试机是虚拟机的情况下,需要在虚拟机上生成一个用管道虚拟的串口,打开VMware,不要启动,按照以下步骤操作:

(1)右键->设置->添加->串行端口,点击下一步按钮

(2)选择输出到命名管道,点击下一步

(3)前两个保持不变,打三个选择另一端是应用程序,点击完成

虚拟机这样就可以了,下面是调试机上WinDbg的启动参数,使之连接一个管道,并把这个管道当做一个串口处理。

有一个比较简单的做法是在桌面上建立一个windbg.exe的快捷方式,单击右键并选择属性,在快捷方式中,在目标之后增加新的启动参数。我的是这样的:

C:\WinDDK\Debuggers\windbg.exe -d -k com:pipe,port=\\.\pipe\com_1,baud=115200
打开虚拟机,启动到调试模式下的Windows之后,打开WinDbg,就可以进行调试了,WinDbg上会显示连接上的信息。刚刚连接上的时候,虚拟机里的Windows系统会被中断,这时在WinDbg的命令提示符kd>后面输入g并按回车就可以了。

4.设置Windows内核符号表。

在调试连接上之后,打开WinDbg的主菜单File下的Symbol File Path,在这里输入符号表的位置,符号表和sys产生在同一个目录下,所以只要指定所在的i386目录就可以了。此外需要指定Windows的内核符号表,这些符号表需要从网上下载,但是没有必要自己去下载,可以在Symbol File Path中增加这么一句:

SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols
这条设置使WinDbg自动从微软网站上下载,首次使用比较慢,其实是在下载符号表,打开C:\symbols查看,这个路径可以指定为其他的位置。注意下载不一定总是成功,请多试几次。用WinDbg开始调试虚拟机的情形:


5.调试first

我的WinDbg符号表路径为:

F:\Driver_work\first\objchk_win7_x86\i386;SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols
我的源代码设置路径为:

F:\Driver_work\first
first这个驱动是什么都没有做,所以在加载之后DriverEntry会被执行一次,之后卸载的时候会执行DriverUnload.我们来运行一下:




为了我们能看到每一步,我们在DriverEntry中加载一个断点。我们在源码中加入

#if DBG      _asm int 3#endif
再次运行的时候会发现源码自动弹出,光标停留在断点位置:



这里的int 3是一句汇编指令,执行到它的时候程序会断下来,等于手工加了一个断点。加上宏DBG测试,保证只有调试版本这条语句才会被编译。








0 0
原创粉丝点击