毕业论文终稿(一个简易操作系统的实现)(7)

2019-03-16 19:19

华北电力大学本科毕业设计(论文)

过任务切换,在当前任务使用协处理器指令时,产生自陷。由自陷处理程序完成有关协处理器现场保存和恢复,这个有利于快速地切换任务。 g) 把TSS中的CS选择子的RPL作为当前任务特权级设置为CPL。

h) 装载LDTR寄存器。一个任务可以有自己的LDT,当然,也可以没有。当任务没有

LDT时,TSS中LDT选择子为0。如果TSS中LDT选择子非空,则从GDT中读出相应LDT描述符,在经过测试后,把所读LDT描述符装入LDTR高速缓冲寄存器。如果LDT选择子为空,则将LDT的存在位设置成0,标明任务不适用LDT。 i) 装载代码段寄存器CS、堆栈段寄存器SS和各个数据段寄存器以及其他的高速缓冲

寄存器。

j) 把调试寄存器DR7中的局部启用位设置为0,以清除局部于原任务的各个断电和方

式。

27

华北电力大学本科毕业设计(论文)

第4章 MyOS具体设计与实现

4.1 MyOS的开发语言、开发流程以及开发环境简述

由于多次需要提到本文所设计的操作系统,所以为这个操作系统取名MyOS。MyOS使用的开发语言为汇编语言和C语言。在编码的过程中,为了使代码逻辑清晰且易于维护,能用C语言的地方都避免使用汇编,利用汇编语言完成的任务有:在系统启动前期用汇编完成一些操作系统准备工作;以及贯穿整个操作系统运行时期,对某些C语言无法操作的寄存器进行的操作;其最重要的贡献还是完成了由16位实模式向32位保护模式的跳转,以及跳转之前利用16位实模式可以调用BIOS中断函数获取和设置一些关于硬件的信息,如果某些信息需要保存,则保存在某个约定的内存地址,以供运行于32位保护模式时期的操作系统使用。(32保护模式不能调用BIOS中断函数,因为BIOS中断函数都是16位代码段)

MyOS的开发流程并不复杂,主要按照如下几个步骤进行:

a) 在Windows系统上编写源代码,包括c语言源代码和汇编源代码,以及makefile

文件。

b) 用C语言编译器和汇编语言编译器编译源代码,并生成各自的机器语言文件。 c) 对机器语言进行链接,并用软件生成软盘映像文件。 d) 将映像文件写入磁盘(软盘),做成含操作系统的启动盘。 下面对这几个步骤涉及到的具体信息进行详细说明。

a) C编译器。由于现在使用较多的C编译器都是以开发Windows或者Linux上的应用

程序为前提而设计的,但是如果用来对编写操作系统的C源代码进行编译的话,可能会有一些不便的地方,所以此次毕设使用的是为开发操作系统而做出了些修改的类GCC编译器。

b) 汇编编译器。为了使汇编之后的机器代码能够与这个类GCC编译器编译出来的机

器代码保持一致,此次毕设使用的是和这个类GCC编译器配套的汇编编译器。 c) 软盘映像文件。软盘映像文件就是每一个bit都与实体软盘一一对应的文件,例

如,一个装满了文件的1440K的软盘,其软盘映像文件就是1440K,而且从头到尾,软盘映像中的每一位(“0”或者“1”)都和实体软盘相同。软盘映像文件可以用于模拟虚拟机的软盘,编写好的操作系统经过编译成机器代码以后,可以写入到映像文件中,用虚拟机以虚拟软盘位启动盘,可以得到和真机运行相同的效果。这样的一个工具大大地方便了系统的开发。在系统的开发过程中,与软盘映像文件对应的有两个软件,一个是软盘映像写入软件,其功能把映像文件当做是一个普通文件,将二进制文件写入到映像文件中,主要用于将编译好的系统写入到映像文件中;另一个软件是虚拟软盘存取软件,这个软件可以将软盘映像文件模拟

28

华北电力大学本科毕业设计(论文)

成一个机器上的硬盘驱动器,可以像操作硬盘的一个分区一样操作这个软盘,例如新建文件、打开文件、修改文件、保存文件、修改目录,不过支持的格式只有FAT12、FAT16、FAT32格式,本人没有这个软件的源代码,但是猜测这个软件的运行原理应该是:根据FAT12、FAT16、FAT32格式文件系统的运行原理,直接对文件系统的根目录区、FAT区、数据区进行模拟,例如:如需要新建一个文件,这个软件就会要在根目录区对应的文件位置新建一个文件名(当然,包括这个文件的诸多信息),接着如果向这个文件写入内容,这个软件就会向软盘映像文件中对应的位置写入这个文件的信息,同时更新FAT表。总结来说,就是如果在实体软盘中做的一些文件操作,你使用的系统怎样写入或读取实体软盘,这个软件就怎样对待软盘映像文件。

d) Makefile文件。到现在为止,需要要用到的软件有C编译器、汇编编译器、软盘

