学习操作系统原理最好的方法是自己写一个简单的操作系统。


一、屏幕显示原理

电脑显示器屏幕是由很多很小的像素组成的。每个像素就像是一个小灯泡,在屏幕上一排一排的整齐排列着。只要能控制每个像素的颜色就能显示出各种各样的图形。如果近距离观察过会场或室外的大屏幕会有更直观的感受,这种大屏幕上每个像素就是一个小灯泡。

屏幕显示原理大致可以如下表示:

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.屏幕显示原理与文本模式的更多相关文章

  1. 别人写的一个Bootstrap系列教程

    http://www.cnblogs.com/lansy/category/659061.html

  2. 一个人写的操作系统 - Sparrow OS

    一个人写的操作系统 - Sparrow OS 自己写一个操作系统,这是在过去的几年里我一直为之努力的目标,现在终于完成了. 缘起 自己动手写操作系统的动机最初来自于学习Linux遇到的困难. 我是一个 ...

  3. 自制 os 极简教程1:写一个操作系统有多难

    为什么叫极简教程呢?听我慢慢说 不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了 ...

  4. 【操作系统】关于Linux桌面操作系统

    以前是Win+Ubuntu+黑苹果,周末想体验一下deepin,于是简单安装了一下,安装过程很简单,这里不再描述.安装之后,第一次打开系统,确实很惊艳,赏心悦目的操作系统. 之前用Ubuntu时候,C ...

  5. 盘点|2021年最受欢迎Linux桌面操作系统前十名

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 阿里云开源镜像站利用云服务上的优势,提供快速.稳定的镜像分发服务.和免费的CDN加速服务.更新频率高,基本上一天一更新,对于Centos/Ubun ...

  6. 手把手教你从零写一个简单的 VUE

    本系列是一个教程,下面贴下目录~1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 今天给大家带来的是实现一个简单的类似 VUE 一样的前端框架,VUE 框架现在应 ...

  7. 《一步一步写嵌入式操作系统》读书笔记1—Skyeye介绍、安装和HelloWorld

    2013-11-14 最近在看<一步一步写嵌入式操作系统>,感觉此书甚好,许多地方讲得很清楚.可操作性强,计划边读边实践边写笔记,希望能够逐步熟悉嵌入式操作系统底层的东西,最终剪裁出一套实 ...

  8. Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)

    我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...

  9. Zedboard学习(一):移植Ubuntu桌面操作系统 标签: ubuntu移植zedboardFPGA 2017-07-04 21:53 26人阅读

    环境准备: 首先,需要的肯定是Ubuntu操作系统.可以在自己的电脑上安装物理机,也可以是虚拟机下运行的.我的是在Vmware下运行的Ubuntu14.04 32位操作系统. 由于zedboard上的 ...

  10. 27、从零写UVC驱动之分析数据传输(设置ubuntu通过串口打印,指定打印到文件,ubuntu切换root用户)

    A. 设置ubuntu让它从串口0输出printk信息a. 设置vmware添加serial port, 使用文件作为串口(在vmware中设置,文件是保存在windows中)b. 启动ubuntu, ...

随机推荐

  1. react module.scss文件中弹窗中 keyframes动画不生效,

    以下修改,亲测有效非弹窗内动画写法 .submit_btn{   animation: submit_btn 1.5s infinite;     -webkit-animation: submit_ ...

  2. 【STM32】简述串口中断流程

    串口中断的实现(函数名参考MX生成代码) 初始化: 1.void MX_USART1_UART_Init() 基于UART_HandleTypeDef huart,对huart的成员进行配置,并将数据 ...

  3. Mysql学习:4、DML命令(增删改查)及密码修改

    1.查询表中所有数据: select * from students; 2.插入数据: insert into students (id,name,email,address) values(1,'张 ...

  4. Luogu P3368 【模板】树状数组 2 [区间修改-单点查询]

    P3368 [模板]树状数组 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表 ...

  5. html 手机端适配不同手机高度 ,把内容居中显示

    手机端适配不同手机高度 ,把内容居中显示,可以将div.img.section.span.p等等元素,设置 top:50%; margin-top:xxvw; 这样可以保证主题内容居中显示.

  6. 如何为linux kernel贡献代码

    参考: Linux内核文档:<如何让你的改动进入内核> - 广漠飘羽 - 博客园 提交内核补丁到Linux社区的步骤 - 广漠飘羽 - 博客园 建议: 内容具有时效性,需要阅读最新版本的同 ...

  7. Compose Modifier Clip 圆角

    Row( modifier = Modifier .fillMaxWidth() .padding(20.dp) // 圆角 .clip(RoundedCornerShape(15.dp)) .cli ...

  8. 【NumPy】Python将数组中低于一定百分比的值替换

    情景举例 现有一个一维数组(或二维进行遍历)存放着很多,找到低于中位数20%的值并将小于该值的数全部替换为该值. 涉及方法 np.median(data, axis=0)用于计算数组中元素的中位数(中 ...

  9. https://计算机等级分类总结

    4个等级: 一级:定位为满足人们在一般性工作中对计算机的应用,重点是操作能力的考核: 二级:定位为计算机程序员,可谓"计算机蓝领". 三级:定位为"开发工程师" ...

  10. 贪心算法_Leetcode刷题_7/100

    贪心算法 采用贪心策略,保证每次操作是局部最优的,从而使随后结果是全局最优的. 455.分配饼干 贪心策略:尽量把最小的饼干分配给胃口最小的孩子. 我的代码: 算法描述: 将孩子的胃口值g和拥有的饼干 ...