|
|

楼主 |
发表于 2008-12-1 20:13:30
|
显示全部楼层
Post by lzlz;1917402
硬件虚拟需要硬件支持,我们知道对异常/中断发生时,CPU会跳转到特定的地址(对x86是对应的IDT)执行相应的处理例程,对只有一个OS这样是足够的,但如果有多个OS,这样无疑不能解决问题,于是也有两种解决方案:
第一种将修改guest OS底层代码,将以前跳转的处理例程地址重定位到一个特定(公共)的处理例程,根据当前运行的是那个虚拟机来判断到底跳转到具体那个guest OS的异常/中断处理例程。
第二种硬件可以通过增加少量的寄存器和指令,让硬件可以支持多个异常/中断处理例程入口。举个最简单(但未必正确)的例子: 我们增加一个寄存器REG_OS,默认它的值是0,如果有多个虚拟机(guest OS)在运行,则他们对应的REG_OS必须在切换的时候被依次设置为1,2,...,则当异常/中断发生时,辅助REG_OS寄存器,我们可以通过硬件就能重定向到对应的异常/中断处理例程。
某些特定操作如syscall可能还需要专门增加一些指令(hypercall)才能达到想要的效果
地一种即半虚拟(para-virt),第二中即为硬件虚拟(当然我的解释有很多遗漏的地方)。
很显然,第一种需要guest OS修改其底层的代码才能工作,第二种则不需要。
速度上二者实际上相差是很小的,个人感觉其实工作量是一样,有硬件来作未必就能带来太多速度上的优势。
很感谢,我喜欢这样的回答,这下子比较清楚地明白,啦
Thank you very much:-) |
|