映像写入文件、虚拟软盘存取软件,当然还有一个链接器用来把所有的目标文件链接在一起,再写入到软盘映像文件中,而这些软件的使用都是命令行方式,如果每编译一个文件,都要输入一行命令,效率非常低,所以就使用脚本批处理文件,但是批处理也有其缺陷,因为将来MyOS的文件非常之多,而且随着开发的推进,文件之间有很多依赖关系,这样如果改动一个文件,就要多次运行批处理,而且必须牢记每个文件之间的关系。为了解决这个问题,引入了makefile文件,有了这个机制,每次只需要运行一个命令,就能完成所有的工作,当有新的依赖关系或者添加新的内容时,修改makefile文件即可。

系统的开发的环境。汇编用的是记事本,C语言用的是Visual C++ 6.0。

4.2 MyOS运行原理简述

4.2.1 引导扇区

计算机加电以后,BIOS程序引导计算机的启动,它首先检查被设置用来启动的磁盘(硬盘、软盘、闪存)中的第一个扇区(512字节),并检查这个扇区的最后两个字节,如果这两个字节是55 AA,则说明这个扇区被设置为启动扇区,这时BIOS会“指挥”CPU跳到这个扇区的某个地址(这个地址的信息在扇区存储),开始顺序执行,也就是将执行的权利交到这个启动扇区,而再后来这个启动扇区又会跳转到操作系统内核代码,这样,操作系统就运行起来。

引导扇区要做的第二件事情是从BIOS读出机器的信息,保存到内存的某个约定的地址,这样做的原因是:机器一开始运行在16位的实模式下,可以利用BIOS中断获得很多信息,进行很多操作,而到32保护模式下,就无法运行BIOS中的16位代码段,无法使用BIOS的中断函数。引导扇区的编写是用汇编,直接汇编成机器代码后写入到软盘映像文件的第一个扇区,当然,在写汇编代码的时候,必须控制汇编之后目标文件的大小为512字节,并且最后的两个字节是55 AA。

29

华北电力大学本科毕业设计(论文)

4.2.2 加载内核

上一节讲的是引导扇区引导计算机启动并保存机器的相关信息到内存。而引导扇区只 实际的操作系统在从引导扇区启动之后,都会读入并运行一个加载内核的Loader,有512字节大小,它必须尽快完成一些任务,之后把权利交出去。

这个Loader负责加载内核和模式的切换,然后把权利交给内核。而本次的MyOS系统为了简便,直接在引导扇区里加载内核,而模式的切换并入到系统的内核当中。

加载内核的过程很简单,就是利用BIOS中的读取磁盘中断服务程序,将之前写入磁盘的系统文件拷贝至内存,然后把CPU的EIP寄存器设置为系统所在的位置,这样系统就得到执行了。

4.2.3 执行系统内核

执行系统内核只是一个概念,不需要详细叙述。但是到此为止,还没有介绍MyOS具体信息,这里就先给出一个MyOS运行时的内存分布图,如图4-1,以后详细介绍系统各部分的时候,可以心中有数。图4-2是实模式下使用的1M内存空间,在保护模式下依旧使用,里面存有启动时期保存的有关机器的信息,在保护模式下需要使用。

图 4-2 保护模式和实模式都使用的内存中前1MB空间分布图

30

图 4-1 MyOS系统的内存分布图

华北电力大学本科毕业设计(论文)

4.3 MyOS内核设计与实现

4.3.1 内存管理

内存管理的主要内容是内存容量的检查、内存分配、内存释放,而为了方便管理大内存,减少磁盘外部碎片,还要设计一个以4KB为单位的内存分配和内存释放,这两个功能在整个系统中是内存管理的主要体现形式。 4.3.1.1 内存容量检查

内存管理的第一步是弄清楚内存的大小。而在机器最初启动的时候,BIOS已经检查了内存,并且会保存内存信息。但是问题是,BIOS版本不同,调用方法也不同,所以,通过别的手段得到内存的有效大小。

得到内存有效大小的原理是:往内存的一个单元写入一个值,再从这个单元读出这个但是有一点要注意,从486以后英特尔就在处理器中加入了一个高速缓存,利用局部值,如果相等,则说明该内存是可以使用的内存。

性原理提高CPU的吞吐率,缓冲CPU和内存之间的速度差别的矛盾。而如果高速缓存起作用的话,CPU读出和写入的第一个对象是高速缓存,尤其是在写入某个单元后再次读出这个单元的情况下,这个值并不会真正写入到内存,而是会在高速缓存中。所以,先要将CPU的高速缓存禁止,在测试完内存容量以后再次打开。

怎样禁止缓存呢?控制寄存器CR0中有一位标志位是控制缓存是否有效的,可以对它以下是内存大小检查的代码。

unsigned int memtest(unsigned int start, unsigned int end) {

/* 确认CPU是386还是486以上的 */ eflg = io_load_eflags();

eflg |= EFLAGS_AC_BIT; /* AC-bit = 1 */ io_store_eflags(eflg); eflg = io_load_eflags();

if ((eflg & EFLAGS_AC_BIT) != 0) { /* 如果是386,即使设定AC = 1,AC的char flg486 = 0;

unsigned int eflg, cr0, i;

进行操作。

值还是会自动回到0 */

}

eflg &= ~EFLAGS_AC_BIT; /* AC-bit = 0 */

31

flg486 = 1;


毕业论文终稿(一个简易操作系统的实现)(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2018两会要点:防止因病致贫、因病返贫

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: