系统启动过程屏幕的显示是如何实现的?

QEMU+KVM的虚拟化环境中,系统启动执行SeaBIOS对系统设备进行初始化,包括VGA设备。为了能够让VGA能够显示处图像(显卡在系统中一般是以PCI设备的形式出现在系统中,然后显示器通过VGA线连接到显卡上)。SeaBIOS会在较早的时候,即枚举完系统的PCI设备后,就去将显卡的PCI Option ROM读取出来,然后执行,显卡的PCI Option ROM会对显卡进行初始化,并且会注册中断0x10相应的中断处理函数,0x10中断用于处理跟显卡相关的事件,如切换显卡的工作模式,显示图像等等。当注册了中断0x10处理函数后,SeaBIOS就可以通过该中断调用显示图像了,并且在OS启动的早期阶段(显卡驱动未加载的时候),OS也可以通过该方法进行图像显示,直到OS加载完显卡驱动。这种方法相对于OS下的显卡驱动,工作效率应该会比较慢,但是简单直接,而且看样子有统一的接口。

我们无法拿到正规显卡的PCI Option ROM的源码,但是SeaBIOS中的vgasrc目录里面应该也是模拟了PCI Option ROM,其入口点位于vagsrc/vgaentry.S:_optionrom_entry,然后调用vga_post()函数,该函数在初始化显卡后,就会设置中断0x10相应的处理函数(0x10中断默认的处理函数为空,所以可以直接覆盖掉原来的值)。

entry_10在vgasrc/vgaentry.S里面定义直接指向handle_10()函数

handle_10()函数根据穿进去的存放在ax寄存器中的参数进行各种操作。

所以总的来说,系统启动过程中(显卡驱动加载之前),屏幕的显示主要是通过显卡的PCI Option ROM来实现的,如果显卡的PCI Option ROM出现问题,则系统启动过程中将出现黑屏现象。

同时也欢迎关注同名微信公众号“河马虚拟化”第一时间获取最新文章。

猜你喜欢

转载自blog.csdn.net/lindahui2008/article/details/81195144
今日推荐