手写操作系统(三)-BIOS简述

代码、内容参考来自于包括《操作系统真象还原》、《一个64位操作系统的设计与实现》以及《ORANGE’S:一个操作系统的实现》。

1.概述

BIOS(Basic Input Output System),即基本输入输出系统。存在主板的ROM区,负责计算机的启动自检。

BIOS的主要功能包括:

  • POST(Power-On Self-Test):开机自检,检测计算机硬件是否正常工作。
  • 引导操作系统:从启动设备(如硬盘、光驱等)加载操作系统。
  • 提供系统设置:允许用户设置计算机的日期、时间、启动顺序等参数。

BIOS有自动寻找硬件功能,只要是0x55aa结尾,那么,我们就能把它当作引导扇区使用。同时,BIOS 在实际的物理内存中是由布局的我们必须小心,不要破坏这个结构。

BIOS自检设备开始。当BIOS自检结束后会根据启动选项设置(这里指软驱启动)去选择启动设备,即检测软盘的第0磁头第0磁道第1扇区,是否以数值0x55和0xaa两字节作为结尾。如果是,那么BIOS就认为这个扇区是一个Boot Sector (引导扇区),进而把此扇区的数据复制到物理内存地址0x7c00处,随后将处理器的执行权移交给这段程序(跳转至0x7c00地址处执行)。

内存中,一个容量只有512 B的引导扇区是无法容纳操作系统的,甚至连获取硬件信息的检测程序都容纳不下。鉴于如此苛刻的容量限制, Boot引导程序仅能作为一级助推器,将功能更强大的引导加载程序Loader装载到内存中,这也可以看做是硬件设备向软件移交控制权。一旦Loader引导加载程序开始执行,那么一切都交由我们编写的软件来控制。

这里我们先使用实模式来演示。

这是实模式下1MB的结构。

可以看到MBR在7c00地址加载。这也是为什么之前我们要在7c00开始。

 

2.常见参数解释

在写一个简单的MBR程序之前,先解释一下常用的参数。

下面的代码通过BIOS中断服务程序int 10h实现屏幕信息显示相关操作。INT 10h中断服务程序要求在调用时,必须向AH寄存器传入服务程序的主功能编号,再向其他寄存器传入参数。

以下是完整程序实现。

;====== clear screem

mov ax,0600h
mov bx,0700h
mov cx,0
mov dx,0184fh
int 10h

;====== set focus
mov ax,0200h
mov bx,0000h
mov dx,0000h
int 10h

;====== display on screen : Start Booting
mov ax,1301h
mov bx,000fh
mov dx,0000h
mov cx,10
push ax
mov ax,ds
mov es,ax
pop ax
mov bp,StartBootMessage
int 10h

 

清空屏幕

;====== clear screem

mov ax,0600h
mov bx,0700h
mov cx,0
mov dx,0184fh
int 10h

解释:

  • mov ax, 0600h:设置 BIOS 视频功能 06h,用于清空屏幕。
  • mov bx, 0700h:设置屏幕文本的属性字节(文字颜色和背景颜色)07h 表示白色背景黑色前景。
  • mov cx, 0 和 mov dx, 0184fh:设置要清空的屏幕区域,从左上角(第0行第0列)到右下角(第24行第79列)。
  • int 10h:调用 BIOS 视频中断服务以执行清屏操作。

BIOS中断服务程序INT 10h的主功能号AH-06h可以实现按指定范围滚动窗口的功能,同时也具备清屏功能,具体寄存器参数说明如下。

INT 10h, AH=06h功能:按指定范围滚动窗口。

AL:滚动的列数,若为0则实现清空屏幕功能;

BH:滚动后空出位置放入的属性;

CH:滚动范围的左上角坐标列号;

CL:滚动范围的左上角坐标行号;

DH:滚动范围的右下角坐标列号;

DL:滚动范围的右下角坐标行号;

BH:颜色属性:

  • bit0-2:字体颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。
  • bit3:字体亮度(0:字体正常,1:字体高亮度)。
  • bit4-6:背景颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。
  • bit 7:字体闪烁(0:不闪烁,1:字体闪烁)。

