分析easyVM 未完成)
生活随笔
收集整理的這篇文章主要介紹了
分析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
?? ??? ?根據不同字符屬性,將顯存緩沖分成多個子字符串,分別顯示
?? ??? ?畫光標
指令解析,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
?? ??? ?根據不同字符屬性,將顯存緩沖分成多個子字符串,分別顯示
?? ??? ?畫光標
轉載于:https://www.cnblogs.com/cutepig/archive/2009/10/01/1577146.html
總結
以上是生活随笔為你收集整理的分析easyVM 未完成)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP长文章内容自动分页函数
- 下一篇: Chrome OS 0.4.220 Be