动手学操作系统(三、通过IO接口直接控制显卡)

动手学操作系统(三、通过IO接口直接控制显卡)

在之前的学习内容中,我们成功编写了MBR主引导记录,在终端上进行了打印显示,在这一节我们使用MBR通过IO接口来直接控制显卡输出字符。

文章目录

  • 动手学操作系统(三、通过IO接口直接控制显卡)
    • 1. 什么是IO
    • 2. 显卡
    • Reference

1. 什么是IO

为了兼容大量的硬件外设,CPU需要增加一“层”来解决不兼容的问题,在CPU和外设之间的这一层就是IO接口,IO接口的形式不限,它可以是电路板,芯片,插槽等等,它的作用就是在CPU和外设之间做相互协调的转化。

IO接口的功能有:

  • 设置数据缓冲,解决CPU与外设的速度不匹配
  • 设置信号电平转换电路
  • 设置数据格式转换
  • 设置时序控制电路来同步CPU和外设
  • 提供地址译码

同一时刻,CPU只能和一个IO接口通信,当很多IO接口都需要和CPU通信的时候,需要再增加一“层”来仲裁IO接口的竞争,这个部分就是输入输出控制中心(I/O control hub, ICH),一般被称为南桥芯片。

Image

2. 显卡

显卡想必不用过多的介绍,只需要理解我们为什么需要操作显卡,我们在上一节使用了MBR在实模式下运行,使用了BIOS的0x10中断来打印了字符串,但是操作系统的正常工作状态是保护模式,在保护模式下就没有了中断向量表,则BIOS的中断也不能使用了,所以凡是涉及到需要向屏幕打印的操作,我们都需要操作显卡来实现。

无论哪种显卡,我们都只关心其向我们提供的可编程接口:IO端口和显存。

显卡的显存地址分布如下

Image

从起始地址0xB80000xBFFFF,这片32KB的内存区域是用于文本显示的,我们往0xB8000处输出的字符会直接落到显存中,显存中有了数据,显卡会自动将其显示到屏幕上,这后续的处理过程交给显卡自动完成即可,我们不需要关心。

在显卡的文本模式下,每个字符由2个连续字节组成,一个表示字符本身的ASCII码,另一个表示该字符的其他显示特性(颜色、闪烁等)

Image

修改之前的mbr.S文件如下

; ~/d2los/src/mbr.S
; 主引导程序 
;
; LOADER_BASE_ADDR equ 0xA000 
; LOADER_START_SECTOR equ 0x2
;------------------------------------------------------------
SECTION MBR vstart=0x7c00         mov ax,cs      mov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0xb800mov gs,ax; 清屏
; 利用0x06号功能,上卷全部行,可以清屏。
; -----------------------------------------------------------
; INT 0x10   功能号:0x06    功能描述:上卷窗口
; ------------------------------------------------------
; 输入:
; AH 功能号= 0x06
; AL = 上卷的行数(如果为0,表示全部)
; BH = 上卷行属性
; (CL,CH) = 窗口左上角的(X,Y)位置
; (DL,DH) = 窗口右下角的(X,Y)位置
; 无返回值:mov     ax, 0600hmov     bx, 0700hmov     cx, 0               ; 左上角: (0, 0)mov     dx, 184fh           ; 右下角: (80, 25),; 因为VGA文本模式中,一行只能容纳80个字符,共25行。; 下标从0开始,所以0x18=24,0x4f=79int     10h                 ; int 10h; 输出背景色绿色,前景色红色,并且跳动的字符串"1 MBR"mov byte [gs:0x00],'H'mov byte [gs:0x01],0xA4     ; A表示绿色背景,4表示前景色为红色mov byte [gs:0x02],'e'mov byte [gs:0x03],0xA4mov byte [gs:0x04],'l'mov byte [gs:0x05],0xA4mov byte [gs:0x06],'l'mov byte [gs:0x07],0xA4mov byte [gs:0x08],'o'mov byte [gs:0x09],0xA4mov byte [gs:0x0A],' 'mov byte [gs:0x0B],0xA4mov byte [gs:0x0C],'W'mov byte [gs:0x0D],0xA4mov byte [gs:0x0E],'r'mov byte [gs:0x0F],0xA4mov byte [gs:0x10],'o'mov byte [gs:0x11],0xA4mov byte [gs:0x12],'l'mov byte [gs:0x13],0xA4mov byte [gs:0x14],'d'mov byte [gs:0x15],0xA4jmp $                       ; 通过无限循环使程序停在此处times 510-($-$$) db 0db 0x55,0xaa

