刚接触虚拟化的时候,一直很好奇虚拟机到底是一个什么东西,在系统中的呈现是什么? 是一个进程? 没错在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,而不相互影响,有什么难点呢?
有些非特权的指令是敏感指令,