BH的显示举个例子:0x07 表示白色字体、字体正常、白色背景、不闪烁

这条命令主要用于按指定范围滚动窗口,但是如果AL=0的话,则执行清屏功能。在使用清屏功能时(AL寄存器为0),其他BX、 CX、 DX寄存器参数将不起作用,无需纠结它们的数值。

 

设置光标位置

;====== set focus
mov ax,0200h
mov bx,0000h
mov dx,0000h
int 10h

解释:

  • mov ax, 0200h:设置 BIOS 视频功能 02h,用于设置光标位置。
  • mov bx, 0000h:指定页面号(在文本模式下通常为0)表示文本模式。
  • mov dx, 0000h:将光标位置设置为第0行第0列(屏幕左上角)。
  • int 10h:调用 BIOS 视频中断服务以设置光标位置。

设置屏幕光标位置BIOS中断服务程序INT 10h的主功能号AH=02h可以实现屏幕光标位置的设置功能,具体寄存器参数说明如下。

INT 10h,AH=02h功能:设定光标位置。

DH=游标的列数;

DL=游标的行数;

BH=页码。

这条语句的目的是,将屏幕的光标位置设置在屏幕的左上角(0,0)处。不论是行号还是列号,它们皆从0开始计数,屏幕的列坐标0点和行坐标0点位于屏幕的左上角,纵、横坐标分别向下和向右两个方向延伸,或者说坐标原点位于屏幕左上角。

 

显示 “Start Booting” 消息

;====== display on screen : Start Booting
mov ax,1301h
mov bx,000fh
mov dx,0000h
mov cx,10
push ax
mov ax,ds
mov es,ax
pop ax
mov bp,StartBootMessage
int 10h

解释:

  • mov ax, 1301h:设置 BIOS 视频功能 13h,用于显示字符串。
  • mov bx, 000fh:指定字符串的属性字节(文本颜色和背景色,0Fh 表示白色背景黑色前景)。
  • mov dx, 0000h:设置字符串的起始位置为第0行第0列。
  • mov cx, 10:指定要显示的字符串长度(假设消息长度为10个字符)。
  • push ax : 将 AX 寄存器保存在堆栈中
  • mov ax, ds : 获取当前数据段
  • mov es, ax :将 ES 寄存器设置为当前数据段
  • pop ax :从堆栈中恢复 AX 寄存器
  • push ax、mov ax, ds、mov es, ax、pop ax:这些指令用于设置显示字符串时的段地址。
  • mov bp, StartBootMessage:将字符串 StartBootMessage 的偏移地址加载到 BP 寄存器中。
  • int 10h:调用 BIOS 视频中断服务以在指定位置显示带有指定属性的字符串。

BIOS中断服务程序INT 10h的主功能号AH=13h可以实现字符串的显示功能,具体寄存器参数说明如下。

INT 10h,AH=13h 功能:显示一行字符串。

AL:写入模式。

  • AL=00h:字符串的属性由BL寄存器提供,而CX寄存器提供字符串长度(以B为单位),显示后光标位置不变,即显示前的光标位置。
  • AL=01h:同AL=00h,但光标会移动至字符串尾端位置。
  • AL=02h:字符串属性由每个字符后面紧跟的字节提供,故CX寄存器提供的字符串长度改成以Word为单位,显示后光标位置不变。
  • AL=03h:同AL=02h,但光标会移动至字符串尾端位置。

CX:字符串的长度。

DH:游标的坐标行号。

DL:游标的坐标列号。

ES:BP=>要显示字符串的内存地址。

BH=页码。

BL=字符属性/颜色属性:

  • bit0-2:字体颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。
  • bit3:字体亮度(0:字体正常,1:字体高亮度)。
  • bit4-6:背景颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。
  • bit 7:字体闪烁(0:不闪烁,1:字体闪烁)。

用于显示字符串、设定字体的前景色和背景色,还可以设置待显示字符串的坐标位置。

 

上面的代码暂时不需要执行,了解一下参数的使用,后面会频繁用到。

 

3.参考

郑钢著操作系统真象还原

田宇著一个64位操作系统的设计与实现

丁渊著ORANGE’S:一个操作系统的实现

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