只为找份工作!!!

摘要
  这是本人的毕业设计,在相当短的时间内完成,直至现在,还有几个重要的部件未模拟,如时钟、硬盘,还有一些设备未模拟完全,但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是可能需要的一个文件,文件太大,单独压缩)

上传的附件 Binary.zip
SoSmall.zip
msvcr100.zip