zoukankan      html  css  js  c++  java
  • 分析easyVM 未完成)

    E:\test\easyVM_Small_
    指令解析,cpu虚拟
    设备虚拟,比如display, DMA, floppy, harddisk, keyboard, PIC, printer, RTC, timer,serial
    程序flow, 架构

    低调发布easyVM 0.2版

    简介:
    ====================
    easyVM是一个简单的虚拟机。
    0.1版本只支持8086指令集和一些简单的I/O设备,只支持英文文本显示方式。
    0.2版本主要是在0.1版基础上加了一小部分32位指令(push eax等),使得easyVM可以运行MS-DOS 6.22自带的大部分程序。

    文件说明:
    ====================
    Bios\Bios.bin        Bios程序
    Bios\BiosData.bin    CMOS数据区
    DOS.IMG            MS-DOS 6.22的镜像
    easyVM.exe        easyVM主程序
    easyVM.ini        easyVM的配置文件
    Readme.txt        本说明文本
    TC.IMG            含有Trubo C 2.0的软盘镜像
    Dos622c.img        硬盘镜像

    easyVM.ini配置文件
    [Memory]
    ;MB
    Size=32

    [IMG]
    A=DOS.IMG
    B=TC.IMG
    C=
    cylinders=20
    heads=16
    spt=63

    [Boot]
    Boot=A

    程序流程:
    WinMain
        VMInit
            CPUInit
                设置cpu从eCPU.cs=0xf000;eCPU.ip=0xfff0;开始执行
                初始化InTable,和outTable
            malloc memory for MemoryStart
            read BIOS\\BiosData.bin to MemoryStart+0x400, size=0x100
            set boot drive
                *(char *)(MemoryStart+0x0400+0x0100)=0 for A
                *(char *)(MemoryStart+0x0400+0x0100)=1 for B
            read BIOS\\BIOS.bin to MemoryStart+0xf0000, size=
            DispInit
            PICInit();
            RTCInit();
            FloppyInit();
            HardDiskInit();
            DMAInit();
            PrinterInit();
            SerialInit();
            KeyBoardInit();
            SystemTimerInit();
        VMRun
            CPURun:里面用一个for不断执行
                ExecIns
                    根据当前ip:evIP得到内存中当前指令OpC
                    从InsTable[Opc]得到指令对应的函数的地址
                    执行该函数
                RefreshVideoRAM

        VMShutDown
            CPUTerminate

    cpu虚拟主要文件为cpu/cpu.cpp, cpu/instructions.cpp
    struct CPU 定义了cpu的所有寄存器
    SetupInstructionTable用于设置InsTable,

    消息响应,比如键盘,WM_PAINT等,在WndProc函数中(IO\Display.cpp)定义

    对于显示模块, 用了一条IO指令来代替整个INT 10H(out    0b0h,al. 在easyvmBIOS.asm说明),INT10H的具体程序在Display.cpp里实现,
    函数IO_Write_00B0
        

    OnPaint
        TextBufOut
            根据不同字符属性,将显存缓冲分成多个子字符串,分别显示
            画光标
  • 相关阅读:
    UNIX环境高级编程——Linux终端设备详解
    UNIX网络编程——网络IPC:套接字
    UNIX网络编程——Socket通信原理和实践
    UNIX环境高级编程——单实例的守护进程
    UNIX环境高级编程——初始化一个守护进程
    UNIX环境高级编程——创建孤儿进程
    UNIX环境高级编程——实现uid to name
    UNIX环境高级编程——标准IO-实现查看所有用户
    自考-数据库及应用
    自考-数据库及应用
  • 原文地址:https://www.cnblogs.com/cutepig/p/1577146.html
Copyright © 2011-2022 走看看