自己动手从零写桌面操作系统GrapeOS系列教程——14.屏幕显示原理与文本模式
学习操作系统原理最好的方法是自己写一个简单的操作系统。
一、屏幕显示原理
电脑显示器屏幕是由很多很小的像素组成的。每个像素就像是一个小灯泡,在屏幕上一排一排的整齐排列着。只要能控制每个像素的颜色就能显示出各种各样的图形。如果近距离观察过会场或室外的大屏幕会有更直观的感受,这种大屏幕上每个像素就是一个小灯泡。
屏幕显示原理大致可以如下表示:
CPU(程序)->显卡(显存)->显示器(屏幕)
在程序的控制下,CPU将要显示的数据发送到显卡上的显存(显卡上的内存),显存中的数据和屏幕上的像素是有对应关系的,显卡会不断的从显存中取出数据发给显示器,显示器就会在屏幕上显示出对应的图形。发给显示器前,显卡可能会对数据做一些处理。显卡多长时间向显示器发一次数据与刷新频率有关。
二、显卡的文本模式
显卡有图形模式和文本模式两类显示模式。电脑启动后,显卡的默认模式就是文本模式,能显示25行80列ASCII字符。
对屏幕来说一切皆是图形,显卡的文本模式是为了方便开发人员显示字符用的。如果没有文本模式,显示任何字符都需要开发人员自己精确控制每个像素,后面我们在图形模式中就需要这么做。文本模式无法展示多彩的世界,但我们在进入图形模式前需要在文本模式下显示一些提示信息,所以我们需要学习一下文本模式。
在默认文本模式下,显存与屏幕的对应关系为每2个字节对应一个字符,其中低字节存放ASCII码,高字节存放字符颜色属性。详情如下表所示:
bit | 内容 | 说明1 | 说明2 |
---|---|---|---|
15 | K | 是否闪烁 | 背景色 |
14 | R | 红 | |
13 | G | 绿 | |
12 | B | 蓝 | |
11 | I | 是否高亮 | 前景色 |
10 | R | 红 | |
9 | G | 绿 | |
8 | B | 蓝 | |
7 | 字符ASCII码 | ||
6 | |||
5 | |||
4 | |||
3 | |||
2 | |||
1 | |||
0 |
字符颜色表如下:
R | G | B | 颜色 | |
---|---|---|---|---|
I=0 | I=1 | |||
0 | 0 | 0 | 黑 | 灰 |
0 | 0 | 1 | 蓝 | 浅蓝 |
0 | 1 | 0 | 绿 | 浅绿 |
0 | 1 | 1 | 青 | 浅青 |
1 | 0 | 0 | 红 | 浅红 |
1 | 0 | 1 | 品红 | 浅品红 |
1 | 1 | 0 | 棕 | 黄 |
1 | 1 | 1 | 白 | 亮白 |
在计算机里每个像素的颜色都是RGB三原色按照不同的配比来表示的。这里RGB三原色各用一个bit位来表示,所以只能显示2^3=8种颜色,前景色多了一个高亮位,也只能显示2^4=16种颜色。如果要显示更多的颜色就需要更多的bit位来表示,这个我们后面讲图形模式时再介绍。我们在文本模式下能显示黑底白字就足够了。对于黑底白字,字符颜色属性值对照上面两个表可以得出应该是0x07。
三、显存地址分布
之前在实模式的1M内存布局中介绍过显存地址的分布,我们在这里再回顾一下:
起始 | 结束 | 大小 | 用途 |
---|---|---|---|
0xb8000 | 0xbffff | 32KB | 文本模式显存 |
0xb0000 | 0xb7fff | 32KB | 黑白图形显存 |
0xa0000 | 0xaffff | 64KB | 彩色图形显存 |
从上表可以看到,文本模式的显存开始地址为0xb8000。上面我们已经讲过,在该默认模式下,一个字符对应2个字节。所以屏幕第一行第一个字符对应的地址为0xb8000和0xb8001,其中0xb8000为字符颜色属性,0xb8001为字符ASCII码。第二个字符对应的地址为0xb8002和0xb8003,后面的字符以此类推。在默认模式下,每行显示80个字符,第81个字符会显示在第二行第一个字符的位置,第161个字符会显示在第三行第一个字符的位置,后面的字符同样以此类推。
需要了解的是,上表中的图形显存地址段并不是GrapeOS操作系统用的图形地址段,具体情况后面再介绍。
本讲视频版地址:https://www.bilibili.com/video/BV1Nb411d7Ha/
本教程代码和资料:https://gitee.com/jackchengyujia/grapeos-course
GrapeOS操作系统QQ群:643474045
自己动手从零写桌面操作系统GrapeOS系列教程——14.屏幕显示原理与文本模式的更多相关文章
- 别人写的一个Bootstrap系列教程
http://www.cnblogs.com/lansy/category/659061.html
- 一个人写的操作系统 - Sparrow OS
一个人写的操作系统 - Sparrow OS 自己写一个操作系统,这是在过去的几年里我一直为之努力的目标,现在终于完成了. 缘起 自己动手写操作系统的动机最初来自于学习Linux遇到的困难. 我是一个 ...
- 自制 os 极简教程1:写一个操作系统有多难
为什么叫极简教程呢?听我慢慢说 不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了 ...
- 【操作系统】关于Linux桌面操作系统
以前是Win+Ubuntu+黑苹果,周末想体验一下deepin,于是简单安装了一下,安装过程很简单,这里不再描述.安装之后,第一次打开系统,确实很惊艳,赏心悦目的操作系统. 之前用Ubuntu时候,C ...
- 盘点|2021年最受欢迎Linux桌面操作系统前十名
镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 阿里云开源镜像站利用云服务上的优势,提供快速.稳定的镜像分发服务.和免费的CDN加速服务.更新频率高,基本上一天一更新,对于Centos/Ubun ...
- 手把手教你从零写一个简单的 VUE
本系列是一个教程,下面贴下目录~1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 今天给大家带来的是实现一个简单的类似 VUE 一样的前端框架,VUE 框架现在应 ...
- 《一步一步写嵌入式操作系统》读书笔记1—Skyeye介绍、安装和HelloWorld
2013-11-14 最近在看<一步一步写嵌入式操作系统>,感觉此书甚好,许多地方讲得很清楚.可操作性强,计划边读边实践边写笔记,希望能够逐步熟悉嵌入式操作系统底层的东西,最终剪裁出一套实 ...
- Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)
我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...
- Zedboard学习(一):移植Ubuntu桌面操作系统 标签: ubuntu移植zedboardFPGA 2017-07-04 21:53 26人阅读
环境准备: 首先,需要的肯定是Ubuntu操作系统.可以在自己的电脑上安装物理机,也可以是虚拟机下运行的.我的是在Vmware下运行的Ubuntu14.04 32位操作系统. 由于zedboard上的 ...
- 27、从零写UVC驱动之分析数据传输(设置ubuntu通过串口打印,指定打印到文件,ubuntu切换root用户)
A. 设置ubuntu让它从串口0输出printk信息a. 设置vmware添加serial port, 使用文件作为串口(在vmware中设置,文件是保存在windows中)b. 启动ubuntu, ...
随机推荐
- flask-基础篇02 请求与响应
一.处理请求 1.URL路径参数(动态路由) # 例如,有一个请求访问的接口地址为/users/123,其中123实际上为具体的请求参数,表明请求123号用户的信息.此时如何从url中提取出123的数 ...
- Coursera Programming Languages, Part B 华盛顿大学 Week 3
ML Versus Racket 同 函数编程模式 (with constructs that encourage a functional style) 不鼓励 mutation (但提供了支持 m ...
- 小批量excel数据导入oracle
前提是小批量数据,大批量的还是建议用sqlloader 使用PLSQL Developer工具,这个可是大名鼎鼎的Oracle DBA最常使用的工具.在单个文件不大的情况下(少于100000行),并且 ...
- POJ--2386题C++实现
本题利用深度遍历的穷竭搜索法进行解题,即对每一个元素都对其进行各个方向的深度遍历,穷尽其周围 #include<iostream>#include<cstdio>using n ...
- 简单的IP网络
企业网络架构:小型.扁平化设计,特点:设备少,网络复杂度低,用路由器加交换或路由器就可以实现. 大中型,分层设计,接入层汇聚层核心层,特点:设备众多,网络组建复杂度高.终端设备较多,偏平化设计不适合. ...
- ssh连接不上、Xshell意外关闭Socket error Event: 32 Error: 10053.
Xshell意外关闭可能会出现这种问题,如遇如下错误可解决: Connecting to 47.106.80.28:22- Connection established. To escape to l ...
- List一边插入数据后又移除数据
记录最简单的三种方法,直接上代码: List<String> list = new ArrayList<>(); list.add("1"); list.a ...
- elelment中el-cascader怎样自定义显示的lable 与value
1.后端返回的数据类型 2.页面代码 3.重点在于 :props="{ value: 'id',label: 'className',children: 'childNode'}" ...
- 修改mysql root密码,在workbench中导入.sql文件
修改mysql root密码: 1.如果没有配置环境变量,在 \Program Files\MySQL\MySQL Server 8.0\bin 文件下 Shit+右键打开 Powershell 窗口 ...
- == 和 equal 的区别
== 比较的是两个对象的索引是否相同: equal 比较的是两个对象内容是否相同: int a = 1;long b = 1L;a==b? 答案是 对:因为a和b指向的索引地址相同. 再例如 Stri ...