然后编译,链接,执行

cd ~/d2los
nasm -o bin/mbr.bin src/mbr.S 
cd ~/d2los
dd if=./bin/mbr.bin of=~/bochs/bin/hardisk60MB.img bs=512 count=1 conv=notrunc 
~/bochs/bin/bochs -f ~/bochs/bin/bochsrc.disk

执行的效果如下

Image

Reference

[1]《一个64位操作系统的设计与实现》
[2]《操作系统真象还原》

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

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

相关文章

PostgreSQL Windows 数据库主从模式 热同步

1.操作主服务器 1.1修改pg_hba.conf // 这边就设置所有用户,所有ip都可以交互 host replication all 0.0.0.0/0 md52.2 创建流复制用户 // 创建流复制用户replicator CREATE USER replica REPLICATION LOGIN PASSWORD replica…

逻辑回归(头歌)

第1关:逻辑回归算法大体思想 #encodingutf8import numpy as np#sigmoid函数 def sigmoid(t):#输入:负无穷到正无穷的实数#输出:转换后的概率值#********** Begin **********#result 1.0 / (1 np.exp(-t))#********** End **********#retur…

43、Flink 的 Window Join 详解

1.Window Join a)概述 Window join 作用在两个流中有相同 key 且处于相同窗口的元素上,窗口可以通过 window assigner 定义,并且两个流中的元素都会被用于计算窗口的结果。 两个流中的元素在组合之后,会被传递给用户定义的 Joi…

外汇天眼:野村证券和Laser Digital与GMO互联网集团合作发行日元和美元稳定币

野村控股和Laser Digital将与GMO互联网集团合作,在日本探索发行日元和美元稳定币。GMO互联网集团的美国子公司GMO-Z.com Trust Company, Inc. 在纽约州金融服务部的监管框架下,在以太坊、恒星币和Solana等主要区块链上发行稳定币。GMO-Z.com Trust Compa…

MySQL增删查改进阶

数据库约束表的关系增删查改 目录 一.数据库约束类型 NOT NULL约束类型 UNIQUE 唯一约束 DEFAULT 默认值约束 PRIMARY KEY:主键约束 FOREIGN KEY :W外键约束 二,查询 count()两种用法 sum,avg,max…

Vue3_创建项目

目录 一、创建vue项目 1.下载vue 2.进入刚才创建的项目 3.安装依赖 4.运行项目 ​5.打包项目放入生产环境 二、vue项目组成 1.项目文件结构 2.项目重要文件 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、C…

Go语言中实现RSA加解密、签名验证算法

随着互联网的高速发展,人们对安全的要求也越来越高。密码学中两大经典算法,一个是对称加解密,另一个是非对称加解密,这里就来分享一下非对称加密算法的代表:RSA加解密。 在Go语言中实现RSA加解密还是比较简单的&#…

【安全产品】基于HFish的MySQL蜜罐溯源实验记录

MySQL蜜罐对攻击者机器任意文件读取 用HFish在3306端口部署MySQL蜜罐 配置读取文件路径 攻击者的mysql客户端版本为5.7(要求低于8.0) 之后用命令行直连 mysql -h 124.222.136.33 -P 3306 -u root -p 可以看到成功连上蜜罐的3306服务,但进行查询后会直接lost con…

ai机器人电销资源有哪些?真的能帮到我们提高效率吗ai智能语音机器人部署

随着互联网科技的发展,各种各样的科技产物都应用于电销企业,ai机器人电销就是其中一个。那么ai机器人电销可靠吗?ai机器人电销资源有哪些?我们一起来看看。 AI机器人在电销资源方面有以下一些用途和功能: 自动识别潜在…

