改进MBR(操作显卡来输出字符)

news2024/11/27 10:33:58

文章目录

  • 前言
  • 前置知识
  • mbr.S代码
  • 实验操作

前言

本博客记录《操作系统真象还原》第二章第一个实验操作~

实验环境:ubuntu18.04+VMware , Bochs下载安装

实验内容:在屏幕上打印字符串【采用的方式是直接修改显存实现】

实验原因:mbr 运行在实模式下,所以在实模式下可用 BIOS 的0x10中断打印字符串,原因在于:首先中断表只在实模式下存在, BIOS 中断是要依赖于中断向量表的。但是接下来用保护模式,在保护模式下没有中断向量表,因此无法食用BIOS中断。

前置知识

显卡介绍

显卡又称为显示适配器,它是用来驱动显示器的。本质上,它是 IO 接口,专门用来连接 CPU 和显示器。我们想操作显示器,就通过IO 接口(显卡),因为CPU是通过IO接口与外设通信。

工作原理

显卡内部有 1 块内存,称为显存。显卡的工作就是不断地读取这块内存(显存),随后将其内容发送到显示器。

显卡中模式的内存分布

在这里插入图片描述

显存地址分布

显卡支持三种模式:文本模式、黑白图形模式、彩色图形模式。【这里,我们关注文本模式】

mbr.S代码

;主引导程序 
;
;LOADER_BASE_ADDR equ 0xA000 
;LOADER_START_SECTOR equ 0x2
;------------------------------------------------------------
SECTION MBR vstart=0x7c00         
   mov ax,cs      
   mov ds,ax
   mov es,ax
   mov ss,ax
   mov fs,ax
   mov sp,0x7c00
   mov ax,0xb800
   mov gs,ax

; 清屏
;利用0x06号功能,上卷全部行,则可清屏。
; -----------------------------------------------------------
;INT 0x10   功能号:0x06	   功能描述:上卷窗口
;------------------------------------------------------
;输入:
;AH 功能号= 0x06
;AL = 上卷的行数(如果为0,表示全部)
;BH = 上卷行属性
;(CL,CH) = 窗口左上角的(X,Y)位置
;(DL,DH) = 窗口右下角的(X,Y)位置
;无返回值:
   mov     ax, 0600h
   mov     bx, 0700h
   mov     cx, 0               ; 左上角: (0, 0)
   mov     dx, 184fh	       ; 右下角: (80,25),
			       ; 因为VGA文本模式中,一行只能容纳80个字符,共25行。
			       ; 下标从0开始,所以0x18=24,0x4f=79
   int     10h                 ; int 10h

   ; 输出背景色绿色,前景色红色,并且跳动的字符串"1 MBR"
   mov byte [gs:0x00],'1'
   mov byte [gs:0x01],0xA4     ; A表示绿色背景闪烁,4表示前景色为红色

   mov byte [gs:0x02],' '
   mov byte [gs:0x03],0xA4

   mov byte [gs:0x04],'M'
   mov byte [gs:0x05],0xA4   

   mov byte [gs:0x06],'B'
   mov byte [gs:0x07],0xA4

   mov byte [gs:0x08],'R'
   mov byte [gs:0x09],0xA4

   jmp $		       ; 通过死循环使程序悬停在此

   times 510-($-$$) db 0
   db 0x55,0xaa

代码说明

第13~14行:显存文本模式中,其内存地址是 0xb8000

实验操作

创建mbr.S,并向文件中填入mbr.S。

(base) user@ubuntu:/home/cooiboi/bochs/bin$ sudo vim mbr.S

编译mbr.S

(base) user@ubuntu:/home/cooiboi/bochs/bin$ sudo nasm -o mbr.bin mbr.S

下面将生成的 mbr.bin 写入虚拟硬盘

dd if=mbr.bin of=hd60M.img bs=512 count=1 conv=notrunc
(base) user@ubuntu:/home/cooiboi/bochs/bin$ sudo dd if=mbr.bin of=hd60M.img bs=512 count=1 conv=notrunc
1+0 records in
1+0 records out
512 bytes copied, 0.110705 s, 4.6 kB/s

启动Bochs

(base) user@ubuntu:/home/cooiboi/bochs/bin$ sudo ./bochs -f bochsrc.disk

输入6,然后再输入c。屏幕的左上角出现绿色背景、红色跳动的字符。

在这里插入图片描述
在这里插入图片描述

参考资料

-《操作系统真象还原》

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

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

相关文章

Flutter性能优化

原理 Flutter的架构主要分成三层:Framework,Engine和Embedder Framework 使用 dart 实现,包括 Material Design 风格的Widget,Cupertino(针对iOS)风格的Widgets,UI/文本/图片/按钮等基础 Widgets,渲染&…

设计模式学习(一):Bridge桥接模式

一、什么是Bridge模式Bridge模式的作用是在“类的功能层次结构”和“类的实现层次结构”之间搭建桥梁。1.1 类的功能层次结构主要作用就是增加新的功能。当我们要增加新的功能时,我们可以从各个层次的类中找出最符合自己需求的类,然后以它为父类编写子类…

(Week 10)最小生成树(C++,prim,Kruskal,并查集)

文章目录Einstein学画画(C,欧拉路)题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示解题思路:并查集(C)[蓝桥杯 2017 国 C] 合根植物(C,并查集)题目描述输入格…

基于Java+SpringBoot+vue+element实现校园闲置物品交易网站

