只为找份工作!!!
摘要:
这是本人的毕业设计,在相当短的时间内完成,直至现在,还有几个重要的部件未模拟,如时钟、硬盘,还有一些设备未模拟完全,但8086指令集已完全模拟。当前版本能够加载并运行DOS 2.11及Minix2.0.0的系统安装盘。整个虚拟机在经过百万级指令的运行后,指令流还是准确无误的。
(两行*号间的内容跟本虚拟机无关)
*****************************************************************
自我介绍:
本人开放此源代码的最主要目的便是找一份工作,对于虚拟机相关技术,本人已研究相当长一段时间,也能扯出各种文章,但感觉还是一个真正的作品实在吧,尽管它不完美。
本虚拟机很大程度上能反应本人所撑握的技术、学习能力、及编程习惯,有兴趣的朋友可以查下代码。
本人联系方式:mxwl.fangqiba@yahoo.com.cn (暂时只关注工作相关)
接触过的技术:
1. C/C++ 熟练
2. 汇编 熟练
3. Win32/MFC 熟练
4. WDF驱动编程 熟练
5. ASP+HTML+CSS+JS 熟练
6. OpenGL 了解
7. BIOS开发 了解
其它学习过的东西,都花过相当数量的时间,有些花得时间远超上面所提的技术:
Windows内核相关
Intel IA32指令体系结构,粗读相关的大部分文档,给出一串可逆向的二进制数字,本人
不查资料,能大致猜出对应的指令。 :- )
多核编程
编译原理
操作系统原理
微机原理
软件逆向
网络相关
熟悉早期硬件及各种芯片的原理及编程
通读万页外文资料
一直在用的一些软件或工具,一些入门不难,但能证明我在做什么吧:
WinDbg、VS2010、VC6.0、Gcc、WDK、OllyDBG、Bochs、Masm、Nasm、ndisasm、DeviceTree
已读或正在读的开源项目:
Minix
VirtualBox
Bochs
WRK
一些早期版本的BIOS
以后会尝试阅读的开源项目
OpenBIOS
LinuxBIOS
Linux
GCC
Qemu
特殊的技能:
1. 英语过6级,不借助翻译的情况下,也能熟练阅读外文。
2. 了解各种算法,曾花大量时间沉迷此道。
3. 过得去的口才。
希望从事的工作:
驱动开发
BIOS开发
软件安全
服务器端软件开发
Windows及Linux内核相关
科研
其他工作需求:
工作地点为广东省(虽然本人浙江人),理想为广州市附近,一级二级城市无所谓
公司大小无所谓
住宿,交通方便
双休
如果您的团队足够优秀,本人不会在工资上提过份要求
最好不是游戏开发、嵌入式开发、应用软件开发、手机相关开发,拒绝破解、外挂等相关(杀毒,反挂外ok)。
本人能用、够用、耐用,如果贵公司要找这方面的人,本人是不会让贵公司后悔的,有兴趣的欢迎联系。
工作外:
寻找有同样爱好的朋友,不是工作,仅是因兴趣爱好而聚在一起。我们可以:
开发虚拟机
开发够用的操作系统
开发BIOS(不是修改!)或虚拟机够用的BIOS
开发系统级调试器
开发编译器
其它
*****************************************************************
本虚拟机处于开发的最初阶段,暂时的目标为完全模拟IBM PC/XT,即能运行DOS 2.x及Minix 2.0.0。系统开发工具为VS2010及WDK,还有大量小工具。整个开发涉及的内容相当广,大部份核心代码运行在驱动模式下,而又在很短的时间内完成,为了保证质量,以及整个虚拟机设计上结构正确,只能采取部分模拟的原则。整个虚拟机模拟细节如下:
BIOS: 网上一分开源的基于IBM PC/XT机的BIOS,在未来,肯定要自已开发一分虚拟机够用的BIOS。
CPU:除数学指令(协处理器)外的所有8086指令(约300条)已完全模拟,执行速度远远快于物理8086,为了保证正常运行,甚于需要做一些延迟。
内存:支持640KB
显示适配器:IBM 彩色/图像显示适配器(IBM Color/Graphics Monitor Adapter,IBM CGA)被设计用来连接IBM彩色显示器,以及一些家用电视机。这个适配器同时支持黑白或彩色屏幕,有两种基本的运行模式:字符模式(alphanumeric,A/N)及所有点可寻址的图像模式(All-Points-Addressble graphics,APA)。本系统暂时只模拟了A/N模式。在A/N模式下,显示器可以在40列25行模式下操作,也可以在80列25行模式下操作。本系统暂时只模拟了80列25行模式。
软盘:软盘驱动适配器为5-1/4'',支持的容量为360KB,暂时只支持DMA模式,且只实现读操作。
时钟:未模拟
硬盘:未模拟
打印机:未模拟
游戏适配器:未模拟
如果你想运行本程序,建议同时运行Dbgview并开启内核捕获,其他注意如下:
(1)本程序大部份核心代码运行于内核模式下,但未经历足够的测试验证,本人不保证所有代码准确无误、是驱动安全的,因此,建议运行在其他的虚拟机中或者测试机上。
(2)此项目驱动文件是在Windows 2003编译链接,所以只能运行在Windows 2003上。
(3)程序正常退出时,便会自动卸载已安装的驱动,如果非正常退出,可在重启计算机后,运行Uninstall.cmd
(4)默认运行的操作系统为 DOS2.11(对应的软盘镜像为Data/DOS2_11_1.IMA)
如果想运行其他兼容的操作系统,可以尝试将Data/OS.IMA文件替换为对应操作系统的软盘镜像。比如希望运行Minix 2.0.0,则可以将Data目录下的MinixROOT.IMA(即Minix 2.0.0软盘镜像)重命名为OS.IMA。
(4)时间关系,本虚拟机未模拟时钟跟硬盘,运行到相关功能时,便会退出程序,或死循环,但不会出现其它严重问题。
(5)本虚拟机虽未开发完全,但按本人的编程习惯,基本上可以放心运行,蓝屏,死机的出现是极其意外的,如果遇到,可以联系本人。
本程序仅供学习、交流之用,您可以将它作为虚拟机技术研究的起点。如果能将IBM PC/XT机完全模拟,那么本虚拟机可以作为当代大学微机课程及 操作系统课程的不错的教学软件。
如果你想阅读本代码:
整个系统开发至今,项目代码逐渐庞大而变得难以阅读。整个系统由好几条线程组成,还有一些必须的定时器,这些更增加了代码的阅读难度。
其中,Win32窗口线程便是整个系统的第一条线程。其代码位于“MainUI/MainUI.cpp”文件中,该文件中的StartVM便是启动当前虚拟机,而StopVM则是中止当前虚拟机的运行。
在StartVM初始化好所有虚拟机所需的资源后,运行VMR3Run,此时便会调用DeviceIoControl进入内核模式,调用VMR0RunWithEmu(代码位于“KernelServices/SourFiles/VM/VMR0.c”,之后又会调用VMMR0StartEmu(代码位于“KernelServices/SourFiles/VMM/VMMR0.c”)。在VMMR0StartEmu中,发送命令使CPU模拟线程(EmThread,代码位于“KernelServices/SourFiles/VMM”)开始运行,此时,正式开始本系统核心代码的运行。
一个EmThread线程便代表了一个CPU,但本系统未考虑更多与多核相关的其他模拟,只是为未来的进一步开发做准备。本线程最主要的代码便是整个while循环,因为暂时只实现了一次只模拟一条指令,所以每循环一次,在逻辑上等同于运行一条指令。
在如下代码中,模拟了一些异步事件:
if(*pEmAsynEvent != EM_ASYN_EVENT_NONE){
…………
}
当代物理机上,模拟8086,速度过快,需要一个延迟:
delay = 2000;
while(delay--){};
解析并运行一个指令:
rt = EmulateOneInstr(pEmulator);
出现程序性异常或收到外部中断:
if(*pEInum != EOI_NONE){
…………
}
至此,便完成了一条指令的运行。
IMThread线程(代码位于“KernelServices/SourFiles/VMM/VMMR0.c”)实现了对外部 中断的管理,在中断链表非空时,它便会向EmThread线程不断的发送中断信息。
跟其它虚拟机的比较:
拿一个未完成的“残次品”跟其它大型虚拟机做比较是如此的不自量力,但本人曾花大量时间阅读几个开源项目的代码,在这做下技术上的区分也是有必要的。拿来作对比的有VitualBox及Bochs,对于其他虚拟机如Vmware、Virtual PC因为不是开源项目,也无从比较。
本虚拟机任何一行代码都是本人亲自敲打而出。在开发此虚拟机之前,VirtualBox及Bochs代码本人已曾翻阅好几个月,在吸取前人经验的同时,也可避免走一些弯路,甚至在它们基础上作了相当数量的自认为的“改进”。
本虚拟机在开始便被定义为应用型的虚拟机,而不像Bochs那样的调试器,所有的核心代码全部运行于内核模式下,这样方便对本机资源的管理,这里便与Bochs有着非常大的区别,比如本来直接的函数调用,变成用户模式与内核模式之间的通信,线程管理,资源同步都是完全不同的。所以,在总体结构上,本虚拟机偏向于VirtualBox,这也是为未来的虚拟机加速或基于硬件的虚拟机加速做准备,是必须的。
在模拟CPU,本虚拟机又偏向Bochs,采用的是“解释”,而不像VirtualBox中对应的软件模拟模式下的基于Qemu的“动态指令翻译”,当然,动态指令翻译性能是高很多的,但实现代价较大,在未来可以考虑,而且VirtualBox在模拟指令时采用了“虚拟化加速”(即让客户机指令直接运行于物理机)、“内存补丁”、“指令缓冲”等技术,这些都是值得学习的。
既然本虚拟机暂时在模拟CPU时,采用了与Bochs类似的“解释”技术,在这里,也做一下比较。在解释指令时,因为指令的运行逻辑是固定的,没有什么可以创新之处,本人在模拟时,也有不断参考Bochs的代码,减少Bug的出现,因为Bochs采用了类拟C++的特性,而本系统的内核代码是纯粹的C,变量都是通过函数参数传递的,再加上数据结构的完全不同,因此代码“看上去”差别也是很大的。在指令取指时,本系统与Bochs采用的方法是完全不用的,事实上本人还没弄清Bochs的取指原理。如果Bochs也是单条指令模拟,且不支持缓存,本虚拟机的指令模拟性能应该在其之上,本虚拟机通过各种方法排除了大量的判断语语,但代价就是模拟时代码量大大增加。
总体而言,除了指令的运行逻辑,本虚拟机同VirtualBox或Bochs代码相似度,最多10%。
如果您手头还有其他开源虚拟机代码,也可以拿来做比较。
因为学校那边没结束,不好开放所有东西,而且论坛上传文件大小有限制,暂不开放开发环境(配置比较麻烦,至少装VS2010及WDK),以及库文件SoSmall.lib的代码,此库文件只包含极少的用户模式与内核模式通信代码,简单说就是一些DeviceIoControl。此篇文章可能会在各大论坛同时出现,如果没几个人关注,本人也不好自作多情开放更多东西了,此系列文章也会只有一,没有二、三……
支持的留个言,谢了!
(附,msvcr100.dll是可能需要的一个文件,文件太大,单独压缩)
- 标 题:【开源】入门级虚拟机(1)
- 作 者:SoSmall
- 时 间:2011-05-02 19:47:57
- 链 接:http://bbs.pediy.com/showthread.php?t=133274