【KVM】CPU虚拟化和GuestOS加载

刚接触虚拟化的时候,一直很好奇虚拟机到底是一个什么东西,在系统中的呈现是什么? 是一个进程? 没错在KVM实现中,就是一个qemu进程。

那表示虚拟机的进程和普通的进程有哪些区别呢?

1、执行的来源不同,普通进程直接从当前文件系统获得指令集(执行文件),而虚拟机进程则模拟CPU上电开机;

2、运行等级不同,普通进程运行在用户态上,而虚拟机进程的guest需要运行在内核态和用户态;

今天讲一讲虚拟机是如何加载起OS的,本文不分析KVM的实现细节,本文只分析实现的理念。

1、物理机上电开机时,CPU上电后跳转到0xFFFF:0000地址开始执行BIOS代码, 所以要在该地址准备好BIOS代码即可;

      备注:由于启动虚拟机前,系统处于保护模式下,而物理机启动阶段处于实模式,实际上虚拟化实现是通过保护模式来模拟实模式的,只是系统感知不到(CR0被模拟了)

2、BIOS代码开始执行,此时内存访问的是1M地址空间,VMM已经提前把1M地址空间进行页表映射;

3、BIOS检测系统设备,由于系统设备都是模拟的,所以都会陷出,由kmod模块或qemu模块来进行模拟;

4、BIOS根据启动项,读取磁盘MBR,并把执行权交给MBR,系统启动完成; 磁盘IO读写都会陷出交给qemu执行;

到此虚拟机已经成功运行起OS,CPU虚拟化的目标只有一个共享CPU,而不相互影响,有什么难点呢?

有些非特权的指令是敏感指令,即没办法截获该指令执行,但是该指令执行会影响虚拟机或host。  所以CPU虚拟化的早期实现是通过指令模拟的方式来实现的, 但是性能非常差,等到intel的vt-x技术出现后,这个由于指令集的漏洞问题就可以轻松解决了。现在的虚拟机切换和进程切换实现上非常像,一个是通过VMCS来保存信息,一个是通过进程的寄存器结构体来保存,两者只是数量上的差异而已。

 

【观点】

有了vt-x技术后,CPU虚拟化实现也变得简单了,只要清楚VMCS结构体定义以及CPU各种指令异常陷出的处理就OK了。

你可能感兴趣的:(cpu,kvm,虚拟化)