- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Bochs调试VT代码环境搭建.doc
Bochs+Windbg调试VT代码
准备工具:
Windbg 6.12
bochs-2.4.6-msvc-src(/projects/bochs/files/bochs/2.4.6/)
vmware.
Securable (检查是否开启VT的)
VC 2008.
Intel?vt技术十分诱人,但是如何调试vt却是让人头疼#define BX_SUPPORT_VMX 0
改成
#define BX_SUPPORT_VMX 1
或者
#define BX_SUPPORT_VMX 2
2, 编译.你会发现bx_cpu_c::init_VMCS(),?vmcs_field_offset()等link error!
解决方法:
将cpu\vmcs.cc加进工程就可以了
3, 到现在bochs已经编译出来了,接下来就是安装系统.bochs太慢,使用vmware装把.具体步骤参考三寸法师的文章(/showthread.php?p=964315).装完后用Securable检测下看是否支持vt.再加上调试模式(修改boot.ini...不多说,不知道的可以搜一下vmware+debug调试)发现绿色的YES,好了支持了,不过还有问题,见下文.
4, bochs 支持串口, 用Windbg连接bochs进行源码调试吧.在bochs的配置文件中加一句
com1: enabled=1, mode=pipe_server, dev=”\\.\pipe\bochs”
然后运行虚拟机,会发现bochs会一直在等待,这时打开windbg连接\\.\pipe\bochs .嗯,bochs开始运行了.选择调试模式,好吧.windbg直接退了.有木有.有木有.如果是windbg 6.09你就发现他不会退出而是没啥反应.
5, 看了下bochs中串口的实现,是同步的(难道是因为这个退出的?),翻了下virtualbox的串口的代码发现确实异步,开了读写线程。好吧,看到网上有用bochs调试wrk的一篇文章wrk源码分析之WinDbg+Bochs调试,里面给出了段代码(注:这个代码我改了下发现这段代码在想串口写数据的时候锁死了, 修改及其原版代码见附件)用这个试试.
将其代码加到项目文件中.然后在serial.h中的bx_serial_t定义中添加一变量(红色字体部分):
int io_mode;
int tty_id;
SOCKET socket_id;
FILE *output;
#ifdef WIN32
HANDLE pipe;
void* p_cls_our;
#endif
#if USE_RAW_SERIAL
serial_raw* raw;
#endif
然后在serial .cc文件中的bx_serial_c::init(void)添加(红色部分) 这里我们添加了一个模式”pipe”具体设置见后面:
略…
if (server) {
pipe = CreateNamedPipe( dev,
PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
1, 4096, 4096, 0, NULL);
if (pipe == INVALID_HANDLE_VALUE)
BX_PANIC((com%d: CreateNamedPipe(%s) failed, i+1, dev));
BX_INFO((com%d: waiting for client to connect to %s, i+1, dev));
if (!ConnectNamedPipe(pipe, NULL) GetLastError() != ERROR_PIPE_CONNECTED)
{
CloseHandle(pipe);
pipe = INVALID_HANDLE_VALUE;
BX_PANIC((com%d: ConnectNamedPipe(%s) failed, i+1, dev));
}
}
// client mode
else {
if ( strcmp(mode, pipe) == 0 ){
BX_INFO((!!!!!!into our code!!!!!!!));
serial_pipe* our_serial = new serial_pipe(dev);
BX_SER_THIS s[i].p_cls_our = our_serial;
}else{
p
文档评论(0)