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

接上回,大家看下显卡各种模式的内存分布。

 

各外部设备都是通过软件指令的形式与上层接口通信的,显卡(显示适配器)也不例外,所以它也有自己的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位来测试上面的颜色.

好了,上面内容摘自《操作系统真象还原》,大家有机会支持一下。

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

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

相关文章

【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;团的战力是团内所有士兵的战力之和。 但…

3.深度学习练习:Planar data classification with one hidden layer

本文节选自吴恩达老师《深度学习专项课程》编程作业&#xff0c;在此表示感谢。 课程链接&#xff1a;https://www.deeplearning.ai/deep-learning-specialization/ You will learn to: Implement a 2-class classification neural network with a single hidden layerUse unit…

一步步编写操作系统 11 实模式下程序分段的原因

cpu中本来是没有实模式这一称呼的&#xff0c;是因为有了保护模式后&#xff0c;为了将老的模式区别开来&#xff0c;所以称老的模式为实模式。这情况就像所有同学坐在同一个教室里&#xff0c;本来没有老同学这一概念&#xff0c;但某天老师领着一个陌生人进入教室并和大家宣布…

【牛客 - 1080D】tokitsukaze and Event(最短路,思维)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/1080/D 来源&#xff1a;牛客网 这天&#xff0c;tokitsukaze带着她的舰队去才归一儿海探索。这个海域有n个站点&#xff0c;深海舰队控制着这片海域的m条航线&#xff0c;这些航线连接着这n个点&am…