




已阅读5页,还剩70页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一个简易操作系统的实现毕业论文目 录摘 要IABSTRACTII第1章 绪论11.1 选题背景和意义11.2 国内外研究现状21.3 主要研究内容3第2章 操作系统运行环境及运行原理简述42.1 计算机系统硬件组成简述42.1.1 总线42.1.2 I/O设备42.1.3 主存52.1.4 处理器52.2 操作系统的基本特性52.2.1并发性62.2.2共享性62.2.3虚拟性62.2.4异步性72.3 操作系统的主要功能72.3.1 处理机管理72.3.2 存储器管理72.3.3 设备管理82.3.4 文件管理82.3.5 用户接口92.3.6 程序接口9第3章 32位保护模式介绍113.1 32位保护模式简述113.1.1 存储管理机制和地址转换机制简介113.1.2 保护机制123.2 分段管理机制153.2.1 段定义153.2.2 虚拟地址到线性地址的转换机制153.2.3 虚拟地址到线性地址的转换机制所需要的数据结构和寄存器163.3 分段管理机制所依赖的两类寄存器173.3.1 控制寄存器173.3.2 系统地址寄存器183.4 系统段描述符、门描述符、任务状态段203.4.1 系统段描述符203.4.2 门描述符213.4.3 任务状态段TSS223.5 控制转移233.5.1 任务内无特权级变换的转移233.5.2 任务内不同特权级的变换243.5.3 任务间控制转移-“任务切换”26第4章 MyOS具体设计与实现284.1 MyOS的开发语言、开发流程以及开发环境简述284.2 MyOS运行原理简述294.2.1 引导扇区294.2.2 加载内核304.2.3 执行系统内核304.3 MyOS内核设计与实现314.3.1 内存管理314.3.2 定时器设计364.3.3 FIFO缓冲区设计414.3.4 基本输入输出管理444.3.5 多任务管理474.3.6 图形界面的设计544.3.7 编程接口API设计56第5章 利用MyOS的API编写程序并运行605.1 表秒计时器605.2 游戏“贪吃蛇”61第6章 总结68参考文献69致 谢702第1章 绪论1.1 选题背景和意义众所周知,一个成型的操作系统往往非常复杂,因为考虑到操作系统作为软硬件桥梁的特殊地位,其看上去比一般的软件系统更加的难以理解,因为其核心部分往往包含许多直接针对CPU,内存和I/O端口的操作。现在有许多公开源代码的操作系统,可供随时下载和阅读,但是如果没有些许实际开发的经验,往往会深陷代码的汪洋大海中,“一叶障目,不见泰山”,并且这些代码的细节之间经常互相关联,要理解起来很不容易。而动手开发一个简易的操作系统,从底层原理一步一步实现最基本和最简单的功能,到最后积累成一个简单的操作系统模型,最终达到为以后阅读大型操作系统(例如Linux)的源代码打下基础的目的。作为一个计算机系并有志于从事计算机相关行业的大学生来说,很多本科时期计算机相关科目的学习都仅仅是“纸上谈兵”,缺乏实际操作,更谈不上实际应用,这对以后的深入学习和长期发展非常不利。例如:汇编课程学习的大部分内容都使用8086/8088的16位实模式作为学习蓝本,而现在操作系统因为大内存的使用, 基本全部是32位保护模式,虽然语法等基础没有变化,但是其32保护模式的架构思想在汇编课程中却没有提及到;作为系统开发利器的c语言,其课程学习只是掌握表面语法,如果没有深入地应用,没有研究其在机器层面的原理,很多精髓都无法掌握,也就谈不上真正掌握c语言;而对于学习操作系统本身,如果没有阅读经典操作系统的源代码或者尝试去做系统开发这方面的实践,对于其诸多概念和原理是无法深入理解的,只能停留在表面理解,无法做到心中有数,就更谈不上创新了。本文试图通过这么一个“麻雀虽小,五脏俱全”操作系统的开发,达到复习并总结本科时期诸多科目的目的,包括:x86汇编语言,C语言,计算机组成原理,微机原理,数据结构,操作系统,而事实上,在基本完成毕设,撰写论文之际,对这几门课程的确有了更新更高层次的理解,很多当时只是浮于表面的概念现在都能够或多或少地落实到代码并能够亲自实现和完善,同时也初步具备了自己阅读和分析大型操作系统源代码的能力。1.2 国内外研究现状操作系统并不是与计算机硬件一起诞生的,它是在人们使用计算机的过程中,为了满足两大需求:提高资源利用率、增强计算机系统性能,伴随着计算机技术本身及其应用的日益发展,而逐步地形成和完善起来的。操作系统的发展经历了手工操作(无操作系统)、批处理系统、多道程序系统、分时系统、实时系统、通用操作系统。如今,概念意义上的操作系统和通俗意义上的操作系统差距越来越大,通俗意义上的操作系统为了方便而把最普通的包和应用程序的集合包括在操作系统内,而随着操作系统的发展,一些功能更强的“第二类”操作系统软件也被包括进去。在今天,没有图形界面和各种文件浏览器已经不能称为一个真正的操作系统了。另一方面,操作系统的发展和计算机硬件的发展紧密联系,而从计算机硬件发展的角度来看,操作系统的发展经过了大型机时代操作系统、小型机时代操作系统(Unix)和个人计算机时代操作系统。大型机时代。早期的操作系统非常多样化,生产商生产出针对各自硬件的系统。每一个操作系统都有很不同的命令模式、操作过程和调试工具,即使它们来自同一个生产商。最能 反映这一状况的是,厂家每生产一台新的机器都会配备一套新的操作系统。这种情况一直持续到二十世纪六十年代IBM公司开发了System/360系列机器。尽管这些机器在性能上有明显的差异,但是他们有统一的操作系统OS/360。OS/360的成功陆续地催化出MFT、MVT、SVS、MVS、MVS/XA、MVS/ESA、OS/390和z/OS。 小型机和UNIX的崛起。UNIX操作系统是由AT&T公司开发出来的。由于它的早期版本是完全免费的,可以轻易获得并随意修改,所以它得到了广泛的接受。后来,它成为开发小型机操作系统的起点。由于早期的广泛应用,它已经成为的操作系统的典范。不过,它始终属于AT&T公司,只有那些能负担的起许可费的企业才用得起,这限制了它的应用范围。 早期的操作系统是可以被用户软件所利用的功能的集合。一些有能力的公司发展更好的系统,但他们不支持其他公司硬件的特性。 60年代末70年代初,几种硬件支持相似的或提供端口的软件可在多种系统上运行。早期的系统已经利用微程序来在他们的系统上实现功能。事实上,除了360/165和360/168外,360/40之后的大部分360系列的机器都实行微程序设计。 个人计算机时代。Apple, DOS 和以后微型处理器的发展使计算机的应用普及至中小企及个人爱好者。而计算机的普及又推动了硬件组件公共接口的发展(如S-100,SS-50,Apple II,ISA和PCI总线),并逐渐地要求有一种“标准”的操作系统去控制它们。在这些早期的计算机中,主要的操作系统是8080/8085/Z-80 CPU用的Digital Researchs CP/M-80,它建立在数码设备公司(Digital Research)几个操作系统的基础上,主要针对PDP-11架构。在此基础上又产生了MS-DOS(或IBM公司的PC-DOS)。这些计算机在ROM(只读存储器)都有一个小小的启动程序,可以把操作系统从磁盘装载到内存。IBM-PC系列的BIOS是这一思想的延伸。自1981年第一台IBM-PC诞生以来,BIOS的功能得到不断地增强。 随着显示设备和处理其成本的降低,很多操作系统都开始提供图形用户界面。如:许多UNIX提供的X Window一类的系统、微软的Windows系统、苹果公司的Mac系统和IBM公司的OS/2等。最初的图形用户界面是由Xerox Palo Alto研究中心70年代初期研发出来的,之后被许多公司模仿,继承发展。1.3 主要研究内容1. 实现一个能够在裸机上运行的简易的操作系统。l 该操作系统在保护模式下运行,是一个多任务的操作系统,可以进行任务调度以及任务之间的通信。l 该操作系统具有自己的硬盘驱动程序,并实现一个简易的文件系统,能够实现基本的文件操作系统调用。l 该操作系统具有简单的内存管理功能。l 该操作系统使用键盘和显示器作为基本的输入输出系统。l 该操作系统具有简易的命令行风格的用户界面,实现一些主要的操作系统命令。2. 在时间允许的情况下,进一步改善用户界面,能够实现一个简易的图形用户界面,可以使用鼠标进行操作,并能够输出声音(选做)。 3. 将已完成的简易操作系统制作成软盘镜像文件,可在虚拟机中运行。4. 将已完成的简易操作系统制作成光盘在真机上运行(选做)。5. 撰写毕业论文。6. 答辩。第2章 操作系统运行环境及运行原理简述2.1 计算机系统硬件组成简述如图2-1所示,这是一个计算机系统硬件组成的简单模型。CPUALU寄存器文件PC总线接口I/O桥主存储器图形适配器磁盘控制器USB控制器磁盘鼠标键盘显示器系统总线存储器总线I/O总线扩展插槽图2-1 计算机系统硬件组成的简单模型2.1.1 总线贯穿整个系统的是一组电子管道,称作“总线”,它携带信息字节并负责在各个部件之间传递。通常总线被设计成传送定长的字节块,也就是“字”(word)。一个字的字节数(被称为“字长”)是一个基本的系统参数,在各个系统中可能不相同。现在的很多机器字长有的是4个字节(即32bit),有的是8个字节(即64bit)。12.1.2 I/O设备输入/输出设备(I/O设备)是系统与外部世界的联系通道。如图2-1所示,示例系统包括4个I/O设备:作为用户输入的键盘和鼠标,作为用户输出的显示器,以及用于长期存储数据和程序的磁盘驱动。每个I/O设备都通过一个“控制器”或者“适配器”与I/O总线相连。“控制器”和“适配器”之间的主要区别是它们的封装方式。“控制器”是置于I/O设备本身或者系统的主板上的芯片组内,而“适配器”是是一块插在主板插槽上的卡。但是这两者的任务一样的,它们都负责在I/O总线和I/O设备自检传递和翻译信息。2.1.3 主存主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序所处理的数据。从物理组成的角度来说,主存是一组动态随机存取存储器芯片组成的,从逻辑来说,主存就是一个线性的字节数组,每一个字节都有唯一的地址,这些地址从0开始。一般来说,组成程序的每条机器指令都由不同数量的字节构成,与C程序变量相对应的数据项的大小是根据类型变化的。2.1.4 处理器 中央处理单元(CPU),简称处理器,是解释和执行存储在主存中指令的引擎。处理器的核心是一个字长的存储设备,称为程序计数器(PC),在任何时刻,PC都指向主存中的某条机器语言指令。从系统通电开始,直到系统断电,处理器都一直在不断地执行程序计数器所指向的指令,再更新程序计数器,使其指向下一条需要执行的指令,这条指令不一定和上一条执行的指令相邻。处理器看上去是按照一个非常简单的指令执行模型来操作的,这个模型是由指令集结构决定的。这样的简单操作并不多,而且操作是围绕主存、寄存器文件、和算术逻辑单元(ALU)进行的。寄存器文件是一个小的但是高速的存储设备,由一些1字长的寄存器组成,每个寄存器有唯一的名字和特别的使用方式。而ALU则负责计算,计算数据和地址。下面是一些简单操作的例子,可以通过这些例子更好地了解CPU的各个部件在CPU工作的作用和工作原理。CPU在执行的要求下,可能会执行以下操作:a) 加载:把一个字节(或者一个字)从主存复制到寄存器,寄存器里原来的值被覆盖。b) 存储:把一个字节(或者一个字)从寄存器复制到主存的某个位置,以覆盖内存中该位置原来的值。c) 计算:把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存在一个寄存器中,寄存器里原来的值被覆盖。d) 跳转:从指令中抽取一个字,并将这个字复制到程序计数器(PC)中,实现跳转。e) 处理器看上去指示它的指令集结构的简单实现,但是实际上现代处理器使用了非常复杂的机制来加速程序的执行。所以,可以这样区分“处理器的指令集结构”和“微体系结构”:“指令集结构描述的是每条机器代码指令的效果”,而“微体系结构”描述的是处理器实际上是如何实现的。2.2 操作系统的基本特性操作系统的基本特性有并发性、虚拟性、共享性、异步性,其中,并发性和虚拟性是操作系统最重要的两个特性。2.2.1并发性并行性和并发性是既相似又有区别的两个概念,并行性是指两个或者多个事件在同一时刻发生,而并发性是指两个或者多个事件在同一时间间隔内发生。为了使多个程序能够在系统中并发执行,系统必须为每个程序建立进程(Process)。简单来说,进程是指在系统中能独立运行并作为资源分配的基本单位,由一组机器指令、数据和堆栈等组成,是一个能独立运行的活动实体。多个进程之间可以并发执行和交换信息。一个进程在运行时需要一定的资源,如CPU、存储空间以及I/O设备等。操作系统中程序的并发执行将使系统复杂化,以至于在系统中必须增设若干新的功能模块,分别用于对CPU、内存、I/O设备以及文件系统等重要资源进行管理,并控制好系统中各个进程的运行。长期以来,进程都是操作系统中可以拥有资源并作为独立运行的基本单位。当一个进程因故不能继续运行,操作系统便调度另一个程序运行。但是由于进程拥有自己的资源,故使得调度付出的代价非常大,所以人们引入比进程更小的单位线程。通常一个进程中包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的OS中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统转,所以对地进行调度所花费的系统资源很少,从而能够更高效地提高系统内多个程序并发执行的程度。2.2.2共享性在操作系统中,所谓共享,是指系统中的资源可供内村中并发执行的进程共同使用,相应的,把这种西苑共同使用成为资源共享,或者是资源复用。由于资源的属性不同,进程对资源的复用方式也不同,主要实现资源共享的方式有以下两种:互斥共享方式和同时访问方式。2.2.3虚拟性操作系统中的所谓“虚拟性”,是指通过虚拟技术把一个物理实体变为若干逻辑上的对应物。物理实体是实际存在的,而逻辑对应物是现对于用户来说的,是用户感觉到的可以使用的东西。这个技术的实现主要有两种途径,时分复用技术和空分复用技术。通俗地理解,时分复用技术就是将物理设备的使用机会按时间划分为许多小段,各个用户(或进程)在调度进程的调度下,交替使用这些使用设备的机会,常见的例子有:系统通过对处理机进行分片,然后把时间片分配给各个进程,实现了把一台物理上的处理机虚拟位多台逻辑上的处理机,从而在每台逻辑处理机上运行一道程序。通常把用户感觉到的处理机成为虚拟处理机。而空分复用技术则被用来提高存储空间的利用率,常见的有虚拟磁盘技术和虚拟存储器技术。2.2.4异步性在多道程序下允许多个进程并发执行,但是只有进程获得所需的资源后方能执行。在单处理机环境下,由于系统只有一台处理机,所有每个时刻只能有一个进程运行,其他的必须等待处理机。当正在执行的进程提出某种资源要求时,此项资源如果得不到满足,这个进程就无法继续下去。可见一个进程在系统中的运行不可能是“一帆风顺”的,而是以“走走停停”的方式运行,而且这种方式在进程运行之前是不可预见的,具有随机性,并且由于各个任务、系统、机器的之间的差异,进程通常以人们不可预知的速度向前推进,这就是进程的“异步性”。为了应对这种进程的“异步性”,为了让系统中的各个进程都不出错地执行完自己的任务,操作系统必须具备完善的进程同步机制,使得进程之间能够协调地利用好共享的资源,获得最后想要的结果。2.3 操作系统的主要功能操作系统的主要任务,是为多道程序的运行提供良好的运行环境,以保证运行在系统中的各个进程能够有序、高效地运行,并能够最大程度地提高系统中各项资源的利用率,而考虑到现在的系统和人之间的交互愈发频繁,操作系统还需提供给用户的使用接口和给程序员的编程接口。所以,操作系统应该具备这样几个主要功能:处理机管理,存储器管理,设备管理,文件管理,用户接口和程序接口。而随着网络的普及,现代操作系统一般都具备网络功能。2.3.1 处理机管理在未引入线程的系统中,处理机的分配和运行都是以进程为基本单位,因而对处理机的管理可以归纳为对进程的管理:创建和撤销进程(进程控制),对各个进程的运行进行协调(进程同步),进实现进程之间的信息交换(线程通信),按照一定的算法将处理机的处理时间分配给进程。其中进程同步包括“进程互斥”和“进程同步”,“进程互斥”是指各个进程在对临界资源进行访问时,应采用互斥方式,“进程同步”是指相互合作去完成某项任务的进程之间,必须遵循某种顺序,操作系统中有同步机构对它们的执行次序加以协调。2.3.2 存储器管理存储器管理管理的主要任务是为多道程序的运行提供良好的环境,方便用户使用存储器,提高存储器的利用率以及能从逻辑上扩充内存。主要功能包括:内存分配、内存保护、地址映射、内存扩充。其中,为了实现内存分配,在内存分配机制中应该有这样的设计和功能:用于实现内存分配的数据结构,内存分配功能,内存回收功能。而内存保护的的主要任务是保证让每个程序都只能在属于自己的内存空间运行,不能访问到别的程序的空间,更不能够访问到操作系统的内存空间。此时,让内存保护得以实现,必须设置合理的内存保护机制。内存映射功能主要是实现将程序的“逻辑地址”或“相对地址”映射为内存的“物理地址”。内存扩充并非是扩大物理内存的实际容量,而是借助于虚拟存储技术,从逻辑上扩充内存容量,使用户能够使用的内存容量大于实际的物理内存容量。内存扩充机制主要包括:请求调入功能和置换功能。2.3.3 设备管理设备管理用于管理计算机系统中所有的外围设备,而设备管理的主要任务是:完成进程提出的I/O请求;为进程分配其所需要的I/O设备;提高CPU和I/O设备的利用率。为了实现上述任务,设备管理应具备缓冲管理、设备分配、设备处理和虚拟设备等功能。缓冲管理集中要解决的矛盾是,CPU运行的高速型和外围设备的低速性。而随着CPU速率的不断提高,而I/O又具备一定的确定性,所以这个矛盾更加严重地降低了CPU的利用率。为了提高CPU的利用率,可以在I/O设备和CPU之间设置缓冲区,用于实现提高CPU的利用率和系统吞吐量。设备分配的任务是根据进程的I/O请求和资源情况,按照某种分配策略,为进程分配所需要的设备。如果在I/O设备和CPU之间还存在着设备控制器和I/O通道,还要未分配出去的设备分配对应的控制器和通道。为了实现设备分配,系统中应设置设备控制表、控制器控制表等数据结构,用于记录设备及控制器的标示符和状态,系统应该以这些数据结构的实时数据为依据,了解制定设备当前是否可用,是否忙碌,以供进行设备分配。设备处理其实就是设备驱动程序,基本任务是用于实现CPU和设备控制器之间的通信,即由CPU向设备控制器发I/O命令,要求其完成指定的I/O操作;反之,由CPU接受从控制器发来的中断请求,并迅速给予响应和相应的处理。2.3.4 文件管理在现代计算机系统中,一般将程序和数据以文件的形式存储在磁盘或者磁带上,供所有的或者某些指定的用户使用。为了达到这个目的,操作系统必须配置文件管理机构,文件管理的主要任务是对用户文件盒系统文件进行管理,以方便用户使用,同时需要保证文件的安全性。所以,文件管理的功能主要有:对文件存储管理空间的管理、目录管理、文件的读/写管理、文件的共享与保护。为了实现文件存储空间的管理,系统应设置相应的数据结构,用于记录文件存储空间的使用情况,以供分配存储空间时作为参考。系统还应具有对存储空间进行分配和回收的功能。为了提高存储空间的利用率,通常采用离散分配方式对存储空间进行分配,以减少外村零头,以盘块为基本分配单位,盘块的大小通常为18KB。为了实现用户能方便的在外存上找到自己的文件,通常由文件系统为每个文件建立一个目录项。目录项包括文件名、文件属性、文件在磁盘上的物理位置等等描述文件的信息。而若干个目录项又可以构成一个目录文件。目录管理的主要任务是为每个文件建立目录项,并对所有的目录项进行有效的管理,以方便按名存取,即用户只需要提供文件名就可以对该文件进行存取。文件的读/写管理实际上是简化用户对文件的操作,当用户想要打开、添加、修改、删除一个文件时,操作系统先根据用户给出的文件名去检索文件目录,从中获得文件在外存的位置,然后利用读/写指针,对文件进行读或写。文件的保护是系统为用户的文件提供保护,以达到这几个目标:防止没有权限的用户存取文件,防止冒名顶替存取文件,防止以不正确的方式使用文件。2.3.5 用户接口用户接口是提供给用户使用的接口,用户可以通过该接口取得操作系统的服务。设置用户接口的目的是为了方便用户直接或者间接地控制自己的作业,用户可以通过这个接口向作业发出命令以控制作业的运行。用户接口分为联机用户接口和脱机用户接口,联机用户接口又分为命令行接口和图形接口。命令行接口是由一组键盘操作命令组成,当用户在终端或者控制台上每次键入一条命令后,系统便立即转入命令解释程序,对这条命令加以解释并执行该命令。图形接口是为了解决用户必须熟记各种命令的名字和格式的问题而生的,其采用图形化的操作界面,用非常容易识别的各种图标来将系统的各项功能、各种应用程序和文件形象逼真地表现出来,用户不需要用键盘输入命令,只需要用鼠标点击就能够控制操作系统。联机用户接口都能够实现用户与进程的实时交互,而脱机用户接口则是为批处理作业的用户提供的,故也可以称作是批处理用户接口。批处理作业的用户不能直接与自己的作业交互作用,只能委托系统代替用户对作业进行控制和干预。2.3.6 程序接口程序接口是为用户程序在执行中访问系统资源而设置的,是用户所编制的程序取得操作系统服务的唯一途径。程序接口的本质是一组系统调用,每一个系统调用都是一个能完成特定功能的子程序,每当应用程序要求OS提供某种服务时,便调用具有相应功能的系统调用。早期版本的系统调用都是用汇编语言提供的, 只有在用汇编语言书写的程序中才能直接使用系统调用;但在高级语言以及C语言中,玩玩提供了与各系统调用一一对应的库函数,这样应用程序就可以通过调用对应的库函数来来使用系统调用。与早期操作系统系统调用不同的是,近几年的操作系统中,系统调用本省已经采用C语言进行编写,并以函数的形式提供,所以,在C语言编制的程序中,可以直接使用系统调用。第3章 32位保护模式介绍80386以上的X86处理器有两种工作模式:实模式和保护模式。尽管实模式下的80386的功能要大大超过先前处理器(8086/8088,80186,80286),但只有在保护模式下,80386才能真正发挥作用。3.1 32位保护模式简述32位保护模式相对于实模式的优势体现在这几个方面:在保护模式下,80386处理器的32根地址线全部有效,可寻址达到4GB的物理地址空间;保护模式所独有的存储器分段管理机制和可选的存储器分页管理机制,前者为存储器的共享和保护提供了硬件支持,后者为实现虚拟存储器提供了硬件支持;支持多任务,在保护模式下,80386处理器给予系统开发者极大便利,可以快速地进行任务切换和保护任务环境;80386处理器有4个特权级和完善的特权检查机制,既能高效的实现资源共享,又能保证代码及数据的安全和保密,以及任务之间的隔离;在保护模式下可以用虚拟8086方式来执行8086程序。3.1.1 存储管理机制和地址转换机制简介为了对存储器中的程序和数据实现保护和共享提供硬件支持,80386在保护模式下采用了扩充的存储器分段管理机制;为了对实现虚拟存储器提供硬件支持,80386在保护模式下提供了可选的存储器分页管理机制。这些存储管理机制有80386的存储器管理部件MMU实现。由于本文实现的操作系统没有使用更高级更复杂的分页管理机制,所以在这里重点介绍与分段有关的地址转换,不详细介绍分页管理机制。保护模式下的虚拟存储器由大小可变的存储块构成,这样的存储块称为段。80386采用称为描述符的数据来描述段的位置、大小、使用情况以及其他属性。虚拟存储器的地址(即“逻辑地址”)由指示描述符的“选择子”和“偏移地址”两部分构成,这样的地址集合称为“虚拟地址空间”。很显然,只有在物理存储器中的程序才能运行,只有在物理存储器中的数据才能访问,一切的地址都要映射到物理地址,二维的虚拟地址(“选择子”+“偏移地址”)必须转换成为一维的物理地址(实际内存的地址)。由于物理地址远小于虚拟地址,所以只有一部分虚拟地址空间能真正映射到物理存储器。因为每一个任务都有一个虚拟地址空间,而为了避免多个并行任务的多个虚拟空间直接映射到一个物理地址空间,所以,采用线性地址空间隔离虚拟地址空间和物理地址空间。线性地址空间和物理地址空间对等,大小一样。如图3-1所示。80386分两步实现虚拟地址空间到物理地址空间的映射。第一步是通过虚拟地址中的“选择子”在描述符表GDT中查询得到段描述符,在段描述符中记载着这个段的段起始地址(在8086的实模式下,段起始地址是直接存储在段寄存器中),再结合“偏移地址”计算得到线性地址。第二步是可选的,如果采用分页机制,就用MMU来将线性地址映射为物理地址,从而寻址结束。所以,如果没有采用分页管理机制,线性地址空间等于物理地址空间。选择子(16位):偏移量(32位)分段管理机制32位虚拟地址线性地址分页管理机制32位物理地址不启用分页管理机制图 3-1 虚拟地址空间到物理地址空间的映射3.1.2 保护机制为了支持多任务,对各任务实施保护是必要的。保护机制必须有效地实现不同任务之间的保护和同一任务内的保护3.1.2.1不同任务之间的保护不同任务之间的保护中的一个重要方面是应用程序之间的保护。是通过把每个任务放置在不同的虚拟地址空间的方法来实现任务与任务之间的隔离,达到应用程序之间保护的目的。虚拟地址到物理地址的映射函数在每个任务中单独定义,随着任务的切换,映射函数也随之切换,这样的机制使得任务A和任务B拥有相同的虚拟地址空间,但是映射到物理空间后,就是两块独立不相干的区域。这样,两个不同的任务,尽管虚拟存储单元地址相同,但实际的物理存储单元地址不同。3.1.2.2同一任务内的保护实现在同一任务内的保护需要达到那些目标?怎样实现在同一任务内的保护?为什么要实现在同一任务内的保护?实现在同一任务内的保护,主要目标是区分不同的段的特权级。在一个任务内,可以定义四种执行特权级别,用于限制对任务中段进行访问。一般会按照不同的段中的数据和代码的可信任程度,给予不同的段不同的特权级。例如:具有最高特权级别的数据,只能由最可信任的代码访问;给不重要的数据段和代码段分配比较低的特权级别;具有最低特权级别的数据,可以被任何特权级的代码访问到。特权级的典型用法如图3-2所示,把操作系统的核心放在0级,操作系统的其余部分(操作系统外围程序)放在1级,中间软件(数据库和办公软件)放在2级,用户的应用程序放在3级。这样安排,使得在0级的操作系统核心有权利访问所有特权级中的所有数据段和代码段,在1级的操作系统其余部分有权利访问除了0级意外的所有代码段和数据段,而在3级中的应用程序只能访问本任务的数据段和代码段。图 2-2 四个特权级的分配Data ofKernelCode ofKernelData ofOSCode ofOSData ofOSCode ofOSData ofProgram 1Code ofProgram1Code ofProgram 2Data ofProgram 23.1.2.3实现“同一任务内的保护”所依赖的机制在程序运行中,32位保护模式依靠CPL(current privilege level)、DPL(descriptor privilege level)和RPL(requestor privilege level)三种数据结构来实施任务内的特权级保护,这三种数据结构如图3-3所示。图 3-3 CPL、DPL、RPL的数据结构示意图这些数据结构的具体解释如下:a) 当前特权级CPL。当前代码段的选择子中,最低2位为特权级CPL,这表示当前正在运行的程序的特权级。CPL是程序本身的性质所决定的:如果是“操作系统和操作系统核心程序”(如存储器管理程序、任务调度程序、访问控制程序),那么,特权级为0;如果是“操作系统外围的系统程序”(如缓冲区分配程序、外设驱动程序),那么,特权级为1;如果是一些“应用软件”(如数据库、办公软件),那么、特权级为2;如果是用户程序,那么特权级为3。b) 描述符特权级DPL。每个段的段描述符中,用描述符特权级DPL表示此段的特权级。程序运行时,数据段的DPL在每次被访问时受到检查,以确定程序是否有权访问该数据段。c) 请求特权级RPL。数据段的段选择子中的最低2位为请求特权级RPL,数据段总是被代码访问的,此时RPL将受到检测,以确定此次访问是否合法。只有当代码段的CPL的级别不低于RPL的时候,才能是访问成功进行。数据段中设置RPL是为了防止特权级低的程序访问特权级高的数据段。一般情况下,数据段选择子中的RPL和此段描述符中的DPL是相等的,由于在程序运行中,要访问数据时,总是先装入选择子,再由选择子找到段描述符,然后由段描述符找到对应段,所以,提前在装入选择子这一环用RPL进行特权级保护检查,使得保护机制更加快捷。当一个程序访问数据段的时候,其CPL的级别必须高于或等于被访问段的DPL。例如,CPL为0的代码段对任何特权级的数据段都可以访问,而CPL为1的代码段只能访问特权级为1、2、3的数据段。在程序运行过程当中,除了数据读写操作时进行界限检查之外,当遇到转移指令JMP、中断指令INT、电泳指令CALL、和返回指令RET时,可能因为涉及到不同的段,所以也会进行界限检查。如果是段内转移,则保护模式会检查这些指令的目标地址是否超出了当前代码段的界限,如果是段间转移,则会对目标端的特权级进行检查,只有CPL级别低于或者等于目标端的DPL时,才能实现转移,也就是说,转移,总是往高级别或者相同级别的目标段进行。如此一来,出现了CPL和DPL状态不同的情况,这种情况产生在异常中断和调用INT指令、CALL指令的时候,此时,CPL改成DPL的值,CPL数值减小,级别提高。但是,当执行RET、IRET指令时,情况和执行CALL、INT指令相反,此时,CPL的数值可能会增大,级别降低。最后,需要注意的是:a) DPL是“段描述符”提供的,每个段都对应着一个DPL,而CPL和RPL是“选择子”提供的。b) CPL对应于代码段,而RPL对应于数据段c) 一个代码段处于运行过程中,没有发生段间转移时,CPL总是等于DPLd) CPL为0时,可以访问任何RPL级别的数据段,CPL为1时,只能访问RPL为1、2、3的数据段。以此类推。3.2 分段管理机制上面讲到存储管理机制和虚拟地址映射物理地址机制,那在32位保护模式下,操作系统具体怎样实现这些机制?这节的主要内容就是:介绍保护模式下的段定义,以及怎样实现由“段选择子”+“段内偏移”构成的“二维虚拟地址”转换为“一维的线性地址”。3.2.1 段定义段是实现虚拟地址到线性地址转换机制的基础。在保护方式下,每个段由这三个参数定义:段基地址,段界限,段属性。通俗点说,“段基地址”规定了这个段在“线性地址空间”中的开始地址,“段界限”规定这个段的大小,值得注意的是,在80386保护模式下,段界限仅仅由20位来表示,大家都知道,20位能表达的最大地址是1M,如果是以1B作为单位的话,一个段的最大地址范围是1M*1B = 1MB,显然无法满足程序的需求,而且也体现不出保护模式相对于实模式的优越性,为了解决这个问题,在“段属性”(定义段的三个元素之一)中用一位“粒度位”(用符号G标记)来规定20位段界限的单位,如果G=0表示以1B作为单位,段大小的范围为1B-1M;如果G=1表示以4KB为单位,段大小的范围为4KB-4GB。“段属性”规定了段的主要特性,例如上面提到的“粒度位”,以及段的特权级,这里不详细介绍。3.2.2 虚拟地址到线性地址的转换机制由上一个小节可知,由“二维的虚拟地址”到“一维的线性地址”的转换机制可由图3-4所示。图 3-4 由虚拟地址到线性地址的转换机制3.2.3 虚拟地址到线性地址的转换机制所需要的数据结构和寄存器3.2.3.1段描述符上面讲到三个参数可以定义一个段,这三个参数由一个8字节 = 64位的数据结构保存,这个数据结构称作“段描述符”(顾名思义),其中32位表示“段基地址”,20位表示“段界限”,剩下的12位表示“段属性”。为了和上一代的机器兼容,32位的“段基地址”和20位的“段界限”并非连续存放,具体怎样存放,“段属性”中哪一位代表什么,限于论文篇幅,这里不详细介绍。3.2.3.2(全局和局部)段描述符表一个任务会涉及到多个段,每个段需要一个描述符来描述,为了方便管理和查询,80386将描述符组织成线性表,由描述符组成的线性表称作“描述符表”。在80386中一共有三种“描述符”表:全局描述符表GDT(Global Descriptor Table),局部描述符表LDT(Local Descriptor Table),中断描述符表IDT(Interrupt Descriptor Table)。在整个系统中,全局描述符表GDT和中断描述符表IDT只有一张,局部描述符表由多张,每个任务可以有一张自己的LDT。每个描述符表本身形成一个特殊的数据段,这样的特殊数据段最多可以包含8096个描述符。每个任务的“局部描述符表LDT”含有该任务自己的代码段、数据段、和堆栈段的描述符,也包含该任务所使用的一些“门描述符”,如:“任务门”和“调用门”门描述符。随着任务的切换,系统当前的“局部描述符表LDT”也随之切换。“全局描述符表GDT”含有每一个任务都有可能或者可以访问的段的描述符,通常包括操作系统所使用的代码段、数据段、堆栈段的描述符,也包含多种特殊数据段描述符,例如各个用于描述任务LDT的特殊数据段。在任务切换时,不切换GDT。通过LDT可以使各个任务私有的各个段与其他任务隔离,从而达到受保护的目的。通过GDT可以使各个任务都需要使用的段能够被共享。3.2.3.3段选择子由上面的内容可知“虚拟地址”是“二维”的,那是哪两个“维”呢?“虚拟地址”是由那两个东西组成的呢?在实模式中,这两个东西一个是保存在段寄存器(CS,DS,SS。)中的段地址,另一个是段内偏移地址,此时线性地址 = (段寄存器)*16 + 段内偏移。而在保护模式中,“段选择子”代替了保存在段寄存器(CS,DS,SS。)中的段地址。通俗点说,“段选择子”是一个索引,一个指针,它可以帮助操作系统在“段描述符表”中查找到定义这个段的“段描述符”,从而得到“段描述符”中的“段基地址”,其实到了这个时候,这个“段描述符”中的“段基址地址”,就和实模式中的段寄存器(CS,DS,SS。)中的段地址有点相似了,但是不同点在于计算线性地址的方式,实模式中,线性地址 = (段寄存器)*16 + 段内偏移,而保护模式中,线性地址 = 段基地址 + 偏移。“段选择子”长16位,第0位和第1位十请求特权级RPL(Request Privilege Level)用于特权检查;第2位是引用描述符表指示位TI(Table Indirector),TI = 0指示从全局描述符表GDT中读取段描述符,TI = 1指示从局部描述符表LDT中读取段描述符;第3至15位一共13位用来指示“描述符索引”,由于每个描述符在描述符表中占据8个字节,所以,如果屏蔽掉段选择子的低三位(即令低三位为0),刚好可以得到当前描述符相对于第一个描述符的偏移地址,这或许是安排选择子高13位作为“描述符索引”的原因。一共有13位作为选择子的“描述符索引”,所以一个描述符表中,最多有8096个描述符。所以,总结来说就是,“二维的虚拟地址” = “选择子:偏移地址”,“选择子”+“段描述符表”得到“段描述符”,从“段描述符”得到“段基地址”,由“段基地址”和“偏移地址”就可以就算出线性空间中的“一维的线性地址”。3.2.3.4段描述符高速缓冲寄存器从上述叙述可知,在保护模式下,每一次由“虚拟地址”映射为“线性地址”时,都必须使用“选择子”查询“描述符表”来得到段描述符中的基地址。为了避免每一次存储器访问时,都要访问描述符表,从80286开始,每个段寄存器都配有一个高速缓冲寄存器,称之为“段描述符高速缓冲寄存器”或称为“描述符投影寄存器”,这个寄存器的存在对程序员来说是不可见的。其工作原理为:每当把一个“选择子”装入到某个段寄存器时,处理器自动从描述符表中取出相应的描述符,把描述符中的信息装入到对应的高速缓冲寄存器中,此后在对该段访问时,处理器都是用对应高速缓冲寄存器中的描述符信息,而不用再从描述符表中取描述符。而绝大多数情况下,对存储器的访问都是在“对应选择子”装入到段寄存器之后进行的,所以,使用段描述符高速缓冲寄存器可以得到很好的执行效果。3.3 分段管理机制所依赖的两类寄存器上面的内容对80386的保护模式下的分段管理机制做了详细说明,但是有几点疑问,CPU靠什么来控制这些机制的实施?例如,怎么设置CPU,让其运行在实模式下或者保护模式下?还有,上面提到了可以保存8096个描述符的描述符表,这个表到底在内存的哪里,CPU怎么找到保存这个表的特殊数据段?要回答这些问题,必须搞明白的一点是,为了使得分段管理机制的实施,CPU必须知道人们到底想让它“干什么”和“怎么干”。而通过设置“控制寄存器”,可以让CPU知道自己“走什么路”,按什么方式运行;通过设置“系统地址寄存器”,可以给予CPU一些实施这个机制必须的数据。下面就对这两类寄存器进行详细说明。3.3.1 控制寄存器控制寄存器包含四个32位的寄存器,分别命名为CR0,CR1,CR2,CR3。CR0的第0位为PE位,第31位为PG位,这两个控制位控制分段和分页管理机制,所以称之为“保护控制位”。PE控制分段管理机制,PE = 0,处理器运行于实模式,PE = 1,处理器运行于保护模式。PG控制分页管理机制,PG = 0,禁用分页管理机制,此时“线性地址”等同于“物理地址”,PG = 1,启用分页管理机制,此时“线性地址”通过内存中的MMU转化为“物理地址”。CR0中的第1至4位为MP(算数存在位)、EM(模拟位)、TS(任务切换位)、ET(扩展类型类),它们共同控制浮点协处理器的操作,所以称为“协处理器控制位”。CR1被保留,供以后的开发的处理使用,在80386中不能使用CR1,否则引起无效指令操作异常。CR2和CR3用于分页管理机制使用,由于这次的操作系统没有用到分页管理,限于论文篇幅,这里不做介绍。3.3.2 系统地址寄存器 “全局描述符表GDT”、“局部描述符表LDT”和“中断描述符表IDT”在上文已经有所有讲述,这三个描述符表是保护模式下非常重要的数据结构,它们被保存在特殊数据段里,但是操作系统怎样快速地定位,找到它们,这就用到了“系统地址寄存器”。一般来说,要定义一个段需要三个参数,段基地址、段大小、段属性,而由于这三个表太过于“著名”且“地位特殊”,已经不需要太多的“段属性”来对他们进行说明,所以,“系统地址寄存器”只负责告知这些特殊数据段的基地址和界限(即大小)。这些“系统地址寄存器”包括“全局描述符表寄存器GDTR”(GDT Register)、“局部描述符表寄存器LDTR”(LDT Register)、“中断描述符表寄存器IDTR”(IDT Register)、任务状态段寄存器TR(TTS Register)。图 3-5 控制寄存器和系统地址寄存器3.3.2.1 全局描述符表寄存器GDTR如图3-6所示,GDTR长48位,其中高32位作为基地址,低16位作为界限。GDTR中的段界限以1B为单位,由于段选择子中用13位作为描述符索引,所以一个描述符表最多有2的13次方个段描述符,每个段描述符占用8B空间,所以,用16位作为界限足够。通常对于含有N个描述符的描述符表的段界限应该设置为8*N 1。图 3-6 GDTR中的基地址和界限3.3.2.2 局部描述符表寄存器LDTR局部描述符表寄存器LDTR规定当前任务使用的局部描述符表LDT,如图所示,由程序员可见的16位的寄存器和32位的程序员不可见的高速缓冲寄存器组成。实际上,每个任务的局部描述符表作为系统的一个特殊段,由一个全局描述符描述(当然其实没有“全局描述符”这个说法),这个全局描述符存放在GDT中。在初始化或任务切换过程中,把指示描述当前任务或者切换后任务LDT的描述符的选择子装入到LDTR(即上面提到的程序员可见的16位的寄存器),处理器根据装入LDTR可见部分的选择子,从GDT中去除对应的描述符,并把LDT的基地址和界限等信息保存到LDTR对应的高速缓冲寄存器中(32位的程序员不可见的高速缓冲寄存器)。随
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025浙江金华智园至尚资产经营有限公司招聘17人笔试参考题库附带答案详解
- 2025济钢集团有限公司校园招聘(48人)笔试参考题库附带答案详解
- 2025江西新鸿人力资源服务有限公司招募见习人员3人笔试参考题库附带答案详解
- 2025新疆兵团金融发展服务中心招聘事业单位工作人员(1人)笔试历年参考题库附带答案详解
- 2025年浙江金华市轨道交通集团运营有限公司第一批招考4人笔试参考题库附带答案详解
- 2025年国网中兴有限公司高校毕业生招聘(第二批)调剂笔试参考题库附带答案详解
- 2025山东中胶阿胶有限公司招聘19人笔试参考题库附带答案详解
- 2025四川自贡华荟文化产业发展有限公司招聘3人笔试参考题库附带答案详解
- 2025中国华冶科工集团有限公司校园招聘280人笔试参考题库附带答案详解
- 地铁工程安全培训内容课件
- 农产品直播带货策略
- 2024年化学检验员(中级工)技能鉴定考试题库(附答案)
- 2021版十八项医疗质量安全核心制度附流程图
- 精神科护理饮食宣教
- 人教版六年级数学上册第一单元测试卷
- 函数图像 课件-2025届高三数学一轮复习
- 2024北师大版新教材初中数学七年级上册内容解读课件(深度)
- JT-T-155-2021汽车举升机行业标准
- 应收应付明细表模板
- 三年级上册语文《总也倒不了的老屋》
- 沪科黔科版综合实践活动四年级上册全册教学设计教案
评论
0/150
提交评论