BIOS电脑启动过程
写在前面:这是我的个人学习过程的总结,可能有很多描述不周与讹误,还需要不断打磨,还请各位朋友不可尽信且不吝赐教
首先需要明确一点,这是一台计算机——它只需要能够取指执行,它便能够被称为是一台计算机。
而为了完成这一活动,显然,我们需要保存指令的内存以及运行指令的处理器,这样就组建完成我们所说的电脑。
但是,我们知道CPU,内存是会掉电的,也就意味着——在最初的时候,内存和CPU里面什么都没有,于是有了BIOS(基本输入输出系统),这是一段固化在ROM上的程序。它不会因为系统掉电而消失,它能完成一些基本输入输出和中断控制,但它不能发挥出CPU的强劲功能(要知道,当计算机从16位的实模式到32位保护模式之后,我们便使用不了BIOS)。所以我们还需要有包含操作系统的第三方存储介质,于是硬盘、软盘、U盘之类成为我们载入程序的手段(一般是操作系统,当然也可以是dos之类的,用于鼓捣汇编语言)
当我们书写操作系统时,需要了解,一台计算机是如何启动的,我们的代码从何时何地开始运行。
- 首先得开机
- BIOS 加电自检,将CS:IP寄存器置为0xffff0,而这里一般是一个跳转指令,指向BIOS的入口。
- BIOS初始化,建立BIOS中断向量表,存入物理地址(0x0000-0x03ff)1KB空间汇总(这张表会有很多空缺,是BIOS尽力而为的体现,相当于它为你挖好种萝卜的坑)
- 将硬盘第一个扇区0头0道1扇区(第一逻辑扇区) boot sector 读入到内存0000:7c00处
- 通过判断该扇区最后两个字节是否是0xaa55(这是规定),确定是否确实是boot,如果不是则尝试寻找其他启动介质
- 开始执行07c00处启动程序(这一段是由汇编语言编写的)
- 之后,启动程序会经过一系列操作完成从实模式到保护模式跳转,再加载对应操作系统内核。
BIOS显存部分
在上面我们使用到了硬件有:cpu,rom,内存,以及磁盘。
作为编程,我们需要一个窗口告诉我们信息(就像控制台一样的作用),所以此时我们还需要一块显示屏幕。
首先思考,当我们想要输出一些信息的时候,我们至少要提供——输出的信息,输出信息在屏幕上的位置(这在逻辑上,应当是一个二维坐标),输出信息的属性(背景色,字体色之类的),其他太复杂的暂且不考虑。
太多复杂的属性会意味着更为复杂的底层编程,因此我所使用的窗口是一个简单文字窗口——经典的显示器80*25模式,这对于验证代码正确性而言,已经足够了。
在内存里有一块区域,我们能够直接操作显示器的显示字符,我们成为BIOS显存,这是BIOS提供的,我们通过对内存的操作,从而间接控制显示效果。
地址分布
B8000 - BFFFFH 32KB —— 用于文本模式显示
对于屏幕上字符属性占用两字节:
前一字节属性,后一字节其ASCII码
具体属性,之后再更新