none
Hyper-V中程序不运行了? RRS feed

  • 问题

  • 我在开发一个程序,就将其视为操作系统吧,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;
    }

    2019年10月4日 8:57

全部回复