阅 读 文 章

虚拟机源码分析

[来源:网上转载 (http://www.chinaunix.net) | 作者:网友(converse) | 时间:2007-05-27 | 浏览:人次 ]


1)虚拟机是什么?“虚拟机”的概念其实很广,最常见的有以下两种虚拟机,第一种是模拟“裸机”运行的虚拟机,这样的虚拟机有VMWAREVirturePC,Bochs等,另一种是模拟操作系统运行情况的虚拟机,这样的虚拟机有Wine,JVM(java虚拟机)。其实,虚拟机就是一个中间层,可以理解为是两种环境的桥梁,如果把虚拟机的概念抽象一点描述,可以认为虚拟机是在某一个环境上模拟另一种环境运行情况的软件,这样的环境可以是不同的cpu,不同的os....等等。
    这里选择的是两个非常简单的虚拟机,一个是<<编译原理与实践>;>;一书中自带的TM虚拟机,另一个是<<程序员>;>;杂志2003年第六期里的一篇文章<<一个小型虚拟机的实现>;>;中实现的虚拟机,两者都有一个共同点,就是两者都是在汇编语言级别虚拟cpu运行情况的虚拟机,正因为这两个虚拟机的如此定位,所以在实现或者阅读这两个虚拟机的时候,你不得不从cpu的角度去思考问题,你必须对cpu的运行情况有了解,反过来说,阅读这两个虚拟机的源码也可以加深对cpu工作原理以及汇编语言的理解。这两个虚拟机的源码都可以在网上找到,前者在http://www.mathcs.sjsu.edu/faculty/louden/cmptext/,而后者可以在CSDN的网站上查找2003年第六期的源码。值得一提的是,CS:APP(<<深入理解计算机系统>;>;)一书中也有一章专门讲述CPU的运行原理,而且作者也自己实现了一个CPU,而且还是流水线型,所以这个虚拟机功能更酷也更加强大,因为作者自己定义了一种硬件语言来描述cpu,最后还有在这种cpu支持的汇编指令,在有Tcl/Tk的环境下还带有图形界面,非常直观,可以在http://csapp.cs.cmu.edu/public/students.html里的Chapter 4:Processor Architecture中找到源代码。

3)设计一个汇编语言级别的虚拟机的要求
学习过计算机原理的人都知道,一个cpu至少需要有以下几个部件:a)内存,装载所要执行的指令之用;b)寄存器;3)指令集,没有指令集执行指令就无从谈起。前两者非常简单,无非就是在内存中分配一个空间来模拟就可以了,而后者这
里要专门说明一下。我们知道任何高级语言,经过这个高级语言的编译器编译之后都是翻译成汇编语言的,然后由汇编器汇编成二进制文件最后再进行库的链接等等才形成了可执行文件,而可执行文件最终也是二进制格式的,在执行可执行文件的时候由加载器加载到内存中去,那么这里就有一个问题了:cpu是如何识别已经加载到内存中二进制文件并且正确执行的?这需要下
面的一个概念:OpCode。
    OpCode是什么?简而言之,OpCode就是与汇编指令相对应的二进制格式的代码,OpCode的英文名是OperationCode(中文可以翻译成“操作码”),每一个汇编指令都有一个相对应的OpCode格式,反之不然,不过这个问题这里不再深究,只需要知道汇编器把汇编指令翻译成相应的由opcode组成的二进制文件,这样在可执行文件加载到内存的时候,cpu就可以根据在可执行文件中的opcode来执行程序了。理论上来说,不同厂家的cpu所支持的opcode是不同的,那么这里就有一个问题了,比如说在Intel机子上编译成功的可执行文件到了AMD的机子上如何正确执行呢?如果没有猜错的是,每个cpu在实现的时候需要在cpu的上层加一个翻译指令的东东....具体的我不清楚,只是猜测而已,也许不对。扯了这么多,回到这里要实现的cpu上,因为只是简易的cpu,所以在opcode上也尽量的精简,在这两个虚拟机的实现中,都是采用了汇编指令和opcode一一对应的关系进行实现(记住我前面说过汇编指令和opcode在真正的cpu中并不是一一对应的!),这样简化了cpu的实现。关于opcode,网上
有一份不错的教程<<学习opcode>;>;:http://www.luocong.com/learningopcode.htm,遗憾的是作者从开始写这份教程一直到现在差不多两年时间过去了还没有完成,不过前面的文章对于理解opcode的基本概念已经足够了。opcode看起来好像很高深,其实它就在我们身边,在linux上有一个objdump的反汇编软件可以反汇编二进制文件,比如这样的一段反汇编的代码:
论坛热门帖子: [lch203] 写得蛮好的linux学习笔记(10-21)
[黑马制造] 学习java的30个目标(10-19)
[笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19)
[udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18)
[沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18)
TAG标签: 分析 源码 虚拟 指令 // 汇编 if break 执行 一个 内存

最新评论 共有0位网友发表了评论

发表评论

评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名:(注册)
密码:
验证码:
匿名发表

网站地图友情连接交流论坛网站投稿广告服务联系我们留言本站长统计
Some rights reserved: www.chmhome.com, 鄂ICP备07010232号 E-mail:chinakafei@live.com,QQ:552766
中国咖啡技术网(Chmhome):国外编程技术书籍,中文编程手册,经典编程文章,交流技术,技术软件下载,计算机论文,毕业论文.