从零开始操作系统------MBR直操显卡

本文基于郑纲的《操作系统还原》,仅为个人学习笔记,前期的虚拟机配置等不再详细记录,其中不理解或者出错的地方还望提出意见!

从零开始操作系统------MBR初探

IO接口

IO 接口是连接 CPU 与外部设备的逻辑控制部件,既然称为逻辑,就说明可分为硬件和软件两部分。
硬件部分所做的都是一些实质具体的工作,其功能是协调 CPU 和外设之间的种种不匹配,如双方由于速度不匹配,那 IO 接口就实现数据缓冲以减少等待时间,数据格式不匹配, IO 接口就在这两种格式间互相转换。
IO 接口内部实际上也是由软件来控制运作的,这就是所谓的“逻辑”部分,所以软件是指用来控制接口电路工作的驱动程序以及完成内部数据传输所需要的程序。

  1. CPU 是怎样访问到 IO 接口
    总线,供大家使用的公共线路,属于所有设备共享,所以形象地称之为bus。
  2. 南桥芯片
    同一时刻, CPU 只能和一个 IO 接口通信,输入输出控制中心(I/O control hub, ICH),也就是南桥芯片,负责仲裁 IO 接口的竞争,连接各种内部总线南桥用于连接 pci、 pci-express、 AGP 等低速设备,北桥用于连接高速设备,如内存。
  3. 端口
    IO 接口在诞生之初,就被设计成要通过寄存器的方式同 CPU 通信,其内部有专用于数据交互的寄存器,只不过这里所说的这些寄存器位于 IO 接口中,为了区别于 CPU 内部的寄存器, IO 接口中的寄存器就称为端口。

in 指令用于从端口中读取数据,其一般形式是:
( 1) in al, dx;
( 2) in ax, dx。
其中 al 和 ax 用来存储从端口获取的数据, dx 是指端口号。
这是固定用法,只要用 in 指令,源操作数(端口号)必须是 dx,而目的操作数是用 al,还是 ax,取决于 dx 端口指代的寄存器是 8 位宽度,还是 16 位宽度。
out 指令用于往端口中写数据,其一般形式是:
( 1) out dx, al;
( 2) out dx,ax;
( 3) out 立即数, al;
( 4) out 立即数, ax。

显卡

显卡也称为显示适配器,不过归根结底它就是 IO 接口,专门用来连接 CPU 和显示器。我们想操作显示器,只能通过它的 IO 接口—显卡。

  1. 显卡模式
    在这里插入图片描述
    各外部设备都是通过软件指令的形式与上层接口通信的,显卡(显示适配器)也不例外,所以它也有自己的 BIOS。位置是 0xC0000 到 0xC7FFF。显卡支持三种模式,文本模式、黑白图形模式、彩色图形模式。
  2. 文本模式
    显卡的文本模式也是分为多种模式的,用“列数*行数”来表示,如 80x25, 40x25, 80x43 或者 80x50,它们的乘积是整个屏幕上可以容纳的字符数。不同的模式可容纳的字符数不同,如 80x25 表示一行 80 个字符,共 25 行。
    字符及其属性
    如上图所示,每个字符在屏幕上都是由 2 个字节来表示的,而且是连续的 2 个字节,其中低字节表示字符的ASSIIC码,高字节表示字符属性,低 4 位是字符前景色,高 4 位是字符的背景色。颜色用 RGB 红绿蓝三种基色调和,第 4 位用来控制亮度,若置 1 则呈高亮,若为 0 则为一般正常亮度值。第 7 位用来控制字符是否闪烁(不是背景闪烁)。

代码

我们将之前的 MBR 改造一下,保留滚屏的操作,只修改有关输出的部分,即把通过 BIOS 的输出改为通过显存。

;  主引导程序
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     ; 设置文本模式,其内存地址是0xb8000,见上表
mov gs,ax

;  清屏 利用0x06号功能,上卷全部行,则可清屏
;  INT 0x10   功能号:0x06  功能描述: 上卷窗口

;  输入:
;  AH  功能号= 0x06
;  AL  = 上卷的行数(若为0,表示全部)
;  BH  = 上卷行属性
;  (CL,CH) = 窗口左上角的(X,Y)位置
;  (DL,DH) = 窗口右下角的(X,Y)位置
;  无返回值

mov ax,0x600
mov bx,0x700

mov cx,0          ; 左上角:(0,0)
mov dx,0x184f       ; 右下角:(80,25)
                    ; VGA文本模式中,一行只能容纳80个字符,共25; 下标0开始,所以0x18=240x4f=79
int 0x10            ; int 0x10

; 输出背景色绿色,前景色红色,并且跳动的字符串“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

显存文本模式中,其内存地址是 0xb8000,忘记的话可以往前翻翻“表 3-15”显存地址分布。我们目前是在实模式下编程,实模式下内存分段访问策略是“段基址*16+段内偏移地址”。注意,要考虑到最终地址的段基址要乘以 16,所以咱们选择的段基址必须是除以 16 以后的值。目标地址是 0xb8000,按照以上策略,有多种“段基址+段内偏移地址”的组合可以拼凑出此地址。最直观的段基址为 0xb800,即 0xb8000 除以 16,也就是右移 4 位,偏移地址为 0。

在写入字符操作时,mov 操作都是往显存中写字符。 拿 37 行和 38 行举例, 第 37 行的“ mov byte [gs: 0x00], ‘1’ ”,是往以 gs 为数据段基址,以 0 为偏移地址的内存中写入字符 1 的 ASCII 码。

关键字 byte,用于指定操作数所占的空间。同类的关键字还有 word、 dword 等。这些关键字指明了操作数的数据宽度(字节数),同 C 语言中的变量类型一个道理,都是指明数据所需要的存储空间。“ mov byte [gs:0x00],‘1’ ”表示的意思是:把字符 1 的 ASCII 码写入以 gs: 0x00 为起始,大小为 1 字节的内存中。 word、 dword 分别表示 2 字节和 4 字节,意义同理。

从零开始操作系统------MBR直操硬盘、内核加载器

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值