实时操作系统Vxworks与通用操作系统Linux的比较+实模式等三种模式 DMA
2016-07-01 16:06
567 查看
一个好的实时操作系统需要具备以下功能(必须但非充分):
*多任务和可抢占的;
*任务具有优先级;
*操作系统具备支持可预测的任务同步机制;
*支持多任务间的通信;
*操作系统具备消除优先级转置的机制;
*存储器优化管理(含ROM的管理);
*操作系统的(中断延迟、任务切换、驱动程序延迟等)行为是可知的可预测的。这是指在
全负载的情形下,最坏反应时间可知;
*实时时钟服务;
*中断管理服务。
实时操作系统所遵循的最重要的设计原则是: 采用各种算法和策略,始终保证系统行为的可预测性。可预测性是指在系统运行的任何时刻,在任何
情况下,实时操作系统的资源调配策略都能为争夺资源(包括CPU、内存、网络带宽等)的多个实时任务合理地分配资源,使每个实时任务的实时性要求都能得到 满足。与通用操作系统不同,实时操作系统注重的不是系统的平均表现,而是要求每个实时任务在最坏情况下都要满足其实时性要求,也就是说,实时操作系统注重
的是个体表现,更准确地讲是个体最坏情况表现。
实时系统最关键的部分是实时多任务内核。它的基本功能包括多任务管理、定时器管理、
存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理、信号量管理等。这
些管理功能是通过内核服务函数形式交给用户调用的,也就是实时操作系统的API。
================vxworks和linux的比较===========================
关于各种周期: http://lionwq.spaces.eepw.com.cn/articles/article/item/17638
============================
嵌入式实时系统中采用的操作系统称为嵌入式实时操作系统,它既是嵌入式操作系统,又是实时操作系统。
作为一种嵌入式操作系统,它具有嵌入 式软件共有的可裁剪、低资源、占用、低功耗等特点; 而作为一种实时操作系统,它与通用操作系统(如Windows、Unix、Linux等)相比有很大的 差别,下面我们通过比较这两种操作系统之间的差距来描述实时操作系统的主要特点。
最常用的操作系统是通用操作系统,通用操作系统是由分时操作系统发展而来,大部分都支持多用户和多进程,负责管理众多的进程并为它们分配系统资源。
分时操作系统的基本设计原则是:尽量缩短系统的平均响应时间并提高系统的吞吐率,在单位时间内为尽可能多的用户请求提供服务。由此可以看出,分时操作系统注重平均表现性能,不注重个体表现性能。如对于整个系统来说,注重所有任务的平均响应时间而不关心单个任务的响应时间,对于单个任务来说,注重每次执行的平均响
应时间而不关心某次特定执行的响应时间。
通用操作系统中采用的很多策略和技巧都体现出了这种设计原则,如虚存管理机制中由于采用LRU等页替换算法,使得 大部分的访存需求能够快速地通过物理内存完成,只有很小一部分的访存需求需要通过调页完成,但从总体上来看,平均访存时间与不采用虚存技术相比没有很大的提高,同时又获得了虚空间可以远大于物理内存容量等好处,因此虚存技术在通用操作系统中得到了十分广泛的应用。
而对于实时操作系统,前面已经提到,它除了要满足应用的功能需求以外,更重要的是还要满足应用提出的实时性要求,而组成一个应用的众多实时任务对于实时性 的要求是各不相同的,此外实时任务之间可能还会有一些复杂的关联和同步关系,如执行顺序限制、共享资源的互斥访问要求等,这就为系统实时性的保证带来了很 大的困难。
由于实时操作系统与通用操作系统的基本设计原则差别很大,因此在很多资源调度策略的选择上以及操作系统实现的方法上两者都具有较大的差异,这些差异主要体现在以下几点:
(1)任务调度策略:
通用操作系统中的任务调度策略一般采用基于优先级的抢先式调度策略,对于优先级相同的进程则采用时间片轮转调度方式,用户进程可以通过系统调用动态地调整自己的优先级,操作系统可根据情况调整某些进程的优先级。
实时操作系统中的任务调度策略目前使用最广泛的主要可分为两种,一种是静态表驱动方式,另一种是固定优先级抢先式调度方式。
静态表驱动方式是指在系统运行前工程师根据各任务的实时要求用手工的方式或在辅助工具的帮助下生成一张任务的运行时间表,这张时间表与列车的运行时刻表类 似,指明了各任务的起始运行时间以及运行长度,运行时间表一旦生成就不再变化了,在运行时调度器只需根据这张表在指定的时刻启动相应的任务理即可。静态表 驱动方式的主要优点是:
·运行时间表是在系统运行前生成的,因此可以采用较复杂的搜索算法找到较优的调度方案:1
·运行时调度器开销较小;·系统具有非常好的可预测性,实时性验证也比较方便;
这种方式主要缺点是不灵活,需求一旦发生变化,就要重新生成整个运行时量间表。由于具有非常好的可预测性,这种方式主要用于航空航天、军事等对系统的实时性要求十分严格的领域。
固定优先级抢先式调度方式则与通用操作系统中采用的基于优先级的调度方式基本类似,但在固定优先级抢先式调度方方式中,进程的优先级是固定不变革的,并且 该优先级是在运行前通过某种优先级分配策略来指定的。这种方式的优缺点与静太表驱动方式的优缺点正好完全相反,它主要应用于一些较简单、较独立的嵌入式系 统,但随着调度理论的不断成熟和完善,这种方式也会逐渐在一些对实时性要求十分严格的领域中得到应用。目前市场上大部分的实时操作系统采用的都是这种调度 方式。
(2)内存管理:
关于虚存管理机制在上面已经进行了一些分析。为解决虚存给系统带来的不可预测性,实时操作系统一般采用如下两种方式:
·在原有虚存管理机制的基础上增加页面锁功能,用户可将关键页面锁定在内存中,从而不会被swap程序将该页面交换出内存。这种方式的优点是既得到了虚存 管理机制为软件开发带来的好处,又提高了系统的可预测性。缺点是由于TLB等机制的也是按照注重平均表现的原则进行的,因此系统的可预测性并不能完全得到 保障;
·采用静态内存划分的方式,为每个实时任务划分固定的内存区域。这种方式的优点是系统具有较好的可预测性,缺点是灵活性不够好,任务对存储器的需求一旦有变化就需要重新对内存进行划分,此外虚存管理机制所带来的好处也丧失了。
目前市场上的实时操作系统一般都采用第一种管理方式。
(3)中断处理:
在通用操作系统中,大部分外部中断都是开启的,中断处理一般由设备驱动程序来完成。由于通用操作系统中的用户进程一般都没有实时性要求,而中断处理程序直接跟硬件设备交互,可能有实时性要求,因此中断处理程序的优先级被设定为高于任何用户进程。
但对于实时操作系统采用上述的中断处理机制是不合适的。首先,外部中断是环境向实时操作系统进行的输入,它的频度是与环境变化的速率相关的,而与实时操作 系统无关。如果外部中断产生的频度不可预测,则一个实时任务在运行时被中断处理程序阻塞的时间开销也是不可预测的,从而使任务的实时性得不到保证;如果外 部中断产生的频度中可预测的,一旦某外部中断产生的频度超出其预测值(如硬件故障产生的虚假中断信号或预测值本身有误)就可能会破坏整个系统的可预测性口 其次,实时控制系统中的各用户进程一般都有实时性要求,因此中断处理程序优先级高于所有用户进程的优先级分配方式是不合适的。
一种较适合实时操作系统的中断处理方式为:除时钟中断外,屏蔽所有其它中断,中断处理程序变为周期性的轮询操作。采用这种方式的主要好处是充分保证了系统 的可预测性,主要缺点是对环境变化的响应可能不如上述矿断处理方式快。另外轮询操作在一定程度上降低了CPU的有效利用率。另一种可行的方式是:对于采用 轮询方式无法满足需求的外部事件,采用中断方式,其它时间仍然采用轮询方式。但此时中断处理程序与所以其它任务一样拥有优先级,调度器根据优先级对处于就 绪态的任务和中断处理程序统一进行处理器调度。这种方式使外部事件的响应速度加快避免了上述中断方式带来第二个问题,但第一个问题依然存在。
此外为提高时钟中断响应时间的可预测性,实时操作系统应尽可能少地屏蔽中断。
(4)共享资源的互斥访问:
通用操作系统一般采用信号量机制来解决共享资源的互斥访问问题。
对于实时操作系统,如果任务调度采用静态表驱动方式,共享资源的互斥访问问题在生成运行时间表时已经考虑到了,在运行时无需再考虑。如果任务调度采用基于 优先级的方式,则传统的信号量机制在系统运行时很容易造成优先级倒置问题,即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任 务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优先级的任务抢先,因此造成高优先级任务被许多具有较低优先级的任务阻塞,实时性难以得 到保证。因此在实时操作系统中,往往对传统的信号量机制进行了一些扩展,引入了如优先级继承协议、优先级顶置协议等机制,较好地解决了优先级倒置的问题。
(5)系统调用以及系统内部操作的时间开销:
进程通过系统调用得到操作系统提供的服务,操作系统通过内部操作(加上下文切换等)来完成一些内部管理工作。为保证系统的可预测性,实时操作系统中的所有 系统调用以及系统内部操作的时间开销都应是有界的,并且该界限是一个具体的量化数值。而在通用操作系统中对这些时间开销则未做如此限制。
(6)系统的可重入性:
在通用操作系统中,核心态系统调用往往是不可重入的,当一低优先级任务调用核心态系统调用时,在该时间段内到达的高优先级任务必须等到低优先级的系统调用完成才能获得CPU,这就降低了系统的可预测性。因此,实时操作系统型中的核心态系统调用往往设计为可重入的。
(7)辅助工具:
实时操作系统额外提供了一些辅助工具,如实时任务在最坏情况下的执行时间估算工具、系统的实时性验证工具等,可帮助工程师进行系统的实时性验证工作。
此外,实时操作系统对系统硬件设计也提出了一些要求,如:
DMA 相关:
DMA是一种数据交换协议,主要作用是在无需CPU参与的情况下将数据在内存与其它外部设备间进行交换。 DMA最常用的一种实现方式被称为周期窃取(Cycle Stealing)方式,即首先遇过总线仲裁协议与CPU竞争总线控制权,在获得控制权后再根据用户预设的操作指令进行数据交换。由于这种周期窃取方式会 给用户任务带来不可预测的额外阻塞开销,所以实时操作系统往往要求系统设计时不采用DMA或采取一些可预测性更好DMA实现方式,如Time-slice
method等。
[《深入理解计算机系统》第六章403页讲的不错。]
·Cache
Cache的主要作用是采用容量相对较小的快速存储部件来弥补高性能CPU与相对来说性能较低的存储器之间的性能差异,由于它可以使系统的平均表现性能得到大幅提高,因此在硬件设计中得到了极为广泛的应用。
但实时操作系统注重的不是平均表现性能,而是个体最坏情况表现,因此在对系统进行实时性验证时必须考虑实时任务运行的最坏情况,即每次访存都没有命中 Cache情况下的运行时间,所以在利用辅助工具估算实时任务在最坏情况下的执行时间,应将系统中所有的Cache功能暂时关闭,在系统实际运行时再将 Cache功能激活。除此以外,另一种较极端的做法则是在硬件设计中完全不采用Cache技术。
注1:何为嵌入式系统嵌入式系统是指将应用程序和操作系统与计算机硬件集成在一起的系统。简单的说就是系统的应用软件与系统的硬件一体化,类似与BIOS的工作万式。这种系统具育软件代码小,高度自动化,响应速度快等特点,特别适合于要求实时的和多任务的体系。
注2:实时多任务操作系统实时多任务操作系统(Real Time Operating System〉是根据操作系统的工作特性而言的。实时是指物理进程的真实时间。实地操作系统是指真奇实时性,能支持实时撞制系统工作的操作系统。真首要任 务是调度一切可利用的资源完成实时控制任务,真次才着眼于提高计算机系统的使用烈率,这种系统的重要特点是要满意对时间的限制和要求。
三种工作模式
80386处理器有3种工作模式:实模式、保护模式和虚拟86模式。实模式和虚拟86模式是为了和8086处理器兼容而设置的。在实模式 下,80386处理器就相当于一个快速的8086处理器。
保护模式是80386处理器的主要工作模式。在此方式下,80386可以寻址4GB的地址空间,同时,保护模式提供了80386先进的多任务、内存分页管理和优先级保护等机制。为了在保护模式下继续提供和8086处理器的兼 容,80386又设计了一种虚拟86模式,以便可以在保护模式的多任务条件下,有的任务运行32位程序,有的任务运行MS-DOS程序。在虚拟86模式
下,同样支持任务切换、内存分页管理和优先级,但内存的寻址方式和8086相同,也是可以寻址1MB的空间。
由此可 见,80386处理器的3种工作模式各有特点且相互联系。实模式是80386处理器工作的基础,这时80386当做一个快速的8086处理器工作。在实模 式下可以通过指令切换到保护模式,也可以从保护模式退回到实模式。虚拟86模式则以保护模式为基础,在保护模式和虚拟86模式之间可以互相切换,但不能从实模式直接进入虚拟86模式或从虚拟86模式直接退到实模式。 【实模式<->虚拟85】
实模式:寻址采用和8086相同的16位段和偏移量,最大寻址空间1MB(原因:20位的地址总线, 因此,也就有了以下行为:由段寄存器的内容乘以 16当做基地址,加上段内的偏移地址形成最终的物理地址,这时候它的32位地址线只使用了低20位。具体来参考http://blog.chinaunix.net/space.php?uid=20791902&do=blog&id=291989),最大分段64KB。可以使用32位指令。32位的x86
CPU用做高速的8086。
保护模式:寻址采用32位段和偏移量,最大寻址空间4GB,最大分段4GB (Pentium Pre及以后为64GB)。在保护模式下CPU可以进入虚拟8086方式,这是在保护模式下的实模式程序运行环境。
保护模式同实模式的根本区别是进程内存受保护与否。可寻址空间的区别只是这一原因的果。实模式将整个物理内存看成分段的区域,程序代码和数据位 于不同 区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序 区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这
样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。
至此,进程(这时 我们可以称程序 为进程了)有了严格的边界,任何其他进程根本没有办法访问不属于自己的物理内存区域,甚至在自己的虚拟地址范围内也不是可以任意访问的,因为有一些虚拟区域已经被放进一些公共系统运行库。这些区域也不能随便修改,若修改就会有: SIGSEGV(linux 段错误);非法内存访问对话框(windows 对话框)。
CPU启动环境为16位实模式,之后可以切换到保护模式。但从保护模式无法切换回实模式。
1. 实模式 【寻址都是物理地址】
80386处理器被复位或加电的时候 以实模式启动。这时候处理器中的各寄存器以实模式的初始化值工作。80386处理器在实模式下的存储器寻址方式和8086是一样的。 在实模式下,80386处理器不能对内存进行分页管 理,所以指令寻址的地址就是内存中实际的物理地址。在实模式下,所有的段都是可以读、写和执行的。
实模式下80386不支持优先级,所 有的指令相当于工作在特权级(优先级0),所以它可以执行所有特权指令,包括读写控制寄存器CR0等。实际上,80386就是通过在实模式下初始化控制寄 存器,GDTR,LDTR,IDTR与TR等管理寄存器以及页表,然后再通过加载CR0使其中的保护模式使能位置位而进入保护模式的。实模式下不支持硬件 上的多任务切换。
实模式下的中断处理方式和8086处理器相同,也用中断向量表来定位中断服务程序地址。中断向量表的结构也和8086处理器一样,每4个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址。
从 编程的角度看,除了可以访问80386新增的一些寄存器外,实模式的80386处理器和8086有什么进步呢?其实最大的好处是可以使用80386的32 位寄存器,用32位的寄存器进行编程可以使计算程序更加简捷,加快了执行速度。比如在8086时代用16位寄存器来完成32位的乘法和除法时,要进行的步 骤实在是太多了,于是考试时出这一类的题目就成了老师们的最爱,所以那时候当学生做梦都想着让寄存器的位数快快长,现在梦想终于成真了,用32位寄存器一
条指令就可以完成(问题是老师们也发现了这个投机取巧的办法,为了达到让学生们基础扎实的目的,也把题目换成了64位的乘法和除法,所以现在晚上做的梦换 成了寄存器忽然长到了64位);其次,80386中增加的两个辅助段寄存器FS和GS在实模式下也可以使用,这样,同时可以访问的段达到了6个而不必考虑 重新装入的问题;最后,很多80386的新增指令也使一些原来不很方便的操作得以简化,如80386中可以使用下述指令进行数组访问:
mov cx,[eax + ebx * 2 + 数组基地址]
这 相当于把数组中下标为eax和ebx的项目放入cx中;ebx * 2中的2可以是1,2,4或8,这样就可以支持8位到64位的数组。而在8086处理器中,实现相同的功能要进行一次乘法和两次加法。另外,pushad 和popad指令可以一次把所有8个通用寄存器的值压入或从堆栈中弹出,比起用下面的指令分别将8个寄存器入栈要快了很多:
push eax
push ebx
...
pop ebx
pop eax
当然,使用了这些新指令的程序是无法拿回到8086处理器上去执行的,因为这些指令的编码在8086处理器上是未定义的。
2. 保护模式
当 80386工作在保护模式下的时候,它的所有功能都是可用的。这时80386所有的32根地址线都可供寻址,物理寻址空间高达4 GB。在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。虽然与8086可寻址的1 MB物理地址空间相比,80386可寻址的物理地址空间可谓很大,但实际的微机系统不可能安装如此大的物理内存。所以,为了运行大型程序和真正实现多任 务,虚拟内存是一种必需的技术。
保护模式下80386支持多任务,可以依靠硬件仅在一条指令中实现任务切换。任务环境的保护工作是由处 理器自动完成的。在保护模式下,80386处理器还支持优先级机制,不同的程序可以运行在不同的优先级上。优先级一共分0~3 4个级别,操作系统运行在最高的优先级0上,应用程序则运行在比较低的级别上;配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离 各个任务。从实模式切换到保护模式是通过修改控制寄存器CR0的控制位PE(位0)来实现的。在这之前还需要建立保护模式必需的一些数据表,如全局描述符
表GDT和中断描述符表IDT等。
DOS操作系统运行于实模式下,而Windows操作系统运行于保护模式下。
3. 虚拟86模式
虚 拟86模式是为了在保护模式下执行8086程序而设置的。虽然80386处理器已经提供了实模式来兼容8086程序,但这时8086程序实际上只是运行得 快了一点,对CPU的资源还是独占的。在保护模式的多任务环境下运行这些程序时,它们中的很多指令和保护模式环境格格不入,如段寻址方式、对中断的处理和 I/O操作的特权问题等。为了在保护模式下工作而丢弃这些程序的代价是巨大的。设想一下,如果Windows或80386处理器推出的时候宣布不能运行以 前的MS-DOS程序,那么就等于放弃了一个巨大的软件库,Windows以及80386处理器可能就会落得和苹果机一样的下场,这是Microsoft
和Intel都不愿看到的。所以,80386处理器又设计了一个虚拟86模式。
虚拟86模式是以任务形式在保护模式上执行的,在 80386上可以同时支持由多个真正的80386任务和虚拟86模式构成的任务。在虚拟86模式下,80386支持任务切换和内存分页。在Windows 操作系统中,有一部分程序专门用来管理虚拟86模式的任务,称为虚拟86管理程序。
既然虚拟86模式以保护模式为基础,它的工作方式实 际上是实模式和保护模式的混合。为了和8086程序的寻址方式兼容,虚拟86模式采用和8086一样的寻址方式,即用段寄存器乘以16当做基址再配合偏移 地址形成线性地址,寻址空间为1 MB。但显然多个虚拟86任务不能同时使用同一位置的1 MB地址空间,否则会引起冲突。操作系统利用分页机制将不同虚拟86任务的地址空间映射到不同的物理地址上去,这样每个虚拟86任务看起来都认为自己在使 用0~1 MB的地址空间。
8086代码中有相当一部分指令在保护模式下属于特权指令,如屏蔽中断的cli和中断返回指令iret 等。这些指令在8086程序中是合法的。如果不让这些指令执行,8086代码就无法工作。为了解决这个问题,虚拟86管理程序采用模拟的方法来完成这些指 令。这些特权指令执行的时候引起了保护异常。虚拟86管理程序在异常处理程序中检查产生异常的指令,如果是中断指令,则从虚拟86任务的中断向量表中取出 中断处理程序的入口地址,并将控制转移过去;如果是危及操作系统的指令,如cli等,则简单地忽略这些指令,在异常处理程序返回的时候直接返回到下一条指
令。通过这些措施,8086程序既可以正常地运行下去,在执行这些指令的时候又觉察不到已经被虚拟86管理程序做了手脚。MS-DOS应用程序在 Windows操作系统中就是这样工作的。
——————————————————————————————————————————————————
什么是保护模式
自从1969年推出第一个微处理器以来,Intel处理器就在不断地更新换代,从8086、8088、80286,到 80386、80486、奔腾、奔腾Ⅱ、奔腾4等,其体系结构也在不断变化。80386以后,提供了一些新的功能,弥补了8086的一些缺陷。这其中包括 内存保护、多任务及使用640KB以上的内存等,并仍然保持和8086家族的兼容性。也就是说80386仍然具备了8086和80286的所有功能,但是 在功能上有了很大的增强。早期的处理器是工作在实模式之下的,80286以后引入了保护模式,而在80386以后保护模式又进行了很大的改进。在
80386中,保护模式为程序员提供了更好的保护,提供了更多的内存。事实上,保护模式的目的不是为了保护程序,而是要保护程序以外的所有程序(包括操作 系统)。
简言之,保护模式是处理器的一种最自然的模式。在这种模式下,处理器的所有指令及体系结构的所有特色都是可用的,并且能够达到最高的性能。
保护模式和实模式
从 表面上看,保护模式和实模式并没有太大的区别,二者都使用了内存段、中断和设备驱动来处理硬件,但二者有很多不同之处。我们知道,在实模式中内存被划分成 段,每个段的大小为64KB,而这样的段地址可以用16位来表示。内存段的处理是通过和段寄存器相关联的内部机制来处理的,这些段寄存器(CS、DS、 SS和ES)的内容形成了物理地址的一部分。具体来说,最终的物理地址是由16位的段地址和16位的段内偏移地址组成的。用公式表示为:
物理地址=左移4位的段地址+偏移地址。
在 保护模式下,段是通过一系列被称之为"描述符表"的表所定义的。段寄存器存储的是指向这些表的指针。用于定义内存段的表有两种:全局描述符表(GDT)和 局部描述符表(LDT)。GDT是一个段描述符数组,其中包含所有应用程序都可以使用的基本描述符。在实模式中,段长是固定的(为64KB),而在保护模 式中,段长是可变的,其最大可达4GB。LDT也是段描述符的一个数组。与GDT不同,LDT是一个段,其中存放的是局部的、不需要全局共享的段描述符。 每一个操作系统都必须定义一个GDT,而每一个正在运行的任务都会有一个相应的LDT。每一个描述符的长度是8个字节,格式如图3所示。当段寄存器被加载
的时候,段基地址就会从相应的表入口获得。描述符的内容会被存储在一个程序员不可见的影像寄存器(shadow register)之中,以便下一次同一个段可以使用该信息而不用每次都到表中提取。物理地址由16位或者32位的偏移加上影像寄存器中的基址组成。实模 式和保护模式的不同可以从图1和图2中很清楚地看出来。
此外,还有一个中断描述符表(IDT)。这些中断描述符会告诉处理器到那里可以找到中断处理程序。和实模式一样,每一个中断都有一个入口,但是这些入口的格式却完全不同。因为在切换到保护模式的过程中没有使用到IDT,所以在此就不多做介绍了。
进入保护模式
80386 有4个32位控制寄存器,名字分别为CR0、CR1、CR2和CR3。CR1是保留在未来处理器中使用的,在80386中没有定义。CR0包含系统的控制 标志,用于控制处理器的操作模式和状态。CR2和CR3是用于控制分页机制的。在此,我们关注的是CR0寄存器的PE位控制,它负责实模式和保护模式之间 的切换。当PE=1时,说明处理器运行于保护模式之下,其采用的段机制和前面所述的相应内容对应。如果PE=0,那么处理器就工作在实模式之下。
切换到保护模式,实际就是把PE位置为1。为了把系统切换到保护模式,还要做一些其它的事情。程序必须要对系统的段寄存器和控制寄存器进行初始化。把PE位置1后,还要执行跳转指令。过程简述如下:
1.创建GDT表;
2.通过置PE位为1进入保护模式;
3.执行跳转以清除在实模式下读取的任何指令。
实模式下,cpu指令访问的地址就是物理地址,形式为:段寄存器:偏移
在保护模式下,cpu可以使用分段机制和分页机制。
分段机制下使用的地址就是逻辑地址,形式为:段选择子:偏移
分页机制下使用的地址就是线性地址,形式为:0xXXXXXXXX
无论是逻辑地址还是线性地址,都要被cpu映射成物理地址。
保护模式下必须采用分段机制。在此基础上可采用分页机制。
逻辑地址被转化为线性地址,如果采用分页机制,则该线性地址通过分页机制被映射成物理地址。如果不采用分页机制,则该线性地址就是物理地址。
实模式下的物理地址只能访问1M以下空间,而保护模式下的物理地址可以访问所有32位空间。并且要注意,物理内存空间只是物理地址空间的一个部分而已。
*多任务和可抢占的;
*任务具有优先级;
*操作系统具备支持可预测的任务同步机制;
*支持多任务间的通信;
*操作系统具备消除优先级转置的机制;
*存储器优化管理(含ROM的管理);
*操作系统的(中断延迟、任务切换、驱动程序延迟等)行为是可知的可预测的。这是指在
全负载的情形下,最坏反应时间可知;
*实时时钟服务;
*中断管理服务。
实时操作系统所遵循的最重要的设计原则是: 采用各种算法和策略,始终保证系统行为的可预测性。可预测性是指在系统运行的任何时刻,在任何
情况下,实时操作系统的资源调配策略都能为争夺资源(包括CPU、内存、网络带宽等)的多个实时任务合理地分配资源,使每个实时任务的实时性要求都能得到 满足。与通用操作系统不同,实时操作系统注重的不是系统的平均表现,而是要求每个实时任务在最坏情况下都要满足其实时性要求,也就是说,实时操作系统注重
的是个体表现,更准确地讲是个体最坏情况表现。
实时系统最关键的部分是实时多任务内核。它的基本功能包括多任务管理、定时器管理、
存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理、信号量管理等。这
些管理功能是通过内核服务函数形式交给用户调用的,也就是实时操作系统的API。
================vxworks和linux的比较===========================
vxWorks | Linux | |
内核 结构 | 微内核, 内核只提供 了基本的服 务,如:任 务管理,内 存管理,中 断处理等 | 单内核 【Monolithic】, 除了基本的 服务,内核 还包括文件 系统,网络 协议等 |
运行 模式 | 应用程序运 行在“实模 式”下,无 用户模式和 内核模式之 分 | 采用“保护 模式”,用 户进程、线 程运行在用 户模式下, 内核线程运 行于内核模 式 |
内存 访问 和内 存保 护 | 内核采用实 存储管理方 式,所有任 务运行于同 一物理地址 空间,用户 程序直接操 作物理地 址,不能直 接地提供内 存保护,不 能防止错误 蔓延 | 内核采用虚 拟存储管理 方式,用户 具有独立的 地址空间 ,用户进程 只能访问本 进程的虚拟 空间,提供 了内存保 护,可以防 止错误蔓延 |
执行 单元 | 任务 | 进程、线程 |
请求 内核 服务 方式 | 函数调用, 更快 | 系统调用 ,更安全 |
实 时 性 | 硬实时 | 软实时 |
时钟周期 时钟周期也称为振荡周期,定义为时钟脉冲的倒数(时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时钟周期就是1/12us),是计算机中的最基本的、最小的时间单位。 在一个时钟周期内,CPU仅完成一个最基本的动作。时钟脉冲是计算机的基本工作脉冲,控制着计算机的工作节奏。时钟频率越高,工作速度就越快。 8051单片机把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。 机器周期 计算机中,常把一条指令的执行过程划分为若干个阶段,每一个阶段完成一项工作。每一项工作称为一个基本操作,完成一个基本操作所需要的时间称为机器周期。8051系列单片机的一个机器周期由6个S周期(状态周期)组成。 一个S周期=2个节拍(P),所以8051单片机的一个机器周期=6个状态周期=12个时钟周期。 例如外接24M晶振的单片机,他的一个机器周期=12/24M 秒; 指令周期 执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期也不同。 硬实时与软实时之间最关键的差别在于,软实时只能提供统计意义上的实时。例如,有的应用要求系统在95%的情况下都会确保在规定的时间内完成某个动作,而不一定要求100%。 SYS_CLK_RATE是1000,那么就是1ms。。如果是60那么就大约是16.67ms。。。【我们的设备就是60】通常来讲,vxWorks手册建议不要将时钟率设得太高,否则它就由硬实时变得趋向于软实时了。。因为过高的时钟率使得内核调度频繁进入,可能导致一些低优先级的硬件中断不能得到及时响应。 |
嵌入式实时系统中采用的操作系统称为嵌入式实时操作系统,它既是嵌入式操作系统,又是实时操作系统。
作为一种嵌入式操作系统,它具有嵌入 式软件共有的可裁剪、低资源、占用、低功耗等特点; 而作为一种实时操作系统,它与通用操作系统(如Windows、Unix、Linux等)相比有很大的 差别,下面我们通过比较这两种操作系统之间的差距来描述实时操作系统的主要特点。
最常用的操作系统是通用操作系统,通用操作系统是由分时操作系统发展而来,大部分都支持多用户和多进程,负责管理众多的进程并为它们分配系统资源。
分时操作系统的基本设计原则是:尽量缩短系统的平均响应时间并提高系统的吞吐率,在单位时间内为尽可能多的用户请求提供服务。由此可以看出,分时操作系统注重平均表现性能,不注重个体表现性能。如对于整个系统来说,注重所有任务的平均响应时间而不关心单个任务的响应时间,对于单个任务来说,注重每次执行的平均响
应时间而不关心某次特定执行的响应时间。
通用操作系统中采用的很多策略和技巧都体现出了这种设计原则,如虚存管理机制中由于采用LRU等页替换算法,使得 大部分的访存需求能够快速地通过物理内存完成,只有很小一部分的访存需求需要通过调页完成,但从总体上来看,平均访存时间与不采用虚存技术相比没有很大的提高,同时又获得了虚空间可以远大于物理内存容量等好处,因此虚存技术在通用操作系统中得到了十分广泛的应用。
而对于实时操作系统,前面已经提到,它除了要满足应用的功能需求以外,更重要的是还要满足应用提出的实时性要求,而组成一个应用的众多实时任务对于实时性 的要求是各不相同的,此外实时任务之间可能还会有一些复杂的关联和同步关系,如执行顺序限制、共享资源的互斥访问要求等,这就为系统实时性的保证带来了很 大的困难。
由于实时操作系统与通用操作系统的基本设计原则差别很大,因此在很多资源调度策略的选择上以及操作系统实现的方法上两者都具有较大的差异,这些差异主要体现在以下几点:
(1)任务调度策略:
通用操作系统中的任务调度策略一般采用基于优先级的抢先式调度策略,对于优先级相同的进程则采用时间片轮转调度方式,用户进程可以通过系统调用动态地调整自己的优先级,操作系统可根据情况调整某些进程的优先级。
实时操作系统中的任务调度策略目前使用最广泛的主要可分为两种,一种是静态表驱动方式,另一种是固定优先级抢先式调度方式。
静态表驱动方式是指在系统运行前工程师根据各任务的实时要求用手工的方式或在辅助工具的帮助下生成一张任务的运行时间表,这张时间表与列车的运行时刻表类 似,指明了各任务的起始运行时间以及运行长度,运行时间表一旦生成就不再变化了,在运行时调度器只需根据这张表在指定的时刻启动相应的任务理即可。静态表 驱动方式的主要优点是:
·运行时间表是在系统运行前生成的,因此可以采用较复杂的搜索算法找到较优的调度方案:1
·运行时调度器开销较小;·系统具有非常好的可预测性,实时性验证也比较方便;
这种方式主要缺点是不灵活,需求一旦发生变化,就要重新生成整个运行时量间表。由于具有非常好的可预测性,这种方式主要用于航空航天、军事等对系统的实时性要求十分严格的领域。
固定优先级抢先式调度方式则与通用操作系统中采用的基于优先级的调度方式基本类似,但在固定优先级抢先式调度方方式中,进程的优先级是固定不变革的,并且 该优先级是在运行前通过某种优先级分配策略来指定的。这种方式的优缺点与静太表驱动方式的优缺点正好完全相反,它主要应用于一些较简单、较独立的嵌入式系 统,但随着调度理论的不断成熟和完善,这种方式也会逐渐在一些对实时性要求十分严格的领域中得到应用。目前市场上大部分的实时操作系统采用的都是这种调度 方式。
(2)内存管理:
关于虚存管理机制在上面已经进行了一些分析。为解决虚存给系统带来的不可预测性,实时操作系统一般采用如下两种方式:
·在原有虚存管理机制的基础上增加页面锁功能,用户可将关键页面锁定在内存中,从而不会被swap程序将该页面交换出内存。这种方式的优点是既得到了虚存 管理机制为软件开发带来的好处,又提高了系统的可预测性。缺点是由于TLB等机制的也是按照注重平均表现的原则进行的,因此系统的可预测性并不能完全得到 保障;
·采用静态内存划分的方式,为每个实时任务划分固定的内存区域。这种方式的优点是系统具有较好的可预测性,缺点是灵活性不够好,任务对存储器的需求一旦有变化就需要重新对内存进行划分,此外虚存管理机制所带来的好处也丧失了。
目前市场上的实时操作系统一般都采用第一种管理方式。
(3)中断处理:
在通用操作系统中,大部分外部中断都是开启的,中断处理一般由设备驱动程序来完成。由于通用操作系统中的用户进程一般都没有实时性要求,而中断处理程序直接跟硬件设备交互,可能有实时性要求,因此中断处理程序的优先级被设定为高于任何用户进程。
但对于实时操作系统采用上述的中断处理机制是不合适的。首先,外部中断是环境向实时操作系统进行的输入,它的频度是与环境变化的速率相关的,而与实时操作 系统无关。如果外部中断产生的频度不可预测,则一个实时任务在运行时被中断处理程序阻塞的时间开销也是不可预测的,从而使任务的实时性得不到保证;如果外 部中断产生的频度中可预测的,一旦某外部中断产生的频度超出其预测值(如硬件故障产生的虚假中断信号或预测值本身有误)就可能会破坏整个系统的可预测性口 其次,实时控制系统中的各用户进程一般都有实时性要求,因此中断处理程序优先级高于所有用户进程的优先级分配方式是不合适的。
一种较适合实时操作系统的中断处理方式为:除时钟中断外,屏蔽所有其它中断,中断处理程序变为周期性的轮询操作。采用这种方式的主要好处是充分保证了系统 的可预测性,主要缺点是对环境变化的响应可能不如上述矿断处理方式快。另外轮询操作在一定程度上降低了CPU的有效利用率。另一种可行的方式是:对于采用 轮询方式无法满足需求的外部事件,采用中断方式,其它时间仍然采用轮询方式。但此时中断处理程序与所以其它任务一样拥有优先级,调度器根据优先级对处于就 绪态的任务和中断处理程序统一进行处理器调度。这种方式使外部事件的响应速度加快避免了上述中断方式带来第二个问题,但第一个问题依然存在。
此外为提高时钟中断响应时间的可预测性,实时操作系统应尽可能少地屏蔽中断。
(4)共享资源的互斥访问:
通用操作系统一般采用信号量机制来解决共享资源的互斥访问问题。
对于实时操作系统,如果任务调度采用静态表驱动方式,共享资源的互斥访问问题在生成运行时间表时已经考虑到了,在运行时无需再考虑。如果任务调度采用基于 优先级的方式,则传统的信号量机制在系统运行时很容易造成优先级倒置问题,即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任 务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优先级的任务抢先,因此造成高优先级任务被许多具有较低优先级的任务阻塞,实时性难以得 到保证。因此在实时操作系统中,往往对传统的信号量机制进行了一些扩展,引入了如优先级继承协议、优先级顶置协议等机制,较好地解决了优先级倒置的问题。
(5)系统调用以及系统内部操作的时间开销:
进程通过系统调用得到操作系统提供的服务,操作系统通过内部操作(加上下文切换等)来完成一些内部管理工作。为保证系统的可预测性,实时操作系统中的所有 系统调用以及系统内部操作的时间开销都应是有界的,并且该界限是一个具体的量化数值。而在通用操作系统中对这些时间开销则未做如此限制。
(6)系统的可重入性:
在通用操作系统中,核心态系统调用往往是不可重入的,当一低优先级任务调用核心态系统调用时,在该时间段内到达的高优先级任务必须等到低优先级的系统调用完成才能获得CPU,这就降低了系统的可预测性。因此,实时操作系统型中的核心态系统调用往往设计为可重入的。
(7)辅助工具:
实时操作系统额外提供了一些辅助工具,如实时任务在最坏情况下的执行时间估算工具、系统的实时性验证工具等,可帮助工程师进行系统的实时性验证工作。
此外,实时操作系统对系统硬件设计也提出了一些要求,如:
DMA 相关:
DMA是一种数据交换协议,主要作用是在无需CPU参与的情况下将数据在内存与其它外部设备间进行交换。 DMA最常用的一种实现方式被称为周期窃取(Cycle Stealing)方式,即首先遇过总线仲裁协议与CPU竞争总线控制权,在获得控制权后再根据用户预设的操作指令进行数据交换。由于这种周期窃取方式会 给用户任务带来不可预测的额外阻塞开销,所以实时操作系统往往要求系统设计时不采用DMA或采取一些可预测性更好DMA实现方式,如Time-slice
method等。
[《深入理解计算机系统》第六章403页讲的不错。]
·Cache
Cache的主要作用是采用容量相对较小的快速存储部件来弥补高性能CPU与相对来说性能较低的存储器之间的性能差异,由于它可以使系统的平均表现性能得到大幅提高,因此在硬件设计中得到了极为广泛的应用。
但实时操作系统注重的不是平均表现性能,而是个体最坏情况表现,因此在对系统进行实时性验证时必须考虑实时任务运行的最坏情况,即每次访存都没有命中 Cache情况下的运行时间,所以在利用辅助工具估算实时任务在最坏情况下的执行时间,应将系统中所有的Cache功能暂时关闭,在系统实际运行时再将 Cache功能激活。除此以外,另一种较极端的做法则是在硬件设计中完全不采用Cache技术。
注1:何为嵌入式系统嵌入式系统是指将应用程序和操作系统与计算机硬件集成在一起的系统。简单的说就是系统的应用软件与系统的硬件一体化,类似与BIOS的工作万式。这种系统具育软件代码小,高度自动化,响应速度快等特点,特别适合于要求实时的和多任务的体系。
注2:实时多任务操作系统实时多任务操作系统(Real Time Operating System〉是根据操作系统的工作特性而言的。实时是指物理进程的真实时间。实地操作系统是指真奇实时性,能支持实时撞制系统工作的操作系统。真首要任 务是调度一切可利用的资源完成实时控制任务,真次才着眼于提高计算机系统的使用烈率,这种系统的重要特点是要满意对时间的限制和要求。
三种工作模式
80386处理器有3种工作模式:实模式、保护模式和虚拟86模式。实模式和虚拟86模式是为了和8086处理器兼容而设置的。在实模式 下,80386处理器就相当于一个快速的8086处理器。
保护模式是80386处理器的主要工作模式。在此方式下,80386可以寻址4GB的地址空间,同时,保护模式提供了80386先进的多任务、内存分页管理和优先级保护等机制。为了在保护模式下继续提供和8086处理器的兼 容,80386又设计了一种虚拟86模式,以便可以在保护模式的多任务条件下,有的任务运行32位程序,有的任务运行MS-DOS程序。在虚拟86模式
下,同样支持任务切换、内存分页管理和优先级,但内存的寻址方式和8086相同,也是可以寻址1MB的空间。
由此可 见,80386处理器的3种工作模式各有特点且相互联系。实模式是80386处理器工作的基础,这时80386当做一个快速的8086处理器工作。在实模 式下可以通过指令切换到保护模式,也可以从保护模式退回到实模式。虚拟86模式则以保护模式为基础,在保护模式和虚拟86模式之间可以互相切换,但不能从实模式直接进入虚拟86模式或从虚拟86模式直接退到实模式。 【实模式<->虚拟85】
实模式:寻址采用和8086相同的16位段和偏移量,最大寻址空间1MB(原因:20位的地址总线, 因此,也就有了以下行为:由段寄存器的内容乘以 16当做基地址,加上段内的偏移地址形成最终的物理地址,这时候它的32位地址线只使用了低20位。具体来参考http://blog.chinaunix.net/space.php?uid=20791902&do=blog&id=291989),最大分段64KB。可以使用32位指令。32位的x86
CPU用做高速的8086。
保护模式:寻址采用32位段和偏移量,最大寻址空间4GB,最大分段4GB (Pentium Pre及以后为64GB)。在保护模式下CPU可以进入虚拟8086方式,这是在保护模式下的实模式程序运行环境。
保护模式同实模式的根本区别是进程内存受保护与否。可寻址空间的区别只是这一原因的果。实模式将整个物理内存看成分段的区域,程序代码和数据位 于不同 区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序 区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这
样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。
至此,进程(这时 我们可以称程序 为进程了)有了严格的边界,任何其他进程根本没有办法访问不属于自己的物理内存区域,甚至在自己的虚拟地址范围内也不是可以任意访问的,因为有一些虚拟区域已经被放进一些公共系统运行库。这些区域也不能随便修改,若修改就会有: SIGSEGV(linux 段错误);非法内存访问对话框(windows 对话框)。
CPU启动环境为16位实模式,之后可以切换到保护模式。但从保护模式无法切换回实模式。
1. 实模式 【寻址都是物理地址】
80386处理器被复位或加电的时候 以实模式启动。这时候处理器中的各寄存器以实模式的初始化值工作。80386处理器在实模式下的存储器寻址方式和8086是一样的。 在实模式下,80386处理器不能对内存进行分页管 理,所以指令寻址的地址就是内存中实际的物理地址。在实模式下,所有的段都是可以读、写和执行的。
实模式下80386不支持优先级,所 有的指令相当于工作在特权级(优先级0),所以它可以执行所有特权指令,包括读写控制寄存器CR0等。实际上,80386就是通过在实模式下初始化控制寄 存器,GDTR,LDTR,IDTR与TR等管理寄存器以及页表,然后再通过加载CR0使其中的保护模式使能位置位而进入保护模式的。实模式下不支持硬件 上的多任务切换。
实模式下的中断处理方式和8086处理器相同,也用中断向量表来定位中断服务程序地址。中断向量表的结构也和8086处理器一样,每4个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址。
从 编程的角度看,除了可以访问80386新增的一些寄存器外,实模式的80386处理器和8086有什么进步呢?其实最大的好处是可以使用80386的32 位寄存器,用32位的寄存器进行编程可以使计算程序更加简捷,加快了执行速度。比如在8086时代用16位寄存器来完成32位的乘法和除法时,要进行的步 骤实在是太多了,于是考试时出这一类的题目就成了老师们的最爱,所以那时候当学生做梦都想着让寄存器的位数快快长,现在梦想终于成真了,用32位寄存器一
条指令就可以完成(问题是老师们也发现了这个投机取巧的办法,为了达到让学生们基础扎实的目的,也把题目换成了64位的乘法和除法,所以现在晚上做的梦换 成了寄存器忽然长到了64位);其次,80386中增加的两个辅助段寄存器FS和GS在实模式下也可以使用,这样,同时可以访问的段达到了6个而不必考虑 重新装入的问题;最后,很多80386的新增指令也使一些原来不很方便的操作得以简化,如80386中可以使用下述指令进行数组访问:
mov cx,[eax + ebx * 2 + 数组基地址]
这 相当于把数组中下标为eax和ebx的项目放入cx中;ebx * 2中的2可以是1,2,4或8,这样就可以支持8位到64位的数组。而在8086处理器中,实现相同的功能要进行一次乘法和两次加法。另外,pushad 和popad指令可以一次把所有8个通用寄存器的值压入或从堆栈中弹出,比起用下面的指令分别将8个寄存器入栈要快了很多:
push eax
push ebx
...
pop ebx
pop eax
当然,使用了这些新指令的程序是无法拿回到8086处理器上去执行的,因为这些指令的编码在8086处理器上是未定义的。
2. 保护模式
当 80386工作在保护模式下的时候,它的所有功能都是可用的。这时80386所有的32根地址线都可供寻址,物理寻址空间高达4 GB。在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。虽然与8086可寻址的1 MB物理地址空间相比,80386可寻址的物理地址空间可谓很大,但实际的微机系统不可能安装如此大的物理内存。所以,为了运行大型程序和真正实现多任 务,虚拟内存是一种必需的技术。
保护模式下80386支持多任务,可以依靠硬件仅在一条指令中实现任务切换。任务环境的保护工作是由处 理器自动完成的。在保护模式下,80386处理器还支持优先级机制,不同的程序可以运行在不同的优先级上。优先级一共分0~3 4个级别,操作系统运行在最高的优先级0上,应用程序则运行在比较低的级别上;配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离 各个任务。从实模式切换到保护模式是通过修改控制寄存器CR0的控制位PE(位0)来实现的。在这之前还需要建立保护模式必需的一些数据表,如全局描述符
表GDT和中断描述符表IDT等。
DOS操作系统运行于实模式下,而Windows操作系统运行于保护模式下。
3. 虚拟86模式
虚 拟86模式是为了在保护模式下执行8086程序而设置的。虽然80386处理器已经提供了实模式来兼容8086程序,但这时8086程序实际上只是运行得 快了一点,对CPU的资源还是独占的。在保护模式的多任务环境下运行这些程序时,它们中的很多指令和保护模式环境格格不入,如段寻址方式、对中断的处理和 I/O操作的特权问题等。为了在保护模式下工作而丢弃这些程序的代价是巨大的。设想一下,如果Windows或80386处理器推出的时候宣布不能运行以 前的MS-DOS程序,那么就等于放弃了一个巨大的软件库,Windows以及80386处理器可能就会落得和苹果机一样的下场,这是Microsoft
和Intel都不愿看到的。所以,80386处理器又设计了一个虚拟86模式。
虚拟86模式是以任务形式在保护模式上执行的,在 80386上可以同时支持由多个真正的80386任务和虚拟86模式构成的任务。在虚拟86模式下,80386支持任务切换和内存分页。在Windows 操作系统中,有一部分程序专门用来管理虚拟86模式的任务,称为虚拟86管理程序。
既然虚拟86模式以保护模式为基础,它的工作方式实 际上是实模式和保护模式的混合。为了和8086程序的寻址方式兼容,虚拟86模式采用和8086一样的寻址方式,即用段寄存器乘以16当做基址再配合偏移 地址形成线性地址,寻址空间为1 MB。但显然多个虚拟86任务不能同时使用同一位置的1 MB地址空间,否则会引起冲突。操作系统利用分页机制将不同虚拟86任务的地址空间映射到不同的物理地址上去,这样每个虚拟86任务看起来都认为自己在使 用0~1 MB的地址空间。
8086代码中有相当一部分指令在保护模式下属于特权指令,如屏蔽中断的cli和中断返回指令iret 等。这些指令在8086程序中是合法的。如果不让这些指令执行,8086代码就无法工作。为了解决这个问题,虚拟86管理程序采用模拟的方法来完成这些指 令。这些特权指令执行的时候引起了保护异常。虚拟86管理程序在异常处理程序中检查产生异常的指令,如果是中断指令,则从虚拟86任务的中断向量表中取出 中断处理程序的入口地址,并将控制转移过去;如果是危及操作系统的指令,如cli等,则简单地忽略这些指令,在异常处理程序返回的时候直接返回到下一条指
令。通过这些措施,8086程序既可以正常地运行下去,在执行这些指令的时候又觉察不到已经被虚拟86管理程序做了手脚。MS-DOS应用程序在 Windows操作系统中就是这样工作的。
——————————————————————————————————————————————————
什么是保护模式
自从1969年推出第一个微处理器以来,Intel处理器就在不断地更新换代,从8086、8088、80286,到 80386、80486、奔腾、奔腾Ⅱ、奔腾4等,其体系结构也在不断变化。80386以后,提供了一些新的功能,弥补了8086的一些缺陷。这其中包括 内存保护、多任务及使用640KB以上的内存等,并仍然保持和8086家族的兼容性。也就是说80386仍然具备了8086和80286的所有功能,但是 在功能上有了很大的增强。早期的处理器是工作在实模式之下的,80286以后引入了保护模式,而在80386以后保护模式又进行了很大的改进。在
80386中,保护模式为程序员提供了更好的保护,提供了更多的内存。事实上,保护模式的目的不是为了保护程序,而是要保护程序以外的所有程序(包括操作 系统)。
简言之,保护模式是处理器的一种最自然的模式。在这种模式下,处理器的所有指令及体系结构的所有特色都是可用的,并且能够达到最高的性能。
保护模式和实模式
从 表面上看,保护模式和实模式并没有太大的区别,二者都使用了内存段、中断和设备驱动来处理硬件,但二者有很多不同之处。我们知道,在实模式中内存被划分成 段,每个段的大小为64KB,而这样的段地址可以用16位来表示。内存段的处理是通过和段寄存器相关联的内部机制来处理的,这些段寄存器(CS、DS、 SS和ES)的内容形成了物理地址的一部分。具体来说,最终的物理地址是由16位的段地址和16位的段内偏移地址组成的。用公式表示为:
物理地址=左移4位的段地址+偏移地址。
在 保护模式下,段是通过一系列被称之为"描述符表"的表所定义的。段寄存器存储的是指向这些表的指针。用于定义内存段的表有两种:全局描述符表(GDT)和 局部描述符表(LDT)。GDT是一个段描述符数组,其中包含所有应用程序都可以使用的基本描述符。在实模式中,段长是固定的(为64KB),而在保护模 式中,段长是可变的,其最大可达4GB。LDT也是段描述符的一个数组。与GDT不同,LDT是一个段,其中存放的是局部的、不需要全局共享的段描述符。 每一个操作系统都必须定义一个GDT,而每一个正在运行的任务都会有一个相应的LDT。每一个描述符的长度是8个字节,格式如图3所示。当段寄存器被加载
的时候,段基地址就会从相应的表入口获得。描述符的内容会被存储在一个程序员不可见的影像寄存器(shadow register)之中,以便下一次同一个段可以使用该信息而不用每次都到表中提取。物理地址由16位或者32位的偏移加上影像寄存器中的基址组成。实模 式和保护模式的不同可以从图1和图2中很清楚地看出来。
此外,还有一个中断描述符表(IDT)。这些中断描述符会告诉处理器到那里可以找到中断处理程序。和实模式一样,每一个中断都有一个入口,但是这些入口的格式却完全不同。因为在切换到保护模式的过程中没有使用到IDT,所以在此就不多做介绍了。
进入保护模式
80386 有4个32位控制寄存器,名字分别为CR0、CR1、CR2和CR3。CR1是保留在未来处理器中使用的,在80386中没有定义。CR0包含系统的控制 标志,用于控制处理器的操作模式和状态。CR2和CR3是用于控制分页机制的。在此,我们关注的是CR0寄存器的PE位控制,它负责实模式和保护模式之间 的切换。当PE=1时,说明处理器运行于保护模式之下,其采用的段机制和前面所述的相应内容对应。如果PE=0,那么处理器就工作在实模式之下。
切换到保护模式,实际就是把PE位置为1。为了把系统切换到保护模式,还要做一些其它的事情。程序必须要对系统的段寄存器和控制寄存器进行初始化。把PE位置1后,还要执行跳转指令。过程简述如下:
1.创建GDT表;
2.通过置PE位为1进入保护模式;
3.执行跳转以清除在实模式下读取的任何指令。
实模式下,cpu指令访问的地址就是物理地址,形式为:段寄存器:偏移
在保护模式下,cpu可以使用分段机制和分页机制。
分段机制下使用的地址就是逻辑地址,形式为:段选择子:偏移
分页机制下使用的地址就是线性地址,形式为:0xXXXXXXXX
无论是逻辑地址还是线性地址,都要被cpu映射成物理地址。
保护模式下必须采用分段机制。在此基础上可采用分页机制。
逻辑地址被转化为线性地址,如果采用分页机制,则该线性地址通过分页机制被映射成物理地址。如果不采用分页机制,则该线性地址就是物理地址。
实模式下的物理地址只能访问1M以下空间,而保护模式下的物理地址可以访问所有32位空间。并且要注意,物理内存空间只是物理地址空间的一个部分而已。
相关文章推荐
- Linux下安装LoadRunner LoadGenerator
- Linux内核Input输入子系统浅解
- linux下epoll如何实现高效处理百万句柄的
- 每天一个linux命令-cat
- linux 修改的文件在掉电时会损坏的分析与处理
- Linux-安装Java SE环境及glassfish
- linux运维经验总结
- Linux大文件分区
- 获得Linux时间戳
- Linux 下安装openstf
- vmware中的linux虚拟机如何增加磁盘容量
- Linux运维必学必会(一)- sed命令
- Linux菜鸟学习笔记(常用基本命令之文件搜索)
- centos 安装 mysql5.6
- Linux下的I/O复用与epoll详解(重点)
- 给VMware下的Linux扩展磁盘空间(以CentOS6.3为例)
- linux设备驱动
- 进程控制类命令:linux关机命令总结
- SSH配置远程主机信任
- Linux——马克一些常用命令行