询问者
Hyper-V中程序不运行了?

问题
-
我在开发一个程序,就将其视为操作系统吧,MBR引导OK了,活动分区是FAT32,活动分区的启动程序也OK了,在活动分区下有一个引导文件RBXLDR。然后,各个程序分开测试都没问题了,但是在Hyper-V中测试时,发现在跳转到RBXLDR后,HyperV就停止了,没有往下运行,也没有报错。 结果是这样的
(图片由于未能验证,不给发)
然后我将FAT32分区的启动程序单独做成COM文件,放在活动分区的根目录下,用DOS启动软盘启动后,直接执行FAT32启动程序,RBXLDR是可以运行的。需要说明的是,整个VHD磁盘中只有RBXLDR和LDR.COM这两文件,LDR.COM就是做成COM的FAT32分区启动程序。
在然后,我把这个VHD文件挂到BOCHS中,看看能不能顺利启动,结果发现在BOCHS中可以顺利的完成启动,运行活动分区根目录下的RBXLDR文件,运行的结果是这样的
当然,我还没在物理机上测试我的程序,但就这个情况来看,HyperV是不是有什么特殊的要求?
所有代码太长,只能贴主程序的代码出来了,按理说,在DOS下直接执行引导程序能正常运行,应该可以表明程序没错了,程序FAT32启动程序,是在DOS下用BORLAND C/C++ 3.1编译成COM格式的可执行文件
int main(void) { fat32bpb_t * pBPB; fatdir_t dir; #if _OS_ == __DOS__ int i; for( i = 0; i < 80*25; i++) VBUF_BASE[i] = 0x0720; __asm{ mov ah, 2 mov bh, 0 mov dx, 0 int 010h } #endif prints("ROBIX FAT32 PARTITION BOOTER RUNNING\r\n"); pActPartStartSect = (uint32_t FAR *)0x000003F8L; pActPartStartSect[0] = 0l; pActPartStartSect[1] = 0l; if(BuildHDDTab() != TRUE){ BootFailed(strDiskErr); return 0; } /* build the FAT32 parameter */ pBPB = (fat32bpb_t *)bufFAT32BPB; nActPartStartSect = *pActPartStartSect; nBytesPerSect = pBPB->bpb_BytesPerSect; nSectPerClus = pBPB->bpb_SectPerClus; nRootClus = pBPB->bpb_RoorClus; nRsvdSectCnt = pBPB->bpb_RsvdSectCnt; nFirstDataSect = FirstDataSect(pBPB); #ifdef __DEBUG__ #if _OS_ == __DOS__ printf("active partition start sector: %ld\n", nActPartStartSect); printf("bytes per cluster: %d\n", nBytesPerSect); printf("reserved sector count: %ld\n", nRsvdSectCnt); printf("partition first data sector: %ld\n", nFirstDataSect); #elif _OS_ == __WINDOWS__ printf("active partition start sector: %d\n", nActPartStartSect); printf("bytes per cluster: %d\n", nBytesPerSect); printf("reserved sector count: %d\n", nRsvdSectCnt); printf("partition first data sector: %d\n", nFirstDataSect); #else #endif #endif /* search ROBIX LOADER file in root directory */ if(SearchDirectory(nRootClus, LOADER_FILE, &dir) != TRUE){ BootFailed(strLdrFileNotExist); return 0; } prints("ROBIX LOADER FOUND!\r\n"); /* load the ROBIX LOADER into memory, default at 0800:0100. 32-BIT physical address is 0x00008100 */ LoadFileToMem(FAT32_GET_CLUSTER(&dir), dir.fd_FileSize, LOADER_BASE); IVT[243] = 0x08000100L; prints("ROBIX LOADER BEGIN\r\n"); #if _OS_ == __DOS__ /* run the ROBIX LOADER via IVT */ __asm int 243 #elif _OS_ == __WINDOWS__ CloseHandle(pHDDTab->hdd_IOAddr[0]); #endif return 0; }
全部回复
-
Hi ,
由于涉及到开发方面的问题,已经超出了虚拟化论坛的支持范围,建议您将此问题PO在C++论坛以获取更加满意的答复,以下是C++论坛的链接:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/home?forum=vcgeneral
最后,如果回复对您有所帮助的话,请您把回复标记为答复,我们将暂停对此贴的追踪。
感谢您的理解和支持。
祝您工作愉快!
此致
Candy
Please remember to mark the replies as an answers if they help.
If you have feedback for TechNet Subscriber Support, contact tnmff@microsoft.com- 已编辑 Candy LuoMicrosoft contingent staff 2019年10月7日 9:46
- 已建议为答案 Candy LuoMicrosoft contingent staff 2019年10月9日 7:23