分析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
根据不同字符属性,将显存缓冲分成多个子字符串,分别显示
画光标
- 上一篇 分析7zip(未完成)
- 下一篇 分析google perf tools(未完成)