一步步编写操作系统 17 显存,显卡,显示器 上

为了能够看到图像,我们需要显示器。无论是哪种显示器,它都是由显卡来控制的,我们没必要了解液晶显示器和普通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。

介绍了这么多,现在就差体验一把了,之前说过了,显存是显卡给我们的接口,咱们得往显存里写点东西才行,可是显存在哪里,怎样写?下节再说。

为了能够看到图像,我们需要显示器。无论是哪种显示器,它都是由显卡来控制的,我们没必要了解液晶显示器和普通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。

介绍了这么多,现在就差体验一把了,之前说过了,显存是显卡给我们的接口,咱们得往显存里写点东西才行,可是显存在哪里,怎样写?下节再说。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ socket网络编程笔记(服务端1)

1. 创建一个信箱 int sock; // 创建一个信箱 sock socket(AF_INT,SOCK_STREAM,0) 2. 创建一个标签,写上地址和端口号 struct sockaddr_in server_addr; // 创建一个标签server_addr.sin_family AF_INET; // 标签--协议族 (AF_INET表示IPV4)ser…

动手学PaddlePaddle(0):新版本PaddlePaddle安装

目录 0.引言 1.环境 2.Windows下安装 安装Python 安装PaddlePaddle 0.引言 今天介绍如何安装新版本的PaddlePaddle,现在最新版的PaddlePaddle是指Fluid版,Fluid可以让用户像Pytorch和TensorFlow Eager Execution一样执行程序,也就是说P…

一步步编写操作系统 18 操作显卡,显存,显示器 下

接上回,大家看下显卡各种模式的内存分布。 各外部设备都是通过软件指令的形式与上层接口通信的,显卡(显示适配器)也不例外,所以它也有自己的bios。位置是0xC0000到0xC7FFF。显卡支持三种模式,文本模式、黑白…

【2019牛客暑期多校训练营(第六场)- J】Upgrading Technology(dp)

题干: 链接:https://ac.nowcoder.com/acm/contest/886/J?&headNavacm&headNavacm&headNavacm&headNavacm 来源:牛客网 Rowlet is playing a very popular game in the pokemon world. Recently, he has encountered a p…

VMware 安装VMware Tools

想要在linux和windows之间复制粘贴,把之前一直没有下的vmwaretools的下载过程记录一下。 1.左上角菜单 ->虚拟机 ->安装 vmware tools (我已经点过了所以是取消安装) 2.桌面多了一个VMware tools ,点进去看一下位置,复制一下tar.gz的文…

Apollo进阶课程⑳丨Apollo感知之旅——机器学习与感知的未来

目录 1机器学习 可解释性是否需要 其它算法 2感知的未来 Sensor迭代 深度学习仿真数据AI芯片 智能交通设施 3思考 原文链接:进阶课程⑳丨Apollo感知之旅——机器学习与感知的未来 自动驾驶感知中的机器学习最大问题在于系统对模块的要求与普通的机器学习不同…

一步步编写操作系统 19 改进MBR,直接操作显卡

到目前为止,说了一部分有关显存的内容,这对于一般的输出来说已经足够了,下面咱们可以尝试写显存啦。我们将之前MBR改造一下,保留滚屏的操作,只修改有关输出的部分。即把通过bios的输出改为通过显存,你会发现…

C++ socket网络编程笔记(服务端2)

接上篇 C socket网络编程笔记(服务端1)_m0_46480482的博客-CSDN博客 1. 用一个while循环来持续监听信道消息 int done 1; while(done) {.... } 2. 创建一个客户信箱来接受收到的消息 int client_sock;3. 创建一个客户信息的标签记录信息 struct sockaddr_in client; //…

【2019牛客暑期多校训练营(第五场)- E】independent set 1(最大独立集,状压dp)

题干: 链接:https://ac.nowcoder.com/acm/contest/885/E 来源:牛客网 Note: For C languages, the memory limit is 100 MB. For other languages, the memory limit is 200 MB. In graph theory, an independent set is a set of nonadj…

