本书摘自《操作系统真象还原》,请大家支持正版
为了能够看到图像,我们需要显示器。无论是哪种显示器,它都是由显卡来控制的,我们没必要了解液晶显示器和普通CRT显示器的差别。无底是哪种显卡,它提供给我们的可编程接口都是一样的:IO端口和显存。
显存是由显卡提供的,它是位于显卡内部的一块内存,所以它称为显存。关注过显卡产品的同学可能会知道,有的标明了DDR 512M,有的则声称是DDR2 1G。这指的就是显存大小。显卡的工作就是不断地读取这块内存,随后将其内容发送到显示器。
我们能在显示器上见到的各种色彩斑斓的图像,说明显卡可以让显示器工作在图形模式,能够在显示器上看到linux终端上的黑屏白字,说明显卡可以让显示器工作在字符模式。屏幕是由密密麻麻的像素组成的,显存中的每一位都对应屏幕上的一个像素点。
我们打开一个网页后,里面所加载的图片,就是显示器在图形模式下的效果。按理说,显存中的一位对应一个像素,该位要么是0,要么是1,如果让它显示颜色,一个像素顶多显示黑白两色啊,它是如何显示彩色的呢?是啊,一位只能显示 两种颜色,看来只有增加位数来达到彩色的效果了。各位肯定听说过24位真彩色吧,没听过也没关系,就当您听过了,哈哈,其实24位真彩色就是用24个bit表示一个颜色,也就是3字节的数据量来表示一种颜色。能表示多少种颜色呢,2的24次方等于16777216种。天啊,我平时就知道赤橙黄绿青蓝紫七种颜色,我不是色盲,不过这么多颜色让我分辨清楚,臣妾做不到啊。
之前有不少同学的理解只是概念性的,现在要应用到实践中啦,在黑白图形模式中,显存位与屏幕像素是1对1的,因为只有两种颜色,所以只要显存中的对应位置为1,屏幕上的相应像素就被点亮,呈现的是白色。若该位为0,该像素就不会被点亮,只要不管该像素就是黑色,所以用黑色壁纸当桌面,才真正是在物理上保护了显示器。而在真彩色中,是用24位对应一个像素,所以才呈现出彩色。
显示器分不清楚给它的数据是文本还是图像,在它眼里全都是图像,粒度更细致点来说,全是像素信息:像素的位置及像素的颜色。只有人才能分得出这是文字、那是花草、那是星空。所以,对于图像的输出,最直观的想法是:人们想输出什么图像就是计算出要将哪些像素点亮。这简短的一句话,有没有让您心中仿佛有一万只草泥马奔腾而过?什么,没有?那您帮我输出爱因斯坦的肖像给我看,注意,我要看清他的头发。现在草泥马是两万只了?哈哈。听上去这种用像素拼凑图像的方法真的不亚于愚公移山。
计算机的发明是为了解决问题而不是带来问题,聪明的工程师当然有更人道的方法,解决问题的方式是一个字符对应一字节的编码,只要往显存中写入这个编码,显卡就知道这是要打印此字符,由它帮你完成像素的拼凑。比如字符A的编码就是0x41,在它后面的字符B的编码增加1,即0x42。
编码本质上就是按照某种约定生成一组数据,这种约定可以是某种数学关系,如算法、公式,或者是某种固定关系,如像“藏头诗”这类,关键字是文本中固定的位置,或者将这种对应关系事先写到表格中,通过查表得到输出。解码就是根据此约定来做逆运算。破译就是找出编码中使用的是哪种约定并进行解码。
最常见的编码就是交警指挥交通时的手势,每种手势的意义司机都清楚,但如果不懂交通规则,自然就不明白了。
这样,大家都约定好了,以后字符A就用16进制数字0x41来表示,甭管是谁发来的这个数,我就认为这是字符A。当然这还是有应用的前提,也得分场合,不是说只要0x41就是字符A,应该说是接收端把接收的内容当做文本来处理时,0x41才被赋予字符A的意义。数字的意义是被生产者和消费者共同定义的,主要是看处理双方如何看待这一组数字,这就是约定的体现。就比如,小孩子太淘气了,他在妈妈的眼里仍然是小宝贝,可在外人的眼里:这是谁家的熊孩子。
既然是约定,大家都要共同遵守才行,不能我发0x38代表A,你认为0x38是delete,坚决不能另起山头自立门户。所以为了大家都有据可依,一套字符编码横空出世,从此大家可以不出门便知三分天下,在家里上上网就知道江湖中的血雨腥风,这就是名气响当当的ASCII码。
ASCII码(American Standard Code for Information Interchange,美国信息互换标准代码)。它是由美国国家标准学会(American National Standard Institute , ANSI )制定的,是标准单字节字符编码方案,用于描述纯文本。标准ASCII 码也叫基本ASCII码,用7位二进制数来表示大、小写字母,数字0~9、标点符号、以及一些控制字符。标准ASCII表中的字符分为两大类,一类是不可见字符,控制字符属于此类,其余为可见字符。
有了这套标准,任何字处理软件只要认真遵守,就能得到别人的理解和认可。不知您想过没有,在我们人类看了ASCII这套标准后,我们已经变成了字处理软件,我们要想往显示器或任何一个文本处理系统中输出文本信息,我们也得必须按照这套规则来编码了。于是乎,我们往屏幕上输出字符A,我们要输出数字0x41。输出字符a,我们输出数字0x61。那我想往屏幕上输出0,直接输出数字0能行吗?由于ASCII是一套“字符”标准,它只会打印出字符,数字0可不是在屏幕上输出的0,屏幕上的0那可是字符’0’,所以想输出0,得输出数字0x30。
介绍了这么多,现在就差体验一把了,之前说过了,显存是显卡给我们的接口,咱们得往显存里写点东西才行,可是显存在哪里,怎样写?下节再说。
【再续】