首页 理论教育 操作系统实现之路:切换到0x118工作模式

操作系统实现之路:切换到0x118工作模式

时间:2023-10-21 理论教育 版权反馈
【摘要】:从理论上说,在设置显示卡工作模式为0x118之前,首先应该检查一下显示卡是否支持该模式。即直接尝试设置0x118模式即可。下面是设置工作模式为0x118的汇编代码:代码比较简单,如果设置成功,说明支持0x118模式,于是会继续执行ll_setmodesucc后面的代码。在上面的代码中,bx寄存器的值被设置为0x4118,而不是0x118,这里需要做进一步解释。按照VBE的标准,0x4118代表的就是0x118模式的平直内存工作模式。作者曾在这个地方出过问题,把0x4118存入了cx,结果调用失败。

操作系统实现之路:切换到0x118工作模式

从理论上说,在设置显示卡工作模式为0x118之前,首先应该检查一下显示卡是否支持该模式。因此应该有两段代码,一段是检测是否支持该模式,一段是在支持的情况下,设置显示卡工作在0x118模式下。但是根据VBE的标准,这两个过程是合一的。即直接尝试设置0x118模式即可。如果显示卡支持,则会设置成功,如果不支持,则设置失败。按照VBE的标准,在ax寄存器中传入0x4F02,bx寄存器中存入待设置的显示模式代码,然后调用0x10号中断,即可设置显示模式为bx寄存器中指定的值。如果设置成功,则ah寄存器返回0。如果ah寄存器的返回值不为0,则说明设置失败。下面是设置工作模式为0x118的汇编代码:

代码比较简单,如果设置成功,说明支持0x118模式,于是会继续执行ll_setmodesucc后面的代码。否则跳转到ll_failed标号处,做失败处理。

在上面的代码中,bx寄存器的值被设置为0x4118,而不是0x118,这里需要做进一步解释。按照VBE的标准,针对每种工作模式,有两种显存访问方式:平直访问方式(flat display memory mode)和非平直访问方式。在平直访问方式下,显示器显示内容与显存有直接对应关系。如果按照显示器从左到右、从上到下的顺序,为每个像素编号的话,那么每个像素的颜色值,就存放在以显存地址为基址、以像素编号为索引的位置处。假设显示卡工作在0x118模式下,则屏幕上共有1024×768=786432个像素点,每个像素点占用4个字节的存储空间来存储颜色值(R/G/B各一个字节,再加上一个alpha字节,共四个字节),则需要的显示存储空间为786432×4=3MB。相反,在显存的对应地址上写入四个字节的颜色数据,对应的颜色就可显示在屏幕上与之对应的像素点上。

这种工作模式非常简单直观,也是大多数显示卡都支持的显示模式。在Hello China的实现中,就使用了这种平直显存访问方式。按照VBE的标准,0x4118代表的就是0x118模式的平直内存工作模式。于是我们在bx寄存器中装入0x4118,来设置这种模式。

这时候另外一个问题又出来了,就是如何确定平直显存的起始地址。这个地址是变动的,应该是由BIOS对显示卡进行配置后的结果。答案是显然的,VBE标准会提供接口,让程序员获得该地址。如果VBE不提供这样的接口,则这个标准就不是完备的。作为一个国际标准,VBE不会犯如此低级的错误。阅读VBE标准可知,当ax的值为0x4F01的时候,在cx中存入显示模式号,调用0x10中断,可获得对应显示号的详细数据。如果调用成功,ah中会返回0,详细的显示模式信息,会被BIOS存放在di寄存器指定的位置处。下面是获取0x118显示模式详细信息的汇编代码:

代码比较简单,如果调用成功,则模式详细信息会被存放到DEF_VBE_INFO位置处,我们可以读取该位置的内存内容,来获取详细的模式信息。如果调用失败,则跳转到ll_failed标注的代码处做错误处理。需要注意的是,这时候的模式号(存入cx寄存器的值),就不是0x4118了,而是0x118。作者曾在这个地方出过问题,把0x4118存入了cx,结果调用失败。(www.xing528.com)

调用成功后,就需要进一步分析模式信息,获取平直显存起始地址了。按照VBE的标准描述,模式信息应该是下面定义的这样:

内容比较多且复杂,我们只关注physbaseptr(黑体标注)这个参数,这就是flat memory的起始地址。获得这个地址后,就可以通过直接向这个地址写入颜色值,来操作显示器了。

到此为止,简单地介绍了通过直接写显存来操作显示卡的工作原理,为进一步的介绍奠定基础。直接写显存是最基本、最简单的显示卡操作方法,也是比较通用的一种方法。其最大的优点就是简单直观,不需要了解显卡的具体工作原理。但实际上,显示卡是一块非常复杂的集成电路芯片,复杂程度甚至可以跟CPU媲美。原因是在显示卡上,集成了非常多的附加功能。从比较基本的功能如矩形填充、贝塞尔曲线、二维动画功能等,到比较复杂的3D图形渲染、复杂的数学变换(比如傅里叶变换矩阵变换等),都可以集成在显卡上。这样操作系统在运行的时候,就可以直接把这些消耗CPU的工作交给显卡完成,把CPU从复杂的图形处理中解脱出来,专注于功能运算。但是要使用这些附加功能,必须有显示卡驱动程序的支持。操作系统定义好一个功能集合,显示卡驱动程序有选择地实现全部或部分预定义的功能集合,然后通知操作系统。这样操作系统在用到特定功能的时候,首先判断显示卡(显示驱动程序)是否支持。如果支持,则交给显示卡驱动程序完成(驱动程序最终驱动硬件完成),如果不支持,则由CPU计算完成。

Hello China也定义了一组基本的功能集合,作为与显示驱动程序的接口。这组功能集合包括画线、画椭圆、矩形填充、区域渲染等,后续可根据需要添加。但支持Hello China的显卡毕竟有限,因此大部分情况下,Hello China还是通过最基本的直接写显存方式,实现GUI绘图功能。这显然无法充分发挥显卡的所有潜能,同时也浪费了大量CPU的计算能力。但只要不涉及复杂的图形处理和大量的图形变换(比如游戏),这种最简单的处理方式也足够了。况且,Hello China的定位是面向嵌入式应用的终端类操作系统,这种应用场合下,硬件配置都是已知的,且需要针对硬件做功能裁剪和定制。在这种与硬件有紧密结合的情况下,可完全避免在PC上出现的硬件资源利用不充分的问题。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