接上回,大家看下显卡各种模式的内存分布。
各外部设备都是通过软件指令的形式与上层接口通信的,显卡(显示适配器)也不例外,所以它也有自己的bios。位置是0xC0000到0xC7FFF。显卡支持三种模式,文本模式、黑白图形模式,彩色图形模式。我们只关注文本模式就好了,最终我们要实现类似linux 终端那样的字符界面。
我们平时看的电影,一秒24桢,每一帧都是一幅图片,有的还是高清电影,可想而知,1秒的其数据量也是很大的。为了提速,避免视觉上产生延时,硬件系统干脆让我们直接和显卡接触,免得数据再经由第三道手而影响效率,直接把数据往显存中填就好了。
之前和大家介绍过了,地址总线的范围不只是主板上插的内存条的容量,内存条只是地址总线所能达到的范围中的一小部分。指令中所需的任何一个地址,都是地址总线帮咱们去寻址的。地址只是个数字,地址总线把此数字指向哪个存储介质,此地址就落到哪个介质上的某个存储单元中。地址指向哪里,最终是地址总线说了算。如果有同学误以为访问某个rom的地址,是先访问到我们的内存条后,再由计算机内的某种神奇力量将其映射到该rom,这就不对了。
从起始地址0xB8000到0xBFFFF,这片32KB大小的内存区域是用于文本显示。我们往0xB8000处输出的字符直接会落到显存中,显存中有了数据,自然显卡就将其搬到显示器屏幕上啦,这后续的事情咱们是不需要处理的,咱们只要保证写进显存的数据是正确的就ok啦。
屏幕上可以显示多少个字符呢?这要取决于要用哪种文本模式了。
显卡的文本模式也是分为多种模式的,用“列数*行数”来表示,如80*25, 40*25, 80*43 或者 80*50,它们的乘积是整个屏幕上可以容纳的字符数。不同的模式可容纳的字符数不同,如80*25表示一行80个字符,共25行。显卡在加电后,默认就置为模式80*25,也就是一屏可以打印2000个字符。我们也在这个默认模式下工作了。
即使在文本模式下,也可以打印出彩色字符。可是ASCII码都是1字节大小,即使标准ASCII码也要用7位来为一个字符编码,只剩下那1位顶多只能表示黑白两种颜色。聪明的你肯定想到啦,必然是用一个字节来表示字符本身,再用另外的字节来表示其属性。答对啦,事实也是如此。每个字符在屏幕上都是由2个字节来表示的,而且是连续的2个字节。
说到这里我们先算一笔账,显存是从0xB8000到0xBFFFF,范围是32KB,一屏可以显示2000个字符,显示器上的每个字符占2字节大小,故每屏字符实际占用4000字节。这样,我们的32KB的显存可以容纳32KB/4000B约等于8屏的数据。所以您懂了为什么linux可以用alt + Fn键实现tty的切换,当然这只是原理,具体的实现要涉及到显卡的寄存器设置。显卡上的寄存器还是非常多的,我怕此时将它们列出来会打击大家学习积极性,以后需要时再说吧。
屏幕上每个字符的低字节是字符的ASCII码,高字节是字符属性元信息。在高字节中,低4位是字符前景色,高4位是字符的背景色。颜色是用RGB红绿蓝三种基色调和,第4位用来控制亮度,若置1则呈高亮,若为0则为一般正常亮度值。第7位用来控制字符是否闪烁(不是背景闪烁)。这两字节如图:
大家知道,用R红色、G绿色、B蓝色这三种颜色以任意比例混合,只可以搭配出其它颜色,其它颜色被认为都可以收这三种颜色组合而成。不过由于在文本模式下的颜色是极其有限,所以RGB的各部分比例要么是1(全部),要么是0(没有),所以其组合出的颜色屈指可数,为了让大家测试字符颜色更加方便,给大家提供这三种颜色的组合。
从上面可以看出只要亮度位I置1,颜色就是变亮变浅。大家可以结合K位来测试上面的颜色.
好了,上面内容摘自《操作系统真象还原》,大家有机会支持一下。