,客户机的进程的访存指令会发生SIGSEGV异常,若GVA层到GPA层的映射关系不合法,例如:访存指令对应的GVA层上的地址到GPA层上的地址之间的映射关系不存在,或者访存指令对应的GVA层上的地址到GPA层上的地址之间的映射关系存在,但是访存指令的权限超出了 GVA层上的地址的权限,则在客户机环境中标记异常,交由客户机操作系统进行处理;若GVA层到GPA层的映射关系合法,即访存指令对应的GVA层上的地址到GPA层上的地址之间的映射关系存在,且访存指令的权限没有超出GVA层上的地址的权限,则利用1031-1033,根据客户机的进程对应的改变了的GVA层到GPA层的映射关系,建立访存指令指向的HVA层中的被分配的地址空间上的地址与硬盘的存储空间之间的映射关系,并根据硬盘的存储空间到HPA层之间的映射关系,将建立的GVA层上的地址到HPA层上的地址之间的映射关系添加到宿主机页表中的SPT (ShadowPage Table,影子页表)中。
[0095]比如:客户机的进程的指令修改了客户机页表基址寄存器,且不是客户机进程切换,则将为该进程分配的HVA层的地址空间设置为不可访问。再比如:客户机的进程的指令修改了客户机页表基址寄存器,且是客户机进程切换,且客户机的新进程与客户机任一其它的进程共享同一段HVA层的地址空间空间,则将为该进程分配的HVA层的地址空间设置为不可访问。
[0096]其中,若客户机的进程所对应的由GVA层到GPA层的映射关系没有改变,则保持原有的映射关系不变。
[0097]本发明实施例提供的一种内存虚拟化的方法,能够建立所述HVA层到硬盘的存储空间之间的映射关系;为客户机的进程在HVA层中分配地址空间,并建立GVA层到HVA层中的被分配的地址空间之间的映射关系;检测客户机的进程所对应的由GVA层到GPA层的映射关系是否改变,若改变,则将为客户机的进程分配的HVA层的地址空间设置为不可访问;并建立访存指令指向的HVA层中的被分配的地址空间上的地址到硬盘的存储空间之间的映射关系;从宿主机获取目标数据。对于现有技术,本发明实施例利用了宿主机的硬盘上的文件作为中介,建立了由GVA层到HVA层,由HVA层到硬盘,由硬盘到HPA层之间的映射关系,从而建立了 GVA层到HPA层之间的映射关系,避免了直接建立HVA层到HPA层之间的映射关系。当客户机运行进程并发出访存指令时,可以通过这条映射关系,根据GVA层上的地址从HPA层获取访存指令所要获取的数据,避免了直接对HVA层到HPA层之间的映射关系进行操作,从而不需要修改内核就可以由宿主机从HPA层获取数据,因此本发明实施例运行客户机的进程的过程中,不需要直接对HVA层到HPA层的映射关系进行操作,从而不需要修改宿主机的操作系统,就能够实现虚拟机在不同的宿主机上使用并且不受宿主机的操作系统的影响,使得虚拟机在不同的系统平台上的迁移使用不再受到限制;而且,当GVA层到GPA层之间的映射关系发生改变时,VMM将映射关系改变的客户机的进程分配的HVA层的地址空间设置为不可访问,并将改变后的映射关系添加到宿主机页表中的SPT中,避免访存数据时发生错误,保持SPT与客户机页表的一致性。
[0098]此外,在图2a所示的方案的基础上,本发明实施例还提供了一种内存虚拟化的方法的具体方案,还可以增添107-109来处理客户机的进程所对应的GVA层到GPA层的映射关系发生改变的情况,如图4所示,包括:
[0099]107,检测所述客户机的进程所对应的由所述GVA层到所述GPA层的映射关系是否改变。
[0100]其中,当客户机的进程的指令修改了客户机页表基址寄存器时,GVA层到GPA层的映射关系发生改变,VMM能够捕获到对客户机页表基址寄存器的修改,从而可以检测GVA层到GPA层的映射关系是否改变。
[0101]108,若改变,则确定发生改变的映射关系上的所述GVA层上的地址,并确定所述发生改变的映射关系上的所述GVA层的地址所对应的目标HVA层地址。
[0102]其中,目标HVA层地址是为客户机的进程分配的HVA层的地址空间上的地址。比如:客户机的进程的指令修改了任一客户机进程页表中的内容,从而改变了客户机进程的GVA层到GPA层之间的映射关系或权限,则确定发生改变的映射关系上的GPA层的地址,并确定发生改变的映射关系上的GPA层的地址所对应的HVA层的地址。再比如:客户机的进程的指令通过修改如DACR寄存器、FCSE寄存器等控制寄存器,改变了客户机页表内容的解释方式,如读写权限的解释方式,从而改变了 GVA层到GPA层之间的映射关系或权限,则确定发生改变的映射关系上的GPA层的地址,并确定发生改变的映射关系上的GPA层的地址所对应的HVA层的地址。
[0103]其中,若客户机的进程所对应的由GVA层到GPA层的映射关系没有改变,则保持原有的映射关系不变。
[0104]109,将所述目标HVA层地址设置为不可访问。
[0105]其中,VMM只需要将108中确定的GPA层的地址对应的HVA层的地址设置为不可访问即可。若客户机的进程的指令修改当前进程的页权限或将客户机的一个页面换出,这类修改操作改变了当前进程的GVA层到GPA层之间的映射关系,且为客户机的进程分配的HVA层的地址空间的起始地址为X,发生改变的映射关系上的GPA层的地址所对应的HVA层的地址为1,改变的地址空间大小为S,则将起始地址为x+y的大小为S的HVA层的地址空间设置为不可访问。
[0106]其中,若客户机的进程的指令为当前进程新分配一个页面或将一个页面换入,这类操作会更改客户机页表,但客户机的缓存中不存在有效的对应项缓存,这类客户机页表更新,因为对应的SPT中的相应表项为无效状态,所以当客户机访问该内存页面时,会触发SIGSEGV异常,利用1031-1033,根据客户机的进程对应的改变了的GVA层到GPA层的映射关系,建立访存指令指向的HVA层中的被分配的地址空间上的地址与硬盘的存储空间之间的映射关系,并根据硬盘的存储空间到HPA层之间的映射关系,将建立的GVA层上的地址到HPA层上的地址之间的映射关系添加到宿主机页表中的SPT中。
[0107]其中,若客户机的进程的指令修改的是不活跃的进程的页表,对于这类页表更新操作,需要添加一个模块监测非活跃进程页表的修改,以维护非活跃客户机进程页表与SPT之间的一致性。
[0108]本发明实施例提供的一种内存虚拟化的方法,能够建立所述HVA层到硬盘的存储空间之间的映射关系;为客户机的进程在HVA层中分配地址空间,并建立GVA层到HVA层中的被分配的地址空间之间的映射关系;检测客户机的进程所对应的由GVA层到GPA层的映射关系是否改变,若改变,则确定发生改变的映射关系上的GVA层上的地址,并确定发生改变的映射关系上的GVA层的地址所对应的目标HVA层地址,并将目标HVA层地址设置为不可访问;并建立访存指令指向的HVA层中的被分配的地址空间上的地址到硬盘的存储空间之间的映射关系;从宿主机获取目标数据。对于现有技术,本发明实施例利用了宿主机的硬盘上的文件作为中介,建立了由GVA层到HVA层,由HVA层到硬盘,由硬盘到HPA层之间的映射关系,从而建立了 GVA层到HPA层之间的映射关系,避免了直接建立HVA层到HPA层之间的映射关系。当客户机运行进程并发出访存指令时,可以通过这条映射关系,根据GVA层上的地址从HPA层获取访存指令所要获取的数据,避免了直接对HVA层到HPA层之间的映射关系进行操作,从而不需要修改内核就可以由宿主机从HPA层获取数据,因此本发明实施例运行客户机的进程的过程中,不需要直接对HVA层到HPA层的映射关系进行操作,从而不需要修改宿主机的操作系统,就能够实现虚拟机在不同的宿主机上使用并且不受宿主机的操作系统的影响,使得虚拟机在不同的系统平台上的迁移使用不再受到限制;而且,当GVA层到GPA层之间的映射关系发生改变时,VMM将映射关系改变的客户机的进程分配的HVA层的地址空间设置为不可访问,并将改变后的映射关系添加到宿主机页表中的SPT中,避免访存数据时发生错误,保持SPT与客户机页表的一致性。
[0109]此外,在图3和图1所示的方案的基础上,本发明实施例还提供了一种内存虚拟化的方法的具体方案,可以增添IlOa或IlOb或IlOc来为客户机的进程分配HVA上的地址空间,如图5a、图5b、图5c所示,包括:
[0110]110a,为所述客户机的至少两个进程分配所述HVA层上的同一段地址空间。
[0111]比如:如图5d所示,VMM可以为客户机进程A和客户机进程B在HVA层上分配从地址m到地址η这一段地址空间,也就是说客户机进程A和客户机进程B共享HVA层上的同一段地址空间。
[0112]IlOb,为所述客户机的进程分配所述HVA层上的一段对应的地址空间。
[0113]其中,不同的客户机的进程对应的HVA层上的地址空间不相同。如:如图5e所示,VMM可以为客户机的进程单独分配HVA层上的一段地址空间,VMM为客户机进程A分配了从地址m到地址η这一段地址空间,为用户进程B分配了从地址P到地址q这一段地址空间,VMM为不同的客户机的进程分配了不同的地址空间。
[0114]110c,为所述客户机的至少两个进程分配所述HVA层上的同一段地址空间,同时,为其他所述客户机的进程分配所述HVA层上的一段对应的地址空间。
[0115]比如:如图5f所示,VMM可以为客户机进程B和客户机进程C分配HVA层上的同一段从地址P到地址q的地址空间,VMM同时也可以为客户机进程A单独分配一段从地址m到地址η的地址空间。
[0116]可选的,当客户机的用户空间和宿主机的用户空间大小相同时,内存空间布局如图5g所示,地址O到地址A的地址空间为客户机使用,地址A到地址B的地址空间为VMM使用。当翻译客户机的进程的访存指令生成本地访存指令时,若客户机的进程的访存指令不是由VMM引入的,则只允许访存指令访问地址O到地址A的地址空间;若客户机的进程的访存指令是由VMM引入的,则允许访存指令访问VMM使用的地址空间。在宿主机为X86-32体系结构时,为了防止访存指令访问地址超出地址空间范围,可以将为客户机进程分配的HVA层的地址空间设置为一个段,设置段描述符中的段基址为0,段限长为A,在模拟客户机的进程执行访存指令时,设置某个段寄存器指向设置的段描述符,段寄存器可以是FS寄存器等。比如:对于不是由VMM引入的访存指令的执行,可以采用FS段寄存器加段内偏移的方式进行处理,访存指令指向的GVA层上的地址用做段内偏移;对于由VMM引入的访存指令的执行,可以使用DS段寄存器,DS段中包括整个由地址O到地址B的地址空间。
[0117]可选的,结合图1、图4与图5a、图5b、图5c所示的方案,得到了如图6a、图6b、图6c所示一种内存虚拟化的方法的具体方案,具体实现方式与上述步骤相同,在此不再赘述。
[0118]本发明实施例提供的一种内存虚拟化的方法,能够建立所述HVA层到硬盘的存储空间之间的映射关系;为客户机的至少两个进程分配HVA层上的同一段地址空间;和/或为客户机的进程分配HVA层上的一段对应的地址空间,并建立GVA层到HVA层中的被分配的地址空间之间的映射关系;当执行客户机的进程的访存指令时,建立访存指令指向的HVA层中的被分配的地址空间上的地址到硬盘的存储空间之间的映射关系;从宿主机获取目标数据。对于现有技术,本发明实施例利用了宿主机的硬盘上的文件作为中介,建立了由GVA层到HVA层,由HVA层到硬盘,由硬盘到HPA层之间的映射关系,从而建立了 GVA层到HPA层之间的映射关系,避免了直接建立HVA层到HPA层之间的映射关系。当客户机运行进程并发出访存指令时,可以通过这条映射关系,根据GVA层上的地址从HPA层获取访存指令所要获取的数据,避免了直接对HVA层到HPA层之间的映射关系进行操作,从而不需要修改内核就可以由宿主机从HPA层获取数据,因此本发明实