for循环绑定id,更新html页面的文字内容

需求&#xff1a;将方法中内容对齐 实现方式 给for循环中每个方法添加一个动态的id在DOM结果渲染完后&#xff0c;更新页面数据&#xff0c;否则会报错&#xff0c;找不到对应节点或对应节点为空 <view v-for"(item, index) in itemList" :key"index"…

OWASP十大API漏洞解析:如何抵御Bot攻击?

新型数字经济中&#xff0c;API是物联网设备、Web和移动应用以及业务合作伙伴流程的入口点。然而&#xff0c;API也是犯罪分子的前门&#xff0c;许多人依靠Bot来发动攻击。对于安全团队来说&#xff0c;保护API并缓解Bot攻击至关重要。那么Bot在API攻击中处于怎样的地位&#…

香橙派Kunpeng Pro测评

目录 香橙派Kunpeng Pro开发板试用体验 观察理解与适用场景 体验步骤 试用感受

【ARM+Codesys案例】T3/RK3568/树莓派+Codesys枕式包装机运动控制器

枕式包装机是一种包装能力非常强&#xff0c;且能适合多种规格用于食品和非食品包装的连续式包装机。它不但能用于无商标包装材料的包装&#xff0c;而且能够使用预先印有商标图案的卷筒材料进行高速包装。同时&#xff0c;具有稳定性高、生产效率高&#xff0c;适合连续包装、…

C语言 数组—— 一维数组下标越界问题分析

目录 数组元素的访问 一维数组元素的越界访问 二维数组元素的越界访问 小结 数组元素的访问 访问数组元素时&#xff0c; 下标越界 是大忌&#xff01;  编译器通常不检查下标越界&#xff0c;导致程序运行时错误  下标越界&#xff0c;将访问数组以外的空间  …

pyqt窗体水印

pyqt窗体水印 介绍效果代码 介绍 给窗体加上水印 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtGui import QPainter, QColor, QFont,QPen from PyQt5.QtCore import Qtclass WatermarkedWindow(QMainWindow):def __init__(se…

鸿蒙4.2小版本推出,鸿蒙5.0已经不远了

上个月&#xff0c;市场上迎来了华为鸿蒙系统4字开头的小升级&#xff0c;版本来到了4.2版本。 我们先来看看4.2版本都给用户带来哪些特色&#xff1a; 界面切换更流畅&#xff1a;无论是响应速度还是操作手感&#xff0c;用户都将感受到更加迅速和顺滑的体验 搜星速度的显著…

工具:Visual Studio Code

一、VSCode生成exe 二、在vs中断点调试 如果没效果需要安装如下与unity相连接的插件 三、注释 1、代码注释 注释和取消都是都是同一个命令&#xff1a;选中代码&#xff0c;然后按住CtrlShift/ 2、方法或类注释 /// 四、导航 五、将变量注释展示到解释面板 1、直接显示 [Too…

Git提交时出现Merge branch ‘master‘ of ...之解决方法

最近遇到了一个问题 我是用git提交代码的时候 分支上 显示的是merge 意思是 合并代码了 每次都会 创建一个分支 因为我和另一个小伙伴共同 开发一个项目 所以 小伙伴告诉我 总是创建新的分支 我细细看了一下 测试了一下 我们两个人 修改不同的文件 同时修改 他提交了 我再提…

pip安装软件包提示“没有那个文件或目录”问题的处理

文章目录 一、Python.h&#xff1a;没有那个文件或目录二、lber.h&#xff1a;没有那个文件或目录 一、Python.h&#xff1a;没有那个文件或目录 pip install -I python-ldap3.0.0b1 #异常提示In file included from Modules/LDAPObject.c:3:0:Modules/common.h:9:20: 致命错…

React hooks - useLayoutEffect

useLayoutEffect 用法区别 用法 useLayoutEffect 和 useEffect 的使用方式很相似&#xff1a; useLayoutEffect 接收一个函数和一个依赖项数组作为参数只有在数组中的依赖项发生改变时才会再次执行副作用函数useLayoutEffect 也可以返回一个清理函数 useEffect(()>{retur…