一种虚拟机在UEFI运行阶段实现QXL显示的方法与流程

文档序号:31145671发布日期:2022-08-16 23:32阅读:1850来源:国知局
一种虚拟机在UEFI运行阶段实现QXL显示的方法与流程
一种虚拟机在uefi运行阶段实现qxl显示的方法
技术领域
1.本发明涉及计算机科学技术领域,具体涉及一种虚拟机在uefi运行阶段实现qxl显示的方法。


背景技术:

2.kvm虚拟化应用越来越广泛,针对不同的cpu架构,例如x86、arm、mips等,以及不同的应用领域,例如服务器虚拟、显示虚拟化、存储虚拟化、桌面虚拟化等,都有逐渐深入的融合。随着融合的深入,厂商对虚拟化的支持也越来越多,包括硬件辅助的虚拟化技术,如intel的vt-x、vt-d、ept、sr-iov等,用户也对虚拟化提出了更高的要求。其中在显示虚拟化领域中,虚拟显卡有如qxl、virtio、vga等,在应用的过程中发现,所创建的虚拟机中,虚拟显卡为qxl时,在uefi运行阶段无显示,等待一段时间后进入默认系统,显示正常。在实际的使用场景中,存在如下三点问题:
3.1)在uefi运行阶段未能显示tianocore logo及进度条,黑屏,给用户带来困惑,认为虚拟机启动失败,造成误判,其实际只是未能显示。
4.2)因为在uefi运行阶段无法显示,必然引起bootloader如grub界面也无法显示,从而给用户选择需要加载的操作系统带来障碍。
5.3)因为在uefi运行阶段无法显示,必然引起bootloader如grub界面也无法显示,从而无法根据grub选项执行相关动作。
6.基于以上所述,需要提出一种方法使虚拟机在uefi运行阶段支持qxl显示,增强qxl在全系统运行阶段的完整性。


技术实现要素:

