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行左右的代码,不过这些代码作者暂时让我们忽略,觉得是透明的就好。

 

 

 

posted @ 2013-03-30 19:07  CheckMate  阅读(732)  评论(0编辑  收藏  举报