站在任何一个操作系统的角度来讲,它都认为自己是可以使用所有硬件的,它负责管理所有的硬件。因此操作系统看见的CPU是全量的CPU,即全部的CPU时间片。对于内存,它能够看见全部的、连续的的内存空间,这个内存空间必须要从0x0000开始。在32Bit系统中,有大概1MB的空间是给BIOS使用的,16MB是给DMA使用的。如果是64bit系统,有1Gb空间需要给DMA。虽然有1GB的空间分配给了DMA,但是这个空间其实还是可以使用的。对于IO设备来说,操作系统应该是能够看见全部的IO设备,而且每一个IO设备还应该关联到当前的内核所使用的CPU上某一个中断管脚和端口上。
那么按照上文所述,就以硬件的物理地址而言,可以把物理地址的内存空间划分为两段,针对物理内存的地址叫做PA,而每一个进程所看见的地址我们叫做VA,即线性地址又叫虚拟地址。
有了上述的前提,我们来讲讲在vmwareworkstation的虚拟化技术。我们知道,vmware workstation是安装在我们的操作系统当中的,是一款虚拟硬件的虚拟化技术。在我们的操作系统之上,我们允许很多的进行,vmware workstation置是其中的一款进程。当我们安装好这款软件之后呢?我们需要在他上面运行一些虚拟机。vmware workstation在这里就在我们的操作系统之上,给我们模拟出来了一堆的硬件,而且这些硬件设备没一个都是一个独立的平台。所以我们可以在这些额外的硬件之上安装操作系统。那么这样一来,架构就变成了我们的操作系统之上运行了一个软件,在这个软件之上又运行了一些操作系统。那么问题就出现了?我们开头就讲了,每一个操作系统都认为自己拥有对所有硬件的控制会管理权,是独占的。但是在我们当前的这个架构里面,我们的CPU时间片首先是我们的本身的操作系统分配给了上面运行的应用程序进行使用了,vmwareworkstation也属于这些应用程序。自然,vmware workstation也只不过是分配到了一点CPU时间片而已。那么更不用说,运行在vmware workstation之上的虚拟机了。所以没个虚拟机仅仅必能获取到很小的一部分CPU时间片。同时呢,我们也知道,每一个操作系统运行的时候,都分为两种模式,即用户态和内核态。如果vmware workstation上面的虚拟机开启来,在我们的这个架构中,就会存在三种模式。首先,我们本身的操作系统就有用户模式和内核模式了。在用户模式里面,运行的vmware workstation的虚拟机又有用户模式和内核模式。所以这样一来就是内核模式—内核模式—用户模式。而且每个虚拟机里面使用的又是连续的线性地址空间。但是vmware workstation上面虚拟机的内核所看见的并不是真正的物理地址空间,而是我们的本身的操作系统所提供给vmware workstation,由vmware workstation虚拟出来的地址空间。根据我们在前文所述,真在的物理地址空间0x0000以及由本身的操作系统所使用,并且将其中一部分分配给了DMA和BIOS,一部分留给内核自己运行使用,然后才会把剩下的空间给进程使用。所以真正的物理地址在分配给了进程之后,都是起始地址非0的地址段空间了。那么很显然vmware workstation上的虚拟机所使用的内存地址空间,不可能从真正的0地址段空间开始。所以在vmware workstation上,虚拟机使用的内存地址空间从0开始,那是vmware workstation给虚拟机虚拟的,由vmware workstation模拟欺骗的地址段。虚拟机的真正的内存数据存储在真实的物理地址空间存储里面。那么其实就是虚拟机到真实的物理地址空间会需要进过2次的转换。所以性能是很差的。
CPU虚拟化是按照时间片进行分配和调度,内存是进行虚拟与真实的地址转换,IO设备是模拟。那么vmware workstation上虚拟机的磁盘怎么和我们本地的磁盘关联起来,怎么模拟呢?
这就需要在真实的硬盘上面建立一个本地回环设备,在硬盘的某一段空间,创建本地回环设备,同时将这个设备以文件的形式表达出来,并和vmware workstation的虚拟的磁盘建立关联关系。当虚拟机往虚拟的磁盘里面存放数据的时候,就需要vmware workstation将其数据存放到本地真实的文件中。显然,虚拟机的磁盘性能没有本地真实的硬盘性能好,而且中间的IO还需要经过vmware workstation的转换。为了让性能好,我们其实可以使用存储,在vmware workstation之上是可以直接使用存储挂载的LUN进行读取和数据存取的。但是因为其建立在我们的操作系统之上,所以只支持iSCSi的存储设备进行挂载使用。