开个技术blog-开篇:虚拟化技术小结

来源:互联网 发布:数值最优化 万中 pdf 编辑:程序博客网 时间:2024/06/05 06:23

    我的口号是:拒绝转载,创新万岁!yy是创新之母,实践是创新之父!我会尽量写入自己的思考,也许不一定对。但自己思考的东西,哪怕有不足之处,也要好于单纯的转载。


    开篇:虚拟化技术小结

    虚拟化技术越来越热了,小结+yy一把:

    特定语言的虚拟机:对字节码的模拟。条件,OS不同。主要针对动态语言,可以实现跨平台。如JVM。关心OS

    最原始的办法:指令级模拟。条件:指令集不同,无OS。每读一条指令,就转化为目标机子上的指令。寄存器之类的在内存中。一般用于模拟嵌入式芯片。如WuKong模拟器。关心指令集。

    快一点的办法:用户态函数级模拟。条件:指令集相同。OS不同。用宿主机子上OSAPI实现目标应用程序所需的API。在用户态模拟。比如wine。关心API

    再快一点的办法:内核态函数级模拟。条件:指令集相同。OS不同。用宿主机子上OS的内核函数实现目标应用程序所需的系统调用。在内核态模拟。比如unified kernel。关心系统调用。

    虚拟硬件模式:大部分机器代码直接执行。条件:指令集相同,OS不同。当然要作一些钩子。加减乘除的指令不用改。内存相关指令?内核态怎么处理?硬件被虚拟化。一块虚拟的内存。例如:256M。内存物理地址要重新映射,因此MMU要虚拟。在虚拟的256M内存里,每个“进程”都有自己的页表。同样有内核态地址1G,这个任务交给MMU。但是这个内核态与真正的内核态不同。在宿主电脑看来,这个“内核态”仍然是用户态。所有“进程”都是在vmware的地址空间里运行。vmware4G地址空间有1G是真正的内核态,1G是虚拟的“内核态”。剩下2G用户态空间所有进程分享。如果不够,就把某块地址先rob过来,让其他进程对应的页失效。至于真正的内核态和虚拟的“内核态”的区分,要靠intel x86的四个ring了。把真正的内核态设置为ring0,虚拟的内核态设置为ring1,用户态设置为ring3。总线地址也经过了重新映射。“虚拟OS”对显存的操作,对鼠标键盘的操作,对网卡的操作,都变成单一进程对设备的操作。所以要发扬分身术。重新定义总线地址的操作。比如VMWare。关心硬件操作。

    还有虚拟操作系统模式Xen模式,就不仔细研究了。

 
原创粉丝点击