分析easyVM
来源:互联网 发布:复制软件 编辑:程序博客网 时间:2024/06/14 01:40
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
根据不同字符属性,将显存缓冲分成多个子字符串,分别显示
画光标
- 分析easyVM
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 大家帮忙分析分析!
- FFMpeg分析详细分析
- FFMpeg分析详细分析
- core 分析的分析
- 写给自己,分析分析
- FFMpeg分析详细分析
- 图像分析------直方图分析
- 静态分析 - 数据流分析
- Calendar GregorianCalendar 计算某年有多少周 、周的开始结束日期、日期的周数
- Command设计模式-文件过滤器FilenameFilter
- inux 音频架构 alsa hda
- 如何在Linux下通过ldapsearch查询活动目录的内容
- instruments的资料,内存泄漏
- 分析easyVM
- 男人要知道的40条忠告
- POI操作EXCEL(一)
- 设计模式C++实现(6)——建造者模式
- Linux中重定向及管道
- cramfs文件系统移植(一)
- 通过小练习掌握MFC知识点之起步篇--ComboBox的使用,DLL方式读取文件信息到CListCtrl控件中
- Android 驱动开发系列三
- 在Android中查看和管理sqlite数据库