目录
前言
计算机的:取指令、执行指令,所以指令指针IP是计算机执行的核心。
一、运行BIOS程序
1.1 加电自检和初始化
1)按下电源系统启动之后,首先加载执行BIOS代码,由BIOS对系统硬件执行自检查;
例:初始化指令地址(CS:IP=0x000FFFF0) 指向BIOS区,检测RAM,键盘,显示器,软硬磁盘是否正常运作;
2)初始化程序将加载BIOS所支持的中断向量;
例:即将BIOS提供的中断服务程序的入口地址登记在中断向量表;
1.2 加载引导扇区(bootsect.s)
把磁盘0磁道0扇区的256字节(第一块扇区内容)的引导启动代码放到内存0x7c00处,PC指该0x7c00地址处开始运行。
注:引导代码用汇编而不是用C语言,因为C语言的代码编译之后,它的内存位置是人为不可控的(比如自动分配栈),而汇编可以。
二、运行bootsect.s引导程序
2.1 转移至新地址:为操作系统代码腾出空间
2.2 加载Setup文件
通过BIOS提供的int 13中断服务(读扇区)程序,将Setup4的个扇区读到0x90200地址处。
2.3 启动开机动画
用BIOS10号中断在屏幕上显示加载开启启动的图片和文字。
2.4 加载System模块
通过BIOS提供的int 13中断服务(读扇区)程序,读取System模块。
三、运行Setup.s初始化程序
3.1 完成硬件参数初始化
首先通过15号中断获得内存的大小等硬件参数,然后将获得的硬件参数覆盖Bootsect.s文件;
3.2 移动操作系统代码
把从0x9000处所有的操作系统代码(参数+setup+system)移到0地址处。
(在物理内存中,操作系统就存放在低地址中)
3.3 更改寻址模式
1)Setup创建GDT表
GDT表项结构:
2)通过指令,它会把cr寄存器的最后一位置1,这样寻址方式从实模式转变为保护模式
实模式:在X86计算机内部,通过CS:IP(段寄存器:偏移地址)定位执行指令的地址;
保护模式:CS作为页表项从gdt表中寻找段基址,然后和IP得到32位内存地址;
四、运行System模块
4.1 运行Head.s文件
head.s文件会初始化idt和gdt表,这两个表格是寻址用的,以方便保护模式下使用,该模式指令和地址都将改变为32位模式;
4.2 运行Main.c文件
在main函数里面进行各个模块的初始化工作。前面第6部获得的物理内存大小参数就可以传到一些初始化函数中进行使用。
4.3 中断服务程序
除了完成其他工作外,还将它提供的中断服务程序装入内存,并建立相应的中断向量;
补充:
BIOS中断服务程序:文件操作、读写磁盘、时钟服务、显示服务、内存分配等等
(包含外中断、内中断以及用于对设备I/O操作的的中断服务程序)
DOS中断服务程序:和硬件设备相关的,一般都调用了BIOS中断服务程序;
总结
加载运行BIOS -- > BIOS硬件检测和初始化程序 --> BIOS加载引导扇区
--> 引导程序加载Setup文件和System模块和启动开启动画
--> Setup程序记载硬件参数和设置寻址模式
--> System模块进行模块初始化