基于JavaSpringBootvueelement实现校园闲置物品交易网站 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录基于JavaSpri…

Element UI 走马灯的使用

目录 走马灯是什么 原生js实现 Element UI的走马灯使用 el-carousel Carousel Events el-carousel-item 走马灯是什么 在有限空间内,循环播放同一类型的图片、文字等内容,走马灯也叫轮播图。 比如 原生js实现 JS实现轮播图效果(同时…

mysql学习总结二

聚合函数 聚合函数表示对 值的集合 进行操作的 组(集合)函数。 # 华为手机价格的平均值 SELECT AVG(price) FROM products WHERE brand 华为; # 计算所有手机的平均分 SELECT AVG(score) FROM products; # 手机中最低和最高分数 SELECT MAX(score) FR…

SpringBoot解决全局和局部跨域问题的两种方式

前言 在如今前后端分离的开发模式下,跨域是一个非常经典的问题,解决的方式也有很多,比如代理服务器,使用JSONP 我之前也写过一篇解决跨域问题的文章,感兴趣的可以参考:解决Vue前后端跨域问题的多种方式 …

【现代机器人学】学习笔记九:运动规划

本节和前一节 【现代机器人学】学习笔记八:轨迹生成 不同,侧重于避障的内容。有一些我认为的重要的基本的概念:1.路径规划是一个纯几何问题,寻找一条无碰撞路径,不涉及动力学和时间相关内容。因此路径规划是运动规划的…

请查收 | 2022 阿里妈妈技术文章回顾

新年伊始,万象更新!转眼,阿里妈妈技术已陪伴大家走过601天~在此,感谢每位读者朋友的支持与关注回顾2022,我们分享了60篇原创技术文章、发布了1本营销科学系列白皮书、开源了1项向量召回技术方案;阿里妈妈营…

Netty基础入门——NIO【1】

Netty基础入门——NIO【1】 1 NIO 1.1 三大组件 1.1.1 Channel && Buffer Channle channel类似于stream,是读写数据的双向通道,而stream要么是输入要么是输出 #mermaid-svg-9w1vFFYCVQmRvHja {font-family:"trebuchet ms",verdana…

YACC移进规约冲突案例分析

总结 总结: bison给出的用例是发现冲突的最便捷方法。 第一种用例:明确用例(一个Example),直接反应问题。第二种用例:混淆用例(两个Example),解析器无法区分两条语句。…

jenkins 节点部署

1、节点注册 登陆jenkins master界面 路径:首页-->系统管理--> 节点管理-->新建节点(New Node) 插曲:我在新的服务器部署master节点,显示剩余交换空间为0B 处理方式请查看:Jenkins - Free Swap…

关于MCU的BootLoader的一些理解

一、关于STM32单片机IAP升级中if(((*(__IO uint32_t*)Addr_App) & 0x2FFE0000) 0x20000000)语句的理解 参考自:https://blog.csdn.net/weixin_45394120/article/details/122732203?spm1001.2014.3001.5502 疑问: 1、为什么要用Addr_App里的数据…

Web操作系统漏洞发现——工具使用总结

目录 (一)web层面 1、信息收集 0x01 网站源码自己开发 0x02 网站源码使用开源CMS 2、可维护Poc 0x01 pocassist 0x02 afrog 3、APP渗透 0x01 在BP上添加转发端口 0x02 Xray进行监听 0x03 触发数据 4、Goby (二)操作系统层…

xss.haozi靶场通关

做完xss-labs靶场后,再继续做这个靶场,感觉这个不是很难,毕竟在第一个靶场也获取了一些经验,但是这个靶场偏向技巧,所以还是以了解为主。 0x00: 分析:对我们的代码未作出限制,因此这里可以使用…

如何用 nodejs 进行 sha1 加密验证,微信公众号开发验证

如何用 nodejs 进行 sha1 加密验证,微信公众号开发验证 一、问题 今天在摆弄微信公众号的时候,遇到这样一个问题: 我的后台是 nodejs 写的,express 框架,官方开发接入的验证代码是 php 写的,其中有一个部…

C语言之蓝桥杯习题(3)☞暴力求解版(思路写在解题过程中)

第一题.1.问题:小蓝数字卡片题小蓝有很多数字卡片,每张卡片上都是数字0到9。 小蓝准备用这些卡片来拼一些数,他想从1开始拼现在小蓝手里有0到9的卡片各2021张,共20210张,请问小蓝可以从1拼到多少?2.解题过程&#xff…

【Docker】(三)使用registry远程镜像仓库管理镜像

1.前言 本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章: (一)基本概念与安装使用 (二)如何使用Docker发布一个SpringBoot服务 在上一篇中留下了一个问题,使用Docker发布服务的方…

【开源代码 | MATLAB线性阵列仿真】

本文编辑:调皮哥的小助理 1、16阵元均匀线阵方向图 %8阵元均匀线阵方向图,来波方向为0度 clc; clear all; close all; element_num16;%阵元数为16 d_lamda1/2;%阵元间距d与波长lamda的关系 thetalinspace(-pi/2,pi/2,200); theta0[0.2 0.1];%来波方向 w…

systemd wsl 测试笔记

文章目录systemd 简介WSL systemdsystemctljournalctlhello serviceSleep 与 Timeout 测试Requires 测试After 测试systemd 简介 Linux 从关闭到运行, 完整的启动和启动过程有三个主要部分: 硬件启动(Hardware boot): 初始化系统硬件Linux 引导(Linux boot): 加载 Linux 内核&…