《30天自制操作系统》学习笔记_day03

前言:第三天的难度还是蛮大的,看了一上午理解了大概,还是好好记录,捋顺一下。

1.实现Ipl的程序装载

首先实现用ipl指示将程序(软盘内容,操作系统)装载到内存特定位置
在03_day的harrib00a中的ipl.nas添加内容的部分
《30天自制操作系统》学习笔记_day03
可以看到用到了 BIOS INT 0x13中断,0x13号中断主要用来磁盘的读写,AH=0x02说明用来读盘。
具体软盘的结构可以查询学习。
AH=处理对象的扇区数
CH=柱面号
CL=扇区号
DH=磁头号
DL=驱动器号
ES:BX 这个很重要,读取到的程序的装载地址,在这里是0x8200,所以软盘中的数据会被装载到0x8200

从这里可以初步理解启动区的作用,启动区指示了读取软盘哪一部分的数据,并将数据装载到内存的什么位置。到此完成了真正IPL的制作。

在这里增加了一个试错功能,主要目的考虑到读取软盘数据时,可能会发生不能读取数据的情况,这个时候我们再试几次。得到harib00b中的ipl
《30天自制操作系统》学习笔记_day03
其实主要是增加了一个判断,每尝试一次si会增加1,当si大于5也就是我们尝试了5次都失败以后才会跳到输出error信息。

2 完善IPL,读取软盘多个扇区和多个柱面。

在1中还是值读取了第2扇区,第1扇区是IPL。
第二步我们希望读取更多的软盘内容。

2.1读取18个扇区
从harib00c中的ipl我们可以看到
《30天自制操作系统》学习笔记_day03
2.2读取10个柱面
harib00d
《30天自制操作系统》学习笔记_day03
主要是丰富了next区的内容。

到这一步,算上系统加载时自动装载的启动扇区,我们能够将软盘10×2×18×512=180KB的内容装载到内存里。

3.开发操作系统

在harib00f中有hariboto.nas 是汇编写出的简单程序
《30天自制操作系统》学习笔记_day03
可以当作简单的操作系统程序demo。用nask编译可以得到haribote.sys

我们需要将这个haribitote.sys和用ipl.nas生成起来的harbitote.img映像文件连接起来,这样可以一同写到磁盘里,以往这个过程需要windows和磁盘的协助,在这里作者提供了edimg.exe工具。

在harib00e中就是完成上述过程,具体eding.exe工具的使用我们不用费心,作者为我们写好了Makefile文件,我们只需要打开!cons,输入make img 制作镜像文件。
《30天自制操作系统》学习笔记_day03
我们可以看到生成了haribote.img同时还有一系列中间文件。
我们打开haribitote.img看看haribitote.sys到底被写到哪里了。
我们查看二进制机器码
《30天自制操作系统》学习笔记_day03
发现在00002600附近有haribote.sys我们程序的名字。
《30天自制操作系统》学习笔记_day03
00004200附近也有一部分内容,其实这是我们程序的内容。

作者希望通过这个告诉我们,向空软盘里保存内容时,文件名会在0x002600以后,文件内容会在0x004200中。

那么我们只需要将操作系统本身写到haribitote.sys 然后随着用ipl指示将软盘内容读到内存中,我们再指示从操作区执行到haribote.sys即可。操作系统便能启动

4.从启动区执行操作系统

将程序写进去以后还要考虑执行的问题。
那么我们如何执行磁盘映像上位于0x004200号地址的程序呢?
现在的程序是从启动区开始,把磁盘上的内容装载到0x8000号地址,那么我们写的操作系统程序应该位于0x8000+0x4200=0xc200号地址。

我们在haribote.nas加上ORG 0xc200将程序装载到指定位置,然后在启动区最后加上JMP oxc200。
《30天自制操作系统》学习笔记_day03
《30天自制操作系统》学习笔记_day03
这些文件我们可以在harib00f中找到。

5.确认操作系统执行

我们修改一下haribote.nas的内容,使其看起来更像一个操作系统。在harib00g中可以找到修改后的hariote.nas
《30天自制操作系统》学习笔记_day03
其实是调用的 BIOS 0x10号中断设定了画面模式,
AH =0x13 VGA图形模式,320×200×8彩色模式。
我们make run一下
《30天自制操作系统》学习笔记_day03
这就是完全启动操作系统后的样子。
完成了从ipl执行操作系统。

6. 32位模式准备

这一步的操作主要是为后期使用C语言做基础,作者的C语言编译器只能生成32位模式的机器语言,但在这种情况下就无法使用BIOS功能,于是我们将需要BIOS的工作放在程序的开头。

我们需要BIOS帮我们设定画面模式,以及获取键盘状态。修改haribote.nas代码如下(harib00h中)
《30天自制操作系统》学习笔记_day03
设置画面模式以后,我们将画面模式的信息保存到了内存当中。还有从BIOS获得的键盘信息,也一并保存到了内存当中。

7.导入C语言

我们现在开始结合C语言编写我们的操作系统程序。
首先是haribote.nas 它的前半部分是用汇编语言写的,后半部分是用C语言写的,并重新命名位asmhead.nas,我们在harib00i中可以找到, 作者在第三天并未详细讲解这部分代码具体涵义,留到以后讨论。

在harib00i中新写的一个文件还有bootpack.c 是我们操作系统的核心内容。

《30天自制操作系统》学习笔记_day03
关于C语言代码如何变成机器语言并和我们的映像文件连接到一起,在查询学习时看到这样一张图。
《30天自制操作系统》学习笔记_day03
可以看到的是 bookpack.c最后经过一些了过程和我们的asmhead.bin连接到一起成为我们的操作系统haribote.sys

实现HlT

在bookpack.c代码中可以没有像汇编一样的hlt代码,这也就意味着我们的操作系统会不停的占用CPU资源,我们希望用汇编实现一个HLT函数供C语言调用,这样可以进入休眠模式。

在harib00j中可以找到naskfun.nas
《30天自制操作系统》学习笔记_day03
我们在底层用汇编为C语言实现了一个调用HLT的_io_hlt函数。
并且在bookpack.c 前面为_io_hlt函数增加一个声明
《30天自制操作系统》学习笔记_day03
源程序写完,Makefile作者已经帮我们写好。
然后打开!cons
make run一下
《30天自制操作系统》学习笔记_day03
可以看到命令行中有调用的一系列exe。

第三天的内容就是这样,收工。