30天自制操作系统 学习笔记3
昨天刚吐槽完这个系统的启动区,只有个hello world,根本没起到“启动”的功能,今天在这一章就看到了“启动”的雏形。不得不说作者的风格我真的很喜欢。
启动的关键是要把磁盘中操作系统的代码拷到指定的内存的位置上。所以作者一开始就讲了如何利用BIOS把内容从磁盘读到指定位置去。这个函数就不在这里赘述了。值得一提的是作者在这里写了关于flag的一些自己的看法。CPU有几个只有一位的寄存器。可以表示进位,也可以表示状态。
还介绍了一下段寄存器。就是ES:BX这种方式表示地址,ES * 16 + BX
写MOV CX,[1234]之类的语句时,默认的段寄存器是DS,所以记得要把DS预先指定为0。
作者给出了读数据是出错后重读的代码,还有连续读N个扇区、N个柱面的方法。
介绍了可用EQU赋值,比如说 CYLS EQU 0x0ff0
其中讲了磁盘映像,我在这里纠结了一小会。这里说的是,将.nas文件用nask编译,输出.sys文件,再把.sys文件保存到磁盘映像里。
其中,保存到映像里,作者给出了解释:
1. 使用 make install指令,将磁盘映像写入磁盘。
2. 在windows里打开个磁盘,把.sys保存到磁盘上。
3. 使用工具将磁盘备份为磁盘映像。
而不借助磁盘和windows就得到最后的磁盘映像和文件,叫做保存到磁盘映像里。(edimg.exe就是可完成这项工作的工具之一)
在这个地方我纠结了一下,前后的磁盘映像有什么不一样,都.img文件。其实前面的.img文件,包括第一天用二进制编辑器弄出来的.img文件都只是纯粹的机器码文件。而
保存之后的磁盘映像,则应该是根据磁盘的布局作过一定调整后的文件,当然代码是不会变的,布局变了。(布局随磁盘的布局和性质变化)
接下来讲了讲怎么用BIOS的函数设置显卡。以及在切换32位模式前,怎么保存一些画面模式、键盘状态等的信息(还要用16位的BIOS来设定)。
最后讲了讲C语言以及如何在C语言程序里用汇编编写的函数。这个地方挺值得回看的。我现在才知道原来“链接”这一步是因为C语言有其局限性,所以有一些功能还是只能有汇编代码来实现。而这个链接则是把C语言的目标文件和这些用汇编写的目标文件,链接起来。
程序里haribote.sys后半部分是C语言写的,而且为了调用C语言的程序,加了100行左右的代码,不过这些代码作者暂时让我们忽略,觉得是透明的就好。