《自己动手写操作系统》总结(上)

来源:互联网 发布:centos mysql修改密码 编辑:程序博客网 时间:2024/04/16 12:50

 东西比较多,打算分两次来写。

写操作系统有许多的限制,比如要用汇编,要直接操纵硬件等(BIOS中断算是唯一可以小小依靠一下的功能调用,还不能在保护模式下运用)。在使用C语言之前需要为其准备相应的环境,到现在我还没搞清楚到底需要准备些什么环境(书上也没怎么说,或许我没看到)等我知道了,我立刻把它更新进来,或者哪位大侠知道,也望告知 谢谢拉。

计算机通电后,BIOS运行加电自检程序(POST),然后初始化硬件和中断向量表(就是将来我们可以在实模式下调用的函数表),还有BIOS参数(主要是放入内存指定位置,0x400h处)。接着运行基本自引导加载程序(先用loader_1命名,后面还有好几个加载程序)。

loader_1先按照BIOS参数中的启动顺序依次寻找启动盘,如果从软盘启动,则检查软盘的0面0磁道1扇区(硬盘启动现在不说,以后和硬盘结构一起介绍),如果它的最后两个字节为0xAA55,则认定为合法的引导扇区,并把第一扇区的内容转载到内存0000:7c00处,并将控制权交给它(即跳到0000:7c00处运行)。

我们的工作从此开始。我们要按它的要求写一个引导扇区(boot),它的作用就是为将来OS内核的运行准备环境。这些环境要求包括进入保护模式,启动分页机。保护模式的内容非常庞杂,算是真正进入内核前最艰难的部分。

进入保护模式需要设置GDT,GDTR,选择子,关中断,开启A20,最后才跳转进入保护模式。保护模式和实模式主要的区别在寻址,同一个变量,在实模式下的LABEL和在保护模式下的会有不同,这需要了解内存的存放情况才能决定。

还有另外一个重点是特权级。有三个特权级标志CPL,当前特权级,是被存在当前代码段寄存器CS和SS的0、1位上。DPL是段或门的特权级,被存储在段或门的描述符中。RPL则是放在段选择子的0、1位。

特权级的检查是DPL将与CPL、RPL分别进行比较,并会对不同的段或门类型区别对待。感觉很复杂,不多说了,在将保护模式的文档中都会有详细介绍。

看起来要做的工作很多,很难在512字节的范围内完成,所以决定把这些工作放在一个loader.bin中完成,而boot的工作则是把loader.bin放入内存,并交给它运行。这就牵涉到了软盘的读写,通过BIOS调用完成(在实模式下)。

因为将来的内核要用C来写,并且用elf格式编译连接生成(这应该算是一个用C语言的条件,详细的还不清楚……),所以需要了解ELF文件的格式。而loader.bin的还有个任务就是把内核kernal.bin读入内存(同loader.bin),然后按照elf的格式将其重新放置正确。最后将控制权交给内核。

接下来就是内核的工作了,我们下次再说~辛苦啊,那么多内容……

至此,结束