




已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计报告1设计目标编写并调试一个多进程共行的进程调度程序,以加深对进程调度的理解要求1:高于实验:至少有四种以上的进程调度程序供选择;每个进程由进程控制块表示,进程控制块至少包含6个信息项;设计一个实用的用户界面,以便选用不同的进程调度算法;要求2:独立运行:有能脱离外部API 、支持库及操作系统运行的可能性;2可行性分析2.1经济可行性开始撰写本文档的日期为2011年12月19日,作业提交截止时间为2012年1月3日,因而时间充足,经济上可行。2.2技术可行性经过一个对计算机操作系统学期的学习以及之前对汇编、C语言、数据结构等科目学习的知识积累,从技术角度看来,设计中的各项要求均有目前所知的技术能实现的应对方案,技术方面可行。2.3法律可行性拟将采用的算法均为公共版权的算法,此外将参考开放源代码的Linux早期版本源代码及Minix早期版本的源代码,可能有部分数据结构或函数引用,因本设计不用于商业用途并将在相应代码上保留原作者信息等荣誉行注释,符合GPL及BSD许可证要求,开发过程所用操作系统及工具均为可免费使用的工具(包括Ubuntu、GCC、NASM、Vim、Bochs、Qemu、Virtual Box、Libre Office等),法律上可行。3需求分析3.1概要分析根据设计目标的要求1,需要设计的调度程序包含用户界面、相应的数据结构和用户控制函数、内部调度函数,其中内部调度函数中包含至少四种基于不同调度算法的方法,数据结构至少包含一个不少于六个信息项的进程控制块数据结构,用户界面部分包括可供用户选择调度算法的功能模块。根据设计目标的要求2,程序将不能依靠任何操作系统中的库函数、API实现,因而程序将设计为基于X86兼容机的系统程序,并按照相关协议让程序直接由计算机的BIOS引导加载,使程序能在主流X86虚拟机软件中完整运行。根据“编写并调试一个多进程共行的进程调度程序,以加深对进程调度的理解”的要求及上述分析,初步确定设计一个严格按照操作系统运行环境运行的调度演示程序,并且每个接受调度的进程拥有自己的进程体及进程体程序,并设计能让进程主动通讯,从加深对操作系统这门课程的角度出发,考虑设计中包含对操作系统一课的大部分内容的应用。3.2服务流程3.3服务ER图4概要设计基于需求分析(见第三部分需求分析),先设计程序如下:1、最终生成的程序存放于一个1.44M的磁盘映像文件中,此文件可直接写入到3.5英寸1.44M软磁盘中;2、上述磁盘镜像可直接用主流X86虚拟机软件(包括VirtualBox、VMWare等)加载运行主程序;3、基于以上两点,本课程设计将包括磁盘引导区MBR程序及主体程序分别用于引导主体程序及进程调度演示;4、从上述几点出发,同时为了顺便深入学习一下操作系统的文件系统实现等内容,本设计将包含两部分:其一为十六位实模式磁盘操作系统用于MBR引导及软磁盘本身存储管理,软磁盘文件系统采用FAT12;其二为保护模式下的多进程系统(一个简易操作系统),即主体程序,将由十六位实模式磁盘操作系统引导加载;5、面向用户概要设计为:用户把磁盘塞进计算机(或把磁盘映像放进虚拟机)后,启动计算机,计算机将从软磁盘引导,首先进入到一个磁盘操作系统中,在此磁盘操作系统中通过简单选择或者命令输入将进入进程调度主程序界面,再次界面中可完成进程管理、进程控制以及进程调度管理操作。6、综上,本设计为一个实模式磁盘操作系统和一个多进程的简易操作系统(如下图):4.1进程调度演示系统整体模型整体模型层次图如下图:4.2实模式软磁盘操作系统模型模型概要:如上图所示,对于用户来说,引导进入进程调度系统的引导程序在磁盘中以文件形式静态存在,用户通过操作磁盘操作系统运行引导程序,而对于引导程序来说,实现引导也必须依赖于磁盘操作系统内建的操作系统中断实现读取作为单独文件存放的多进程调度系统内核。(之所以分开两个文件存放,是因为多进程调度系统设计由C和汇编语言编写并编译为ELF结构文件,读入内存后还必须进行内存分页后按入口地址组织等操作。)而对于用户来说,磁盘操作系统的内容只包括显示输出的内容和键盘操作的部分,文件系统的实现、显存操作、中断处理等部分均对其透明。对于此系统而言,程序由实模式操作系统的引导程序从磁盘映像中读取到内存中执行,而读取到内存的操作需要定位到程序主体在磁盘中的存放位置,这就需要对文件系统进行初步的操作,因此,此系统首先是基于文件系统的。综上,此程序主体为:文件系统、中断系统、用户终端(显示输出及键盘操作);4.2.1文件系统模型本设计中文件系统包含最终编译生成的1.44M磁盘映像中的数据内容以及实模式磁盘操作系统中对磁盘进行读写操作的部分。数据组织上,采用FAT12标准进行组织架构,即使磁盘映像中包含正确的主引导记录扇区、两个FAT表、一个根目录区等,因此,此磁盘映像生成时,具备的线性结构如下:如上图,映像中第一个扇区(头部512字节)中包含跳转到引导程序的指令、FAT12分区的基本信息及引导程序;第一个扇区以后,是9个扇区的FAT1和9个扇区的FAT2,此时,这两个表均表示为分区空间全部闲置;同时根目录区为空。对于文件系统的操作部分,设计以下几个依赖BIOS的13H号中断的方法:初始化软驱;关闭软驱;把LBA转换成CHS;根据CHS读取扇区;根据CHS写入扇区;获取文件当前簇的下一簇簇号;设置文件当前簇的下一簇簇号;根据文件名在当前目录下搜寻文件;根据文件名删除文件;读取根/子目录表;写入根/子目录表;读入FAT表;写入FAT表;读取指定簇;读取整个文件到内存;创建文件;写入文件;为文件分配一系列簇;遍历当前目录的文件;打印遍历的文件信息;规格化文件条目为文件信息字符串到文件名缓冲区;文件名缓冲区操作(含大小写规格化、清理等);规格化目录路径;读取规格化后的目录路径指向的目录;考虑到此文件系统只为一张软盘即只有体积极小的FAT表,而可用内存有1MB大小,且内存读写速度远远大于磁盘操作速度,因而设定为运行后直接装载FAT表到内存中读写,因为读取操作远远多于写入操作,因此设定为每次写入时整个FAT表写入。4.2.2中断系统模型中断向量表采用8086模式下BIOS默认预设的0:0内存编址开始的十六位中断向量表。其中,为了实现部分时钟相关的功能,需要设定中断向量表的8号中断、操作定时器模式、初值等;键盘中断的实现包括设置中断向量表的9号中断;另外需要自行编写部分引导程序需要调用的操作系统中断,包括编写相应的中断服务程序(如字符串输出、文件读写等,此部分务求与MS-DOS兼容)、设置中断向量表的21H号中断及设置二级中断向量表等。4.2.3用户终端模型考虑到拓展性(包括是模式操作系统日后的深入研究拓展等)及用户习惯,实模式操作系统设计为:最大限度模仿MS-DOS的人机界面。模仿MS-DOS的人机界面设计实模式操作系统用户界面如上图,设计为用户键入指令回车后执行指令,并设计实现DIR指令用于显示文件列表、CD指令用于更改当前目录、键入可执行程序名时执行程序等功能;对于引导进入保护模式多进程调度系统的实现,设计为编写一个名为“boot”的可执行程序放进磁盘中,用户在实模式磁盘操作系统启动完毕后在命令(如上图)中键入“boot”即可完成引导,此部分利用了实模式操作系统执行程序的功能。考虑到与MS-DOS的兼容性,boot程序将参照COM文件结构编写,同时对是模式操作系统加载程序的实现作出相应的设计。4.3保护模式下多进程系统模型模型概要:在本系统中,用户可见的内容只有进程管理器以及进程在运行时涉及到用户界面显示的操作,用户能操作的只有进程管理器,用户通过操作进程管理器实现进程控制、进程管理、调度控制等功能。进程调度及涉及硬件的操作均由系统内核完成,作为进程存在的作业或任务只能通过包括消息传递、文本收发在内的系统调用完成涉及硬件的操作。4.3.1保护模式跳转程序概要设计由于进程调度系统对系统安全性有较高要求,同时需要的内存在实模式下无法获取,因此本系统需要设计在80386及其后继机型的保护模式下,因而需要一个模式切换的跳转程序。对于多进程的系统来说,进程的内存寻址、地址编址方式不确定,为了避免冲突,需要采用虚拟内存的方式,因而跳转程序中需要开启X86的分页机制,实现段页式存储管理,因为本系统暂不需要文件系统,因而分页文件可忽略,分页直接映射所有的物理内存;进程调度的实现、硬件操作均由系统内核完成,进程体不可直接操作硬件,同时为了避免一个进程的错误导致整个系统的崩溃,本系统中需要实现权限分级,因此引导程序中还需要利用X86的Ring0和Ring1两个特权级,并设置相应的GDT以划分各个内存段的权限等级,其中系统内核运行在Ring0,其余运行在Ring1态;操作系统中需要获得物理内存大小从而实现内存分配等管理,而获取内存大小的兼容性最高的方法是利用BIOS中断,因为实模式下BIOS中断不可用,因而设定在跳转程序中跳转到保护模式前获取内存大小。当然,跳转程序最重要的工作是从文件系统中查找到系统内核程序的实体文件,加载到内存中,然后按照ELF结构把内核各程序段放置到准确位置上,最后跳转到内核程序入口处,涉及文件系统的操作需要依赖前面实模式操作系统的系统中断,因而读取操作在实模式下完成,而放置内核需要在开启内存分页后,因此在保护模式下完成。综上,此跳转程序流程如下图:4.3.2保护模式系统初始化流程跳转到系统主程序之后,需要进行一系列的初始化操作,包括:1、 设置全局描述符表(GDT)及TSS;2、 编程初始化Intel 8259A3、 设置IRQ映射图;4、 设置中断描述符表(IDT);5、 初始化进程将要使用的局部描述符表(LDT)分配表及对栈;6、 强制使用设置的GDT;7、 初始化进程表;8、 初始化文本消息队列;9、 初始化用户表;10、设置所需的全局变量;11、插入预设进程;12、开始进程调度;4.3.3进程管理器用户界面实现对于进程管理器的实现,有两种方案:1、 把进程管理器本体作为一个进程实现显示;2、 让进程管理器成为内核的一部分,实时显示当前调度情况;由于本设计中需要实时切换调度方式,而诸如FCFS一类的方式可能会造成进程管理器本体进程饥饿而无法实现显示进程信息的效果,因此本设计中采用了第二种方案,由此抛弃了把本设计做成一个完成的操作系统的思路,仅实现演示功能。基于上述设计方案,设计一个刷新显示任务信息的子程序,让此子程序每五个时间片运行一次(每个时间片为10ms),忽略显示处理的时间,大约为20帧/秒的刷新速度。由于没找全脱离BIOS支持的VGA编程的相关资料,因而用户界面全程采用显卡兼容的Teletype模式,实现80*25的字符界面,限于分辨率大小,只能同时显示不多于25个进程的信息,再加上界面设计,设定用户界面如下:如上图,进程列表中同时显示最多19个进程包括进程名、用户UID、进程PID、优先计数、优先数、消息队列消息数量、进程状态、睡眠时间、运行时间、需要运行的时间在内的进程信息,并提供调度时间片吧、调度算法、内存信息在内德系统信息。同样受限于分辨率大小,用户指令设计为命令行形式以容纳更多的指令,进程输出局限在右下角的小窗口里。键盘操作功能方面,设置环状队列的键盘缓冲区及一个字符数组作为命令缓冲区,设置一个指针指向当前激活的进程,当有进程激活时,对键盘的操作将作为消息发送给进程,当没有进程被激活时,键盘消息由进程管理器处理,进程管理器以回车键为命令结束的标志,键盘方向键或者Page UP、Page Down控制进程列表显示。对键盘的硬件处理由中断完成,内核每次读入键盘扫描码后识别按键类型,属于ASCII字符则加入键盘缓冲区及命令缓冲区,属于功能键则按功能划分处理。默认情况下,系统接管键盘,用户输入的指令反馈显示到屏幕上,同时对用户每次回车键操作作一次命令解析,由于命令较少,命令解析可按照无序的字符串比较完成。4.3.4进程调度所需要的数据结构本程序通过操作以下数据结构实现进程调度:1、 段描述符的数据结构段基址;段界限;段属性;此数据结构用于全局描述符、局部描述符等,划分特权级及进程(程序)段用;2、 门描述符偏移地址;段选择字;参数计数;属性;此数据结构用于调用门、中断门、陷阱门、任务门,实现系统调用、中断等;3、 栈框的数据结构各寄存器;此数据结构主要用于进程切换,各寄存器按照切换中压栈顺序排列;4、 TSS的数据结构32位TSS的数据结构;此数据结构主要用于特权级切换;5、 文本消息的数据结构发送方PID;接收方PID;允许阅读次数;文本消息内容;此数据结构用于传送文本消息,实现方式为建立一个文本消息数组用作信箱,发送文本消息时先把文本消息类型及信箱编号作为普通消息的参数发送至目标进程,目标进程再通过信箱号获取信息,普通消息的数据结构如下:6、 普通消息的数据结构发送方PID;类型;值;此数据结构用于每个进程各自的消息队列,每个进程拥有独立的若干个普通消息数据结构组成消息队列,当消息队列满后,拒绝接收所有消息,进程可通过系统调用发送消息或轮询接收消息;7、 用户的数据结构用户UID;用户名;用户的进程数;用于某些进程调度算法;8、 进程控制块的数据结构栈框;局部描述符段选择子;局部描述符表;优先数计数(动态优先数);优先数(静态优先数);睡眠时间(仍需睡眠的时间);已运行时间片;需要运行的时间片;状态;用户UID;消息队列;消息计数;进程PID;进程名;9、 任务数据结构任务进程体子程序;栈大小;任务名;需要运行的时间片;优先数;进程的建立基于任务一个任务体可生成多个同时运行的进程实体;4.3.5内存空间分配本程序的运行基于实体计算机或者虚拟机,需要至少32MB的内存,分配情况如下:设置分页时,设置的页表数和页目录数对应实际内存大小,因32位地址总线最大寻址4GB,即页表最大占4MB,因而预留4MB内存给页表,本程序允许最多256个进程同时运行,栈空间按照平均每个进程32KB进行预算,进程表等数据实体均存放于系统内核中。4.3.6基于定时器中断的调度模型本系统中,进程调度的依据是时间片,最小时间间隔单位是10ms,调度间隔可由用户控制,实现流程如下:如上图,进程切换利用X86保护模式的特权级切换、TSS数据结构,通过定时器中断实现,其中,定时器中断发生时,判断是否需要调度的依据是用户设置的调度时间片,由于当代计算机的性能较高,10ms的调度间隔足够运行任何调度算法,而定时器8253能设置的最小时间间隔也接近10ms,因此设置10ms为默认调度间隔时间片。4.3.7调度算法选择的实现对于实时选择调度算法的功能,设计如下:首先设置一个变量用于记录当前的算法,此变量初值为某个算法(默认调度算法),用户可随时通过指令修改当前算法,修改的值保存在这个变量中。发生进程调度时,调度器根据用户选择的算法决定运行哪一个调度子程序。4.3.8调度算法要求实现至少四种的调度算法,四种基本算法即为课本上介绍的算法:时间片轮转法、FCFS、静态优先数调度、动态优先数调度,此外,因为用户界面上,显示进程体输出的功能模块参考其他操作系统的设计,由一个用户为0的进程完成,因此引入第五种算法:参考CFS的用户平分时间片、用户内动态优先调度的算法。本系统的进程控制块有“要求服务时间”一项信息,因为有不按时间作为完成依据的进程存在,因而设定要求服务时间为0的进程为无限时运行的进程,这样一来,在FCFS及静态优先数算法中必定会造成无法调度,因此,FCFS和静态优先数算法里,系统将不把无限时运行的进程纳入调度范围内。则五种调度算法总结如下:默认的调度算法:每次调度选择不同的用户,再从同一个用户的进程中选择动态优先数最大的进程进行调度,每次调度后动态优先数减1,直到全部可调度进程的动态优先数均为0时,将全部可调度进程的动态优先数重置为初值。时间片轮转法:按照进程表的顺序以时间片为单位时间轮转调度。FCFS:每次调度PID最小的可调度进程,直到完毕。动态优先数:在进程表中选择动态优先数最大的进程进行调度,每次调度后动态优先数减1,直到全部可调度进程的动态优先数均为0时,将全部可调度进程的动态优先数重置为初值。静态优先数:每次选择优先数最大的进程进行调度。4.3.9进程管理、控制功能进程的管理、控制包括建立进程、结束进程、强迫进程睡眠、修改进程的运行时间、优先数、切换用户、发送消息给进程等。程序运行后,预设有几个进程,用户可在进程总数不超过最大值的情况下新建进程,每个进程均依照任务体建立,每个任务体均有其对应的子程序,其中,任务体可以复用,作为进程体的子程序也可以复用,进程体的复用依据是:1、虚拟内存地址;2、局部变量均保存在栈中;3、每个进程拥有属于自己的栈空间。新建程序时,进程体均为一个默认的子程序因为本系统没有实现文件系统,所以不可以运行第三方程序作为新进程,进程状态更改为READY,允许调度。对于时间片用完的进程,标记其为FINISH但不终止子程序,终止子程序的操作只能由用户输入命令完成,终止的进程被标记为DIE。进程可主动使用系统调用进入睡眠状态,也可以由用户指定睡眠时间进入睡眠状态。睡眠中的子进程不会被调度器调度,直到睡眠时间结束状态转换为READY为止。为了防止因为所有进程均进入睡眠状态而导致调度器死锁或调度程序陷入死循环,规定当遍历三次(三次是因为动态优先数算法时,所有进程动态优先数均为0时需要重置优先数,将进行两次遍历)进程列表未找到READY状态或BLOCK状态的进程时,强制将当前进程指定为0号进程,这参照了Linux关于0号进程Init的设定。4.3.10进程通信、系统调用在本程序中,系统调用作为软中断存在,中断号为0x80,中断功能号作为系统调用表调用的依据。系统调用主要包括有根据进程名获取查找进程PID、获取本进程的PID、根据进程PID发送普通消息、根据进程PID发送文本消息、获取本进程消息队列中的消息、根据信箱编号获取文本信息、进程睡眠等。进程间通信依靠两种消息完成:普通消息和文本消息。普通消息的发送需要三个参数:目的进程PID、消息类型、消息的值。文本消息的发送需要三个参数:目的进程PID、文本起始地址、文本允许阅读次数。由于文本传递中涉及到不同代码段的操作,直接建立文本通道可能会造成错误,因此本设计中采用了文本信箱的方式进程发送文本后,内核把文本复制到信箱中并返回信箱编号,发送进程再把信箱编号作为普通消息中文本类型普通消息的值传递给目标程序,目标程序轮询自己的消息队列捕获消息类型为文本类型时,取出信箱号并通过获取文本消息的系统调用向系统要求获得消息内容,系统通过对信箱中该信箱号位置的消息数据结构中目标进程PID项与发送请求的进程的PID进行比对后决定是否把文本信息复制到请求进程提供的缓冲区中。进程发送消息每条文本信息有允许阅读次数的计数器,每次成功的阅读请求会使该计数器值减1,当其值为0时,该文本消息作废,系统认为其为空信箱,空信箱不允许读取,可写。同理,当信箱计数值不为0时,系统认为该信箱有消息,不把新消息写入该信箱,当所有信箱均不为空时,系统不允许发送文本消息当然,这样一来,有可能因为某些进程的恶意发送而导致信箱长期为满载,从而使系统不能正常服务,因此,需要设置一个解决信箱满载的方案,此方案设计为:目标进程轮询获得文本类型普通消息后,不读取文本消息而继续轮询达到一定次数后抛弃该文本信息;若目标进程经过一定次数的调度后均不轮询消息则认为该进程没有消息处理机制,抛弃以该进程为目标进程的所有文本消息。内核处理消息除了文本消息外,普通消息也有可能因为消息队列满载而无法正常接收这种情况下,需要在进程调度算法中对发送方和接收方得优先数进行调整处理或者交给进程自己处理。5详细设计5.1环境、代码及规范本次设计主要在Ubuntu下用GVIM完成,由于和Windows之间存在UTF-8和Unicode编码的兼容性问题,全部注释用英文字母标注。源代码的文件格式包括:1)以.c为后缀的C语言代码文件;2)以.h为后缀的C语言头文件;3)以.s为后缀的汇编语言代码文件;4)以.inc为后缀的汇编语言头文件;5)无后缀名为bochsrc的Bochs虚拟机配置文件(可选);6)无后缀名为Makefile的生成文件,命令依赖于Bash;7)以.img为后缀的磁盘映像文件,也是最终编译生成文件;8)可能存在后缀带“”或“swp”的vim交换文件;9)可能存在的一些工具(程序)文件。上述文件中,C语言代码遵从C89标准,汇编语言代码采用NASM支持的Intel语法格式,编译器为NASM和GCC,调试环境为Bochs虚拟机及Qemu虚拟机,Makefile中使用了Bash的cp指令、rm指令及mount、unmount指令。使用Makefile的编译过程如下:5.2实模式磁盘操作系统的详细设计实模式操作系统不是本设计的重点,而仅仅作为引导程序的一部分及作为顺带学习一下文件系统的实现用试验品。由于此系统设计底层操作居多,对算法复杂度要求低,因此完全采用汇编语言编写。5.2.1功能模块划分1、实模式磁盘操作系统按功能划分为:2、操作系统中断模块(对应源代码 dos/kernel/dos.s);3、文件系统功能模块(对应源代码 dos/kernel/fs.s);4、常用内部函数(对应源代码 dos/kernel/general.s);5、全局变量、缓冲区等(对应源代码 dos/kernel/global.s);6、初始化程序体(对应源代码 dos/kernel/init.s);7、中断实现(对应源代码 dos/kernel/ints.s);8、键盘处理(对应源代码 dos/kernel/keybord.s);9、定时器处理(对应源代码 dos/kernel/time.s);10、视频输出模块(对应源代码 dos/kernel/video.s);5.2.2中断实现中断实现依赖于BIOS默认建立的中断向量表,其中,按照主I8259A的IRQ线,设置8、9号中断向量表的中断向量指向定时器、键盘中断处理服务程序,设置0x21号中断指向内建的DOS中断服务程序(部分兼容MS-DOS)。dos/kernel/ints.s文件中的主要子程序说明:_SET_UP_INTS初始化中断向量表_SET_INT_HANDLER设置中断向量_INT_TIMER定时器中断服务程序_INT_KEYBOARD_CHAR键盘中断服务程序_INT_DOS_CALLDOS中断服务程序_INT_DOS_SET_TABLE设置DOS中断中断向量表的中断向量_INT_DOS_INIT_TABLE初始化DOS中断的中断向量表此文件内定义了一个作为DOS中断二级中断向量表的数据结构:_INT_DOS_CALL_TABLE二级中断向量表dos/kernel/dos.s文件内定义了几个引导程序需要用到的DOS中断:_DOS_PUT_CHAR在屏幕光标处输出字符_DOS_PUT_STRING在屏幕光标处打印字符串_DOS_EXIT_PGM退出程序,返回DOS_DOS_INPUT_CHAR_NO_ECHO输入字符,不回显_DOS_INPUT_CHAR输入字符并回显_DOS_OPEN_FLIE打开文件_DOS_READ_FILE读文件到内存5.2.3键盘处理dos/kernel/keybord.s文件中定义了以下主要函数实现键盘处理:_KEYBOARD_SCAN_TO_ASCII扫描码转换为ASCII字符(对部分按键适用);_KEYBOARD_SCAN_TO_FUNCTION扫描码转换为特殊功能键(如方向键、回格键、回车键);_KEYBOARD_BUFFER_CHAR存储当前按下的单键(用于上下文操作);_KEYBOARD_BUFFER_CLEAR清空键盘缓冲区_KEYBOARD_BUFFER_CMD存储当前输入的一整串按键到缓冲区;_KEYBOARD_BUFFER_PGM键盘缓冲区操作;当发生键盘中断后,系统根据扫描码判断调用_KEYBOARD_SCAN_TO_ASCII或者_KEYBOARD_SCAN_TO_FUNCTION处理键盘消息,同时决定是否缓存输入的按键,由于键盘的扫描码有单字节或者双字节、三四字节,因此需要根据上下文判断按下的具体按键,_KEYBOARD_BUFFER_CHAR用于存储单个扫描码或经转换的ASCII码,键盘缓冲区等数据结构及变量定义在dos/kernel/global.s中。dos/include/const.inc中定义了特殊键、键盘指示灯状态;dos/include/macro.inc中定义了键盘扫描码转换数组;5.2.4常用子程序dos/kernel/general.s中定义了一些常用的内部函数(也是杂项子程序)及命令行指令的处理程序:_GNL_BCD_TO_HEXBCD码转为整数_GNL_INT_BUFFER_FILL十进制数转换缓冲区清空_GNL_HEX_TO_INT整数转换为十进制BCD码_GNL_WAIT_FOR_CMD等待命令行命令_GNL_EXEC执行外部程序_GNL_STR_CMP字符串比较_GNL_INNER_CMD内部指令处理_GNL_CMD_DIR目录列表指令处理程序_GNL_CMD_CLS清空屏幕指令处理程序_GNL_CMD_HLT关闭计算机指令处理程序_GNL_CMD_CD更改当前目录指令处理程序5.2.5全局变量以下为重要的全局变量:DriverLabel当前盘符CurRoute:当前目录路径FDBFAT12目录项数据结构FileMask文件属性掩码StdFileName标准文件名StdExtName标准文件扩展名StdCommand命令缓冲区StdCommandBak:命令缓冲区备份(第二缓冲区)FNB规格化输出文件信息数据结构KeyBuffer键盘缓冲区KeyCount按键计数KbStatus键盘状态指示(Shift、Caps Lock等)KbCurChar当前按键(ASCII)记录KeyMapChar扫描码映射图dwGnlVar1临时WORD类型变量dwGnlVar2临时WORD类型变量ddGnlVar1临时DWORD类型变量ddGnlVar2临时DWORD类型变量szArray1临时缓冲区(队列)变量IntDecBufBCD码转换缓冲区tick_l定时器计数5.2.6视频输出视频输出方面,利用了BIOS预设、广泛兼容的Teletype-80*25字符模式,即把0xB8000段内存作为显示缓存,要输出视讯时,直接把要显示的内容写入显示缓冲区。对光标位置、屏幕显示首行等控制通过操作CRT控制寄存器实现,dos/kernel/video.s中包含以下主要方法:_VIDEO_CLEAN_BUFFER显示缓存清理_VIDEO_SET_START_LINE设置显示器显示的首行_VIDEO_GET_START_LINE获取显示器显示的首行_VIDEO_SET_CURSOR设置显示器光标位置_VIDEO_CURSOR_NEXT显示器光标前移_VIDEO_CURSOR_LAST显示器光标后移_VIDEO_CURSOR_NEXT_LINE显示器光标下移_VIDEO_GET_CURSOR获取显示器光标位置_VIDEO_SCROLL_UP显示器显示区域整屏上卷_VIDEO_TOP_LAST_PAGE显示器显示区域到达缓存尾部后自动拷贝、返回到第一页,实现循环移动页面_VIDEO_PUT_CHAR在光标位置输出字符_VIDEO_PRINT_CHAR在光标位置以指定颜色输出字符_VIDEO_GET_CHAR获取光标位置的字符_VIDEO_PUT_HEX在光标位置输出十六进制数_VIDEO_PRINT_HEX在光标位置以指定颜色输出十六进制数_VIDEO_PUT_STRING在光标位置输出字符串_VIDEO_FORMAT_DIR规格化打印文件目录项信息对显示缓存的操作中,用户每次回车或者每次打印换行符后换行,当光标位置距离开始显示位置大于等于一个屏幕的分辨率时,屏幕向上卷动,显示缓存一共可容纳八页的内容,因此,当切换到第八页时,需要把当前整个屏幕的内容复制到第一页,然后清空下面的缓存并跳转到第一页,达到无限循环滚动的效果。5.2.7文件系统文件系统依据FAT12设计,因此文件系统在运行时的存在的实体有:磁盘上的物理存储、内存中的FAT表、内存中的目录表。由于FAT12下,1.44M的磁盘FAT表只占9KB的空间,因此把整个FAT表读入内存,同样,FAT12下一个目录表(根目录表或子目录表)也不比FAT表大,因此每次切换目录时把当前目录的目录表读入内存中,以方便查找。全局变量中定义了对照FAT12目录项数据结构的FDB结构体变量,同时定义了仿照MS-DOS目录列表设计的规格化输出目录信息的FNB结构体变量以实现打印目录清单,用户可通过“DIR”指令获得跟MS-DOS一样的目录显示效果,通过“CD”指令可切换当前目录;因为FAT12中,文件名大小写不区分,因此本程序中所有设计文件名的操作均在转换为大写后进行。dos/kernel/fs.s中定义了以下主要方法用于操作文件系统:_FS_FLOPPY_INIT初始化软驱_FS_GET_CHS_BY_LBA把LBA地址转换成CHS地址_FS_READ_SECT_BY_CHS根据CHS读取扇区_FS_WRITE_SECT_BY_CHS根据CHS写入扇区_FS_GET_NEXT_CLUS获取文件当前簇的下一簇簇号_FS_SET_NEXT_CLUS设置文件当前簇的下一簇簇号_FS_FIND_FILE_BY_NAME根据文件名在当前目录下搜寻文件_FS_DEL_FILE_BY_NAME根据文件名在当前目录下删除文件_FS_LOAD_DIR读取根目录表_FS_SAVE_DIR写入根目录表_FS_LOAD_FAT读入FAT表_FS_SAVE_FAT写入FAT表_FS_LOAD_CLUS读取指定簇_FS_LOAD_FILE读取整个文件到内存_FS_LOAD_SUB_DIR读取子目录表_FS_CALC_FREE_CLUS计算空闲簇_FS_CREATE_FILE创建文件_FS_WRITE_FILE写入文件_FS_ALLOC_CLUS为文件分配一系列簇_FS_TRAVERSE遍历当前目录的文件_FS_DO_TRAVERSE打印遍历的文件信息_FS_STDFN_CLEAR清空文件名缓冲区_FS_STDFN_UPPER文件名缓冲区大写转换_FS_FORMAT_DIR_ROUTE规格化目录路径(主要为用户键入的目录路径)_FS_LOAD_DIR_ARRAY读取规格化后的目录路径指向的目录因为此系统并不重要,因此没有为文件系统的所有功能建立相应的系统调用(DOS中断,而只为需要的功能实现了系统调用,因此对用户来说,可用的文件系统指令只有更改目录、打印目录文件清单、查看存储空间空闲状况、读取文件,也就是说,目前用户只有读取功能。5.2.8系统流程从被MBR加载开始,系统运作的流程图如下(根据dos/kernel/init.s绘制):操作系统启动时,依次初始化中断向量表、设置中断、初始化软驱,因为所在软磁盘为预设的FAT12文件系统,所以直接从FAT信息区读取相关信息计算FAT表及根目录表所在并装入内存,然后清空显示缓存并设置屏幕光标,打印当前目录路径。等待用户输入命令的子程序、处理用户命令的子程序定义在dos/kernel/general.s中,系统中KbStatus变量有一位控制是否缓冲键盘输入内容,一位控制是否在光标出回显输入内容,通过此显示及处理用户命令的输入,同时也用于0x21号中断。用户输入指令后,系统调用_GNL_INNER_CMD 判断是否内部指令,判断方式为调用_GNL_STR_CMP与每个内部指令进行字符串比较,判断结果为内部指令时交给相应的处理程序处理,不是外部指令则认为指令为程序文件名,若文件后缀为空或COM时,判定文件合法并开始在当前目录下查找此文件,找到则把此文件加载到内存并跳转到其入口点执行,文件不存在则提示命令无效。5.3保护模式的相关详细设计5.3.1引导实现引导程序源代码在boot.s中。由于在实模式操作系统中实现了部分文件系统相关的DOS中断,所以在引导程序中,直接调用功能号0x3D的0x21号中断查找内核文件,内核文件名为KERNEL.SYS,找到则调用功能号为0x3F的0x21号中断把内核读入到连接ELF文件时指定的入口点,相关数值定义在include/const.inc中。然后调用AX=0Xe820的0x15号BIOS中断,此中断将返回包含内存信息的数据结构,若中断返回数据结构为空,则判定获取内存信息失败或者不支持此中断,此时系统的部分内存管理相关功能无法实现。跳转到保护模式的操作过程利用了A20地址线:加载预设的GDT(GDT以全局变量形式定义在同一文件中)后,把端口号为0x92的寄存器低起第二位置位,然后把CR0寄存器最低位置位,即打开了32位地址线及保护模式,然后利用预设的段选择子强制跳转到32位代码段。进入32位保护模式后,输出提示信息等操作均不能再依赖DOS中断或BIOS中断,至此,实模式操作系统的任务终结,引导程序首先设置GS段寄存器为视频段选择子(对应段0xB8000,段界限0xFFFF,相关选择子定义在同一文件中),32位代码段设置有一下几个可供利用的子程序:_BOOT_SET_START_LINE设置屏幕起始行_BOOT_SET_CURSOR设置光标位置_BOOT_CURSOR_NEXT光标后移_BOOT_CURSOR_NEXT_LINE光标下移一行_BOOT_PUT_CHAR_AX在光标处输出字符_BOOT_PRINT_DWORD_HEX十六进制方式打印整数_BOOT_PUT_STRING打印字符串_BOOT_DISP_MEM_INFO显示内存信息_BOOT_SETUP_PAGING设置内存分页_BOOT_MEM_CPY复制内存单元*此boos.s的汇编程序子程序基本采用栈传参数,但由于ret指令均指定了参数,因而在默认GCC配置下不可在C程序中调用,否则会出现栈溢,另外从需求角度考虑,上面的子程序均针对引导程序所在的特殊环境设计,诸如屏幕显示灯功能没有考虑溢出的情况,设置分页的子程序放置页表、页目录的依据是/include/x86.inc及/const.inc中定义的相关值,此外使用了几个定义在macro.inc中的宏。根据先前所得的内存大小(若先前获取内存大小失败,则有可能不启动分页而进入进程调度系统依旧顺利运行,有可能进入调度系统后引起错误而系统崩溃,也有可能即刻出错,由于未找到不支持此检测方法的实验环境,上述后果仅为推论,本着尽力运行的原则,本系统不因无法获取内存大小而停止运行)设置分页后,系统将内存大小的值送入栈以供内核程序获取,然后强行跳转到内核的入口处。5.3.2初始化内核入口在源代码上体现为kernel/init.s的_start标号处。设计内核首先把引导程序放置在栈中的内存大小值放入全局变量memSize中,然后内核设置内核态的栈段及栈指针位置,内核栈定义在同一文件开头处,表现为bss段中一定大小的空间。然后输出提示信息到屏幕上事实上因为计算机运行速度较快,在内核不出错的情况下用户可能看不到这些提示信息,提示信息的内容包括内核开始初始化、开始初始化中断系统、开始初始化LDT等。系统首先调用init_gdt子程序(在kernel/init.c中)初始化GDT,具体操作为把先前初始化好的GDT复制到作为全局变量存放的GDT数据结构中(所有局部变量声明及定义在include/global.h及kernel/global.c中)。然后是调用init_8259A(定义在i8259.c中)编程初始化8259A,这一步包括设置主片及从片的ICW1、ICW2、ICW3、ICW4、OCW1,然后调用定义在i8259.c中的init_irq_table子程序初始化中断向量表,这一步主要是把中断向量表的所有内容指向一个虚假的中断服务程序(参考自Oranges操作系统),i8259.c中的子程序均为IRQ相关的C程序,如设计子程序put_irq_handler用于设置单个中断向量的指向,但不属于初始化的内容。中断向量表的数据结构定义在include/x86.h中,此外大部分数据结构也定义在此,中断向量表的数据实体作为全局变量存在于kernel/global.c中。中断向量表初始化后,内核读入TSS(数据结构定义在include/x86.h,全局变量声明在include/global.h),然后跳转到在kernel/main.c中书写的kernel_main函数体。5.4内核主程序所谓内核主程序,指的是kernel/main.c中的kernel_main,事实上还泛指除去初始化部分外的所有程序。跳转到kernel_main后,内核进行与进程调度相关的准备工作。首先,内核把进程表(数据结构定义在include/x86.h,全局变量声明在global.h,实体位于kernel/global.c)中所有成员的状态设置为DIE,同时为所有进程表成员分配LDT及基本栈空间。然后,内核将文本消息队列清空,并清空用户队列所有成员的进程计数。完成上述操作后,内核把PID计数变量pid_all值清零,然后建立预设任务为进程。进程建立起来后,内核为中断重入计数器、定时器计数器、当前进程指针、键盘缓冲区、进程输出窗口、屏幕光标等全局变量置初值。然后内核通过端口IO设置定时计数器的计数方式及计数值,并打开定时器中断和键盘中断、调用put_irq_handler设置相应的中断服务程序。之后,内核启动进程管理器界面,开始进程调度。5.5全局变量对于全局变量,设计让所有声明均在include/global.h ,而实体定义在kernel/global.c中,主要全局变量设计如下:memSize内存大小memFree可用内存gdt_ptrGDT指针gdt全局描述符表,描述符数据结构idt_ptrIDT指针idt中断向量表,门数据结构tssTSSp_proc_ready当前进程p_proc_active激活的进程,主要判别键盘消息接收方proc_table进程表irq_tableIRQ调用表sys_call_table系统调用表user_table用户表text_table文本消息队列cnt_reenter中断重入计数ticks定时器中断计数pid_allPID分配计数器p_task_stack进程基本栈指针slice调度时间片(单位10ms)algorithm当前调度算法pm_redraw进程管理器重绘计数器cur_user当前用户k_kb_input键盘缓冲区kb_act活动键盘缓冲区指针cwin进程输出窗口缓冲区ptrcw指向进程输出窗口缓冲区的指针debug_tmp用于调试的临时变量cmd命令缓冲区cmd_cnt命令缓冲区字符计数page当前显示的进程页tips提示信息缓冲区5.6源代码目录组织目录划分的依据:1、 所有和实模式磁盘操作系统相关的代码放在dos目录下;2、 对于实模式系统,所有编译后不占据空间的内容(预定义、宏)存放于dos/include目录的头文件中;3、 对于实模式系统,与代码本身无关的工具及其他文件存放于dos/tools中;4、 对于实模式系统,除上述两点的文件外,其余均存放于dos/kernel中5、 所有与具体过程无关、内核态及用户态均可调用、用户进程和内核
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年内分泌科糖尿病临床诊断对策考试答案及解析
- 学校四班级春季教学工作方案
- 2025年康复医学综合治疗方案设计模拟测试答案及解析
- 2025年麻醉科安全操作流程考核答案及解析
- 2025年心电图解读技能应用考核测试卷答案及解析
- 2025年肿瘤放疗放射治疗的副作用模拟测试卷答案及解析
- 新质生产力的哲学与文化思考
- 2025年心血管病学心梗后康复训练考试卷答案及解析
- 江苏新质生产力发展动态
- 新质生产力的核心体现维度
- 特种设备执法课件
- 劳务外包协议书
- 2025至2030中国草莓果酱行业发展研究与产业战略规划分析评估报告
- 2025纪念中国人民抗日战争胜利80周年心得体会五
- 2025义务教育劳动教育标准课程考试题库(含答案)
- 驾照科目四模拟考试题及答案大全
- 电商用户社区与运营创新创业项目商业计划书
- 土地增值税清算培训课件
- 2025-2030磁性材料在新能源汽车中的需求变化报告
- 农家小院课件
- 2025年营养指导员师岗位技能及理论知识考试题库(含答案)
评论
0/150
提交评论