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

前言

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

实验环境: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。屏幕的左上角出现绿色背景、红色跳动的字符。

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

参考资料

-《操作系统真象还原》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值