Apollo进阶课程㉑丨Apollo规划技术详解——Basic Motion Planning and Overview

原文链接:进阶课程㉑丨Apollo规划技术详解——Basic Motion Planning and Overview 运动规划(Motion Planning)就是在给定的位置A与位置B之间为机器人找到一条符合约束条件的路径。这个约束可以是无碰撞、路径最短、机械功最小等。具体的案例…

ROS机器人导航仿真(kinetic版本)

准备工作: ubuntu 16.04系统;ROS kinetic版本;ROS包turtlebot,导航包rbx1,模拟器arbotix,可视化rviz 1、安装ubuntu 16.04系统与安装ROS kinetic版本自行百度安装。一下链接可作为参考。 http://blog.csdn.net/weicao1990/article/details/52575314 2…

【牛客 - 1080B】tokitsukaze and Hash Table(STLset,并查集,Hash)

题干: 链接:https://ac.nowcoder.com/acm/contest/1080/B 来源:牛客网 tokitsukaze有n个数,需要按顺序把他们插入哈希表中,哈希表的位置为0到n-1。 插入的规则是: 刚开始哈希表是空的。 对于一个数x&a…

C++ socket网络编程笔记(服务端3) 完整代码

上篇&#xff1a; https://blog.csdn.net/m0_46480482/article/details/122995226 完整代码&#xff1a; #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<ctype.h> …

1.深度学习练习:Python Basics with Numpy(选修)

本文节选自吴恩达老师《深度学习专项课程》编程作业&#xff0c;在此表示感谢。 课程链接&#xff1a;https://www.deeplearning.ai/deep-learning-specialization 目录 1 - Building basic functions with numpy 1.1 - np.exp(), sigmoid function 1.2 - Sigmoid gradient …

一步步编写操作系统 20 x86虚拟bochs一般用法 上

bochs一般用法 bochs是一个开源x86 虚拟机软件。在它的实现中定义了各种数据结构来模拟硬件&#xff0c;用软件模拟硬件缺点是速度比较慢&#xff0c;毕竟全是软件来模拟&#xff0c;您想&#xff0c;虚拟机还要在软件中模拟各种中断&#xff0c;能不慢吗。不过它的功能非常强…

【牛客 - 1080E】tokitsukaze and Segmentation(dp,递推,思维)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/1080/E 来源&#xff1a;牛客网 tokitsukaze有一个长度为n的字符串&#xff0c;字符串仅包含0-9。 tokitsukaze要把这个字符串切割成若干个子串&#xff0c;每个子串作为一个十进制的数&#xff0c;…

2.3)深度学习笔记:超参数调试、Batch正则化和程序框架

目录 1&#xff09;Tuning Process 2&#xff09;Using an appropriate scale to pick hyperparameters 3&#xff09;Hyperparameters tuning in practice: Pandas vs. Caviar 4&#xff09;Normalizing activations in a network&#xff08;重点&#xff09; 5&#xf…

2.深度学习练习:Logistic Regression with a Neural Network mindset

本文节选自吴恩达老师《深度学习专项课程》编程作业&#xff0c;在此表示感谢。 课程链接&#xff1a;https://www.deeplearning.ai/deep-learning-specialization/ You will learn to: Build the general architecture of a learning algorithm, including: Initializing para…

JVM内存区域详解

Java中虚拟机在执行Java程序的过程中会将它所管理的内存区域划分为若干不同的数据区域。下面来介绍几个运行时数据区域。 一、程序计数器 1.1 简述 程序计数器&#xff08;Program Counter Register&#xff09;是一块较小的内存空间&#xff0c;它的作用可以看做是当前线程所…

【牛客 - 1080C】tokitsukaze and Soldier(思维,偏序问题)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/1080/C 来源&#xff1a;牛客网 在一个游戏中&#xff0c;tokitsukaze需要在n个士兵中选出一些士兵组成一个团去打副本。 第i个士兵的战力为v[i]&#xff0c;团的战力是团内所有士兵的战力之和。 但…