7.解决的技术问题
8.针对现有技术所存在的上述缺点,本发明提供了一种虚拟机在uefi运行阶段实现qxl显示的方法,该方法能够使虚拟机在uefi运行阶段支持qxl显示,增强qxl在全系统运行阶段的完整性。
9.技术方案
10.为实现以上目的,本发明通过以下技术方案予以实现:
11.本发明提供了一种虚拟机在uefi运行阶段实现qxl显示的方法,包括如下步骤:
12.s1、搭建edk2源码交叉编译构建环境;
13.s2、在s1搭建的环境中添加qxl驱动,并调整非对齐访问代码,以防止非对齐访问;
14.s3、在s1构建的环境中添加qxl设备,并使得所述qxl设备所在bridge的io地址空间能覆盖io port地址;
15.s4、编译构建输出固件,并在虚拟机中运行所述输出固件。
16.进一步地,所述虚拟机为arm64架构下虚拟机。
17.进一步地,步骤s1具体包括:
18.获取edk2源码;
19.配置gcc路径;
20.通过编译构建armvirtpkg包验证编译环境。
21.进一步地,所述搭建edk2源码交叉编译构建环境具体包括:
22.从官网及开源网址获取arm架构gcc编译器以及edk2源码;
23.配置gcc5_aarch64_prefix环境变量,确定所述gcc编译器的路径;
24.通过build命令指定编译armvirtpkg包,通过-b参数确定所构建的固件为debug/release。
25.进一步地,所述添加qxl驱动具体包括:
26.在armvirtpkg/armvirtqemu.dsc的“video support”中增加“ovmfpkg/qemuvideodxe/qemuvideodxe.inf”;
27.在armvirtpkg/armvirtqemufvmain.fdf.inc的“video support”中增加“inf ovmfpkg/qemuvideodxe/qemuvideodxe.inf”;
28.在armvirtpkg/armvirtqemukernel.dsc的“video support”中增加“ovmfpkg/qemuvideodxe/qemuvideodxe.inf”。
29.进一步地,所述调整非对齐访问代码具体为:调整对内存数据的读写为逐个字节执行。
30.进一步地,具体需要调整的代码包括:
31.mdepkg/library/basememoryliboptdxe/copymemwrapper、
32.mdepkg/library/basememoryliboptdxe/setmem16wrapper.c、
33.mdepkg/library/basememoryliboptdxe/setmem32wrapper.c、
34.以及mdepkg/library/basememoryliboptdxe/setmem64wrapper.c。
35.进一步地,所述使得所述qxl设备所在bridge的io地址空间能覆盖io port地址,具体包括:
36.根据所述qxl设备唯一的vendid和deviceid,递归遍历整个pci拓扑,找出所述qxl设备所在的bridge;
37.找出默认分配io地址空间覆盖0x01ce~0x01d0的bridge,并与qxl设备所在的bridge互换io地址空间。
38.有益效果
39.本发明可以实现虚拟机在uefi运行阶段支持qxl显示,增强qxl在全系统运行阶段的完整性,通过本方法输出的固件,虚拟机启动后在uefi运行阶段支持qxl显示,包括tianocore logo以及bootloader界面,避免给用户造成困惑,并能正常通过grub界面选择需要加载的操作系统。
附图说明
40.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍。显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
41.图1为本发明一实施例提供的虚拟机在uefi运行阶段实现qxl显示的方法步骤示意图。
具体实施方式
42.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
43.参阅图1,本发明一实施例提供了一种一种虚拟机在uefi运行阶段实现qxl显示的方法,包括如下步骤:
44.s1、搭建edk2源码交叉编译构建环境;
45.s2、在s1搭建的环境中添加qxl驱动,并调整非对齐访问代码,以防止非对齐访问;
46.s3、在s1构建的环境中添加qxl设备,并使得所述qxl设备所在bridge的io地址空间能覆盖io port地址;
47.s4、编译构建输出固件,并在虚拟机中运行所述输出固件。
48.具体地,本发明的总体思路是基于tianocore edk2工程,添加qxl驱动支持以及修改相关代码,编译构建输出支持基于虚拟机uefi运行阶段qxl显示的固件,所述虚拟机一般为arm64架构下虚拟机。图1是本发明在arm64架构虚拟机uefi bios中支持qxl显示的方法的流程图,以此作为实施例进行介绍。其中,bios指的是basic input output system,即即基本输入输出系统。uefi指的是unified extensible firmware interface,即统一可扩展固件接口,定义了操作系统和平台之间的接口,它是uefi forum发布的一种标准,它只是一种标准,不提供实现,edk2是其常用的开源实现之一。qxl是指一种虚拟pci显卡,用于虚拟机显示。bridge是指在本专利中指pci/pcie桥设备。非对齐访问是指在机器指令层面,当尝试从不能被n整除(addr%n!=0)的起始地址读取n字节的数据时即发生了非对齐内存访问。
49.在本实施例中,对于步骤s1:搭建edk2源码编译构建环境,首先需要获取edk2源码,然后配置gcc路径,最后通过编译构建armvirtpkg包验证编译环境。
50.在本实施例中,所述搭建edk2源码交叉编译构建环境具体包括:从官网及开源网址获取arm架构gcc编译器以及edk2源码;配置gcc5_aarch64_prefix环境变量,确定所述gcc编译器的路径;通过build命令指定编译armvirtpkg包,通过-b参数确定所构建的固件为debug/release。
51.在本实施例中,对于步骤s2中添加qxl驱动,其中的qxl驱动一般源自ovmfpkg的qemuvideodxe,移植至armvirtpkg包。所述添加qxl驱动具体包括:
52.在armvirtpkg/armvirtqemu.dsc的“video support”中增加“ovmfpkg/qemuvideodxe/qemuvideodxe.inf”;
53.在armvirtpkg/armvirtqemufvmain.fdf.inc的“video support”中增加“inf ovmfpkg/qemuvideodxe/qemuvideodxe.inf”;
54.在armvirtpkg/armvirtqemukernel.dsc的“video support”中增加“ovmfpkg/qemuvideodxe/qemuvideodxe.inf”。
55.在本实施例中,对于步骤s3中调整非对齐访问代码,所述调整非对齐访问代码具体为:调整对内存数据的读写为逐个字节执行。
56.此外,具体需要调整的代码包括:
57.mdepkg/library/basememoryliboptdxe/copymemwrapper、
58.mdepkg/library/basememoryliboptdxe/setmem16wrapper.c、
59.mdepkg/library/basememoryliboptdxe/setmem32wrapper.c、
60.以及mdepkg/library/basememoryliboptdxe/setmem64wrapper.c。
61.由于arm架构的出于性能的考虑以及各处理器厂商对arm指令的实现情况不一致,非对齐访问的支持情况存在不确定性,固件运行时会出现非对齐访问异常,为了避免该问题,可通过调整代码避免非对齐访问。如将ldrd指令的非对齐访问调整为多条ldr指令。
62.在本实施例中,对于步骤s3中所述使得所述qxl设备所在bridge的io地址空间能覆盖io port地址,具体包括:
63.根据所述qxl设备唯一的vendid和deviceid,递归遍历整个pci拓扑,找出所述qxl设备所在的bridge;
64.找出默认分配io地址空间覆盖0x01ce~0x01d0的bridge,并与qxl设备所在的bridge互换io地址空间。
65.由于arm平台没有io地址空间的概念,所以不区分io地址空间。qxl在uefi运行阶段的显示需要依赖vbe接口,通过它的io port访问,其io port为0x01ce~0x01d0。当qxl设备挂在bridge下时,vbe访问请求经由bridge转发,根据bridge的特性,如果所访问的地址不在bridge所分配的io地址范围内时,访问请求将被忽略。而根据edk2针对bridge io地址深度优先,且在64kb范围内依次分配的原则,挂载了qxl设备的bridge有可能所分配到的io地址范围不包含0x01ce~0x01d0,因此出现在某些bridge下显示异常的问题。解决该问题的核心是确保qxl设备所在bridge的io地址空间能覆盖io port地址(0x01ce-0x01d0)。
66.通过上述步骤,编译构建输出的固件可在arm架构下虚拟机的uefi运行阶段正常显示,包括tianocore logo以及如grub界面。
67.本发明的优点在于可以实现虚拟机在uefi运行阶段支持qxl显示,增强qxl在全系统运行阶段的完整性,通过本方法输出的固件,虚拟机启动后在uefi运行阶段支持qxl显示,包括tianocore logo以及bootloader界面,避免给用户造成困惑,并能正常通过grub界面选择需要加载的操作系统。
68.以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不会使相应技术方案的本质脱离本发明各实施例技术方案的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1