OS专题-了解如何输出文本

OS专题-了解如何输出文本

我们已经成功运行了自己写的引导程序。但我们不拘泥于现状,现在想玩点高深的东西:让我们的引导程序输出点东西

其实你可以想到,BIOS中就有输出文本的方式,内部肯定有实现的指令可以调用,但是我们不能这样做,为什么?因为这样做的话就会出现耦合,我们写出来的程序必须在特定的电脑中执行,每个厂商的BIOS程序都不太一样。

这里,我们可以用到计算机的一个基本机制:中断。

中断是一种允许CPU暂时停止正在做的事情的机制,在返回原始任务之前,运行一些其他高优先级的指令。(就是停止当前的动作去做优先级更高的事)一般情况下需要高优先级操作的硬件设备时才会触发中断,一个中断可以由程序指令(例如 int 0x10)或其他指令触发。

每个中断由唯一的数字表示,该数字是中断表(就是一个类似与ASCII的一张表,里面记录了每个中断索引代表的意义)的索引,该表最初由BIOS在内存开始处(即在物理地址0x0处)建立,其中包含指向中断服务程序(ISR)的地址指针。ISR只是一个机器指令序列,很像我们的引导扇区代码,它用来处理特定的中断(例如,从磁盘驱动器或网卡读取新数据)。

所以总结一下,BIOS将它处理好的一些用于操作计算机硬件的ISR添加到中断向量中。例如:中断0x10会导致调用与屏幕相关的ISR;中断0x13会导致调用磁盘相关的I/O ISR

但是为每一个BIOS程序分配一个中断并不是高效的做法,所以我们可以利用CPU的通用寄存器AX来实现中断。

利用中断机制输出文字

现在想想,当我们希望在屏幕上打印一个字符的时候,我们可以使用BIOS写入到内存中的ISR来实现。给AX设置某个特定的BIOS Defined Character(用户定义的字符),然后触发一个特定的中断,让BIOS的ISR将字符打印屏幕上。

在此之前我们要先搞清楚什么是TTY: TTY是所有终端的统称,包括串口、控制台终端以及伪终端设备。

首先要让CPU知道,我们要显示文字。向AL写入0x0e,以TTY模式显示文字。之后我们用中断指令让文字显示出来。以下是代码:

mov ah, 0x0e ; TTY模式
mov al, 'H'
int 0x10
mov al, 'e'
int 0x10
mov al, 'l'
int 0x10
int 0x10 ; 中断两次代表显示两次
mov al, 'o'
int 0x10

jmp $ ; 无限循环

; 填充其他位的值为00
times 510-($-$$) db 0
; 魔数
dw 0xaa55

完成后编译项目。在Terminal中输入指令qemu bin/loader.img启动写好的镜像。可以看到输出了Hello


OS专题-了解如何输出文本
https://blog.cikaros.top/doc/8f901e2d.html
作者
Cikaros
发布于
2022年9月22日
许可协议