初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

基本概念

 BIOS会将磁盘的第0个扇区(大小为512字节),加载到0x7c00处。

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第1张图片

引导程序负责操作系统的加载,主要用于为操作系统运行提供初始化环境,并运行加载操作系统。

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第2张图片

 

BIOS只加载磁盘的第0个扇区(512字节)到内存中,次程序无法做很多事情。

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第3张图片

 

因此,我们可以采取以下两种方式种的任意一种。

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第4张图片

 X86在上电后,自动进入实模式,目的是为了兼容早期的应用程序。

 X86与编程相关的主要内核寄存器

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第5张图片

 AX BX CX DX 是32位寄存器,在实模式的情况下,只能使用低16位寄存器。高16位寄存器是要留给切换到保护模式的。

CS DS SS ES FS GS 为段寄存器,为访问特定内存地址,需要采用段寄存器:偏移的形式。

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第6张图片

 

8086 CPU 在实模式工作的情况下,内存映射。只能够访问1M的内存空间,如下图所示:

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第7张图片

 工程实战

进入start 示例工程

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第8张图片

 

在source/boot/start.S 添加如下代码。

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第9张图片

 

先build,然后F5启动调试,可以看到各个段寄存器都为 0X0。

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第10张图片

 

按下F11进行单步进行调试。

可以看到进行单步调试前,esp寄存器为:0x6f00

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第11张图片

 

单步调试到27行,esp寄存器就变为:0x7c00

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第12张图片

 

使用BIOS中断显示字符

BIOS提供了一组服务,可以方便地帮助我们操作硬件,避免与硬件细节打交道。

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第13张图片

 

当触发软中断的时,会自动从中断向量表中取相应的地址执行,参数通过寄存器传递。

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第14张图片

 

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第15张图片

 

使用BIOS中断读取字符

将引导程序分成2部分:

1.Boot只是做一些简单的工作,它的程序容量比较小,不超过512字节。

2.把更多的工作放在loader里面做。

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第16张图片

 

BIOS提供了磁盘读取的接口,方便我们从磁盘上读取loader。

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘_第17张图片

 

你可能感兴趣的:(#,操作系统)