嵌入式操作系统复习大纲.docx
- 文档编号:10180531
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:31
- 大小:72.49KB
嵌入式操作系统复习大纲.docx
《嵌入式操作系统复习大纲.docx》由会员分享,可在线阅读,更多相关《嵌入式操作系统复习大纲.docx(31页珍藏版)》请在冰豆网上搜索。
嵌入式操作系统复习大纲
1、嵌入式操作系统概述
(1)内核
内核是指操作系统中的一个组件,它包含了OS的主要功能,即OS的各种特性及其相互之间的依赖关系,这些功能主要包括:
A、任务管理:
对系统中运行的软件进行描述和管理,并完成处理器资源分配和调度。
B、存储管理:
提高内存的利用率,方便用户使用,提供足够的存储空间。
C、设备管理:
方便设备的使用,提高CPU和I/O设备的利用率。
D、文件管理:
解决文件资源存储、共享、保密和保护等问题。
注:
不同嵌入式操作系统的内核设计各不相同,取决于系统设计和实际需求。
(2)嵌入式操作系统分类
A、按系统类型:
商业系统、专用系统、开源系统。
B、按响应时间:
硬实时系统、软实时系统。
C、按软件结构:
单体结构(uCOS)、分层结构(MS-DOS)、微内核结构(Vxworks)。
2、任务管理
(1)嵌入式操作系统的任务管理可以分为
A、单道程序技术:
操作系统中,任何时候只能有一个程序在运行。
B、多道程序技术:
操作系统中,允许多个程序同时存在并运行。
(2)进程
进程,简单的说,是一个正在运行的程序。
进程与程序既有联系又有区别,主要表现为下面结构方面:
A、程序由数据和代码两部分内容组成,它是一个静态的概念。
而进程是正在执行的程序,它也由两部分组成:
程序和该程序的运行上下文。
它是一个动态的概念。
B、程序和进程之间并不是一一对应的。
一个进程在运行的时候可以启动一个或多个程序。
反之,同一个程序也可能由多进程同时执行。
C、程序可以作为一种软件资源长期保存,以文件的形式存放在光盘或硬盘上,而进程则是一次执行的过程,它是暂时的,是动态的产生和终止。
一个进程至少应包括三个方面:
相应的程序、CPU上下文、一组系统资源。
进程有三个特性:
A、动态性:
进程是正在运行的程序,而程序的运行状态是不断变化的。
B、独立性:
进程是系统资源的使用单位,每个进行有自己的运行上下文和内部状态。
C、并发性:
宏观来看,系统中同时有多个进程存在,它们相互独立地运行。
注:
对于并发的理解。
在单CPU的情况下,所谓的并发性指的是宏观上的并发运行,而微观上还是顺序进行,各个进程轮流去使用CPU资源。
在单核CPU中,真正的、物理上的PC寄存器只有一个,进程在轮流执行的时候,物理PC的取值也在不断变化。
而逻辑PC其实就是一个内存变量。
每个进程都有一个逻辑PC,当一个进程要运行的时候,就把它的逻辑PC装载到物理PC中去;反之,当一个进程暂不运行的时候,就把物理PC中的值保存在它的逻辑PC当中。
(3)线程
线程就是进程当中的一条执行流程。
进程其实包含两个部分:
资源平台和执行流程(线程)。
在一个进程当中,或者说在一个资源平台上,可以同时存在多个线程;可以用线程作为CPU的基本调度单位,使得各个线程之间可以并发执行;对于同一个进程当中的各个线程来说,他们可以共享该进程的大部分资源。
每个线程都有自己独立的CPU运行上下文和栈,这是不能共享的。
(4)任务
在嵌入式系统中,任务其实就是线程,它是能够独立运行的一个实体。
原因有二:
A、任务具有独立的优先级和栈空间,CPU上下文一般存放在栈空间中。
B、任务之间可以很方便地、直接地使用共享的内存单元,而不需要经过系统内核。
在多道程序的嵌入式系统中,同时存在着多个任务,这些任务之间的结构一般为层状结构,存在着父子关系。
当嵌入式内核刚刚启动的时候,只有一个任务存在,然后由该任务派生出所有其他任务。
(5)任务的创建与中止
任务的创建主要发生在以下三种情形:
A、系统初始化。
B、任务运行的过程中。
C、用户提出请求。
从技术的角度来说,实际上新任务只有一种创建的方法,也就是在一个已经存在的任务中,通过调用相应的系统函数来创建一个新的任务。
任务的创建只要有两种可能的实现模型:
fork/exec和spawn。
两种模型的差别主要在于内存的分配方式。
A、fork/exec模型下,首先调用fork函数为新任务创建一份与父任务完全相同的内存空间,然后再调用exec函数装入新任务的代码,并用它来覆盖原有的属于父任务的内容。
嵌入式Linux操作系统是基于fork/exec模型的。
B、spawn模式下,在创建新任务的时候,直接为它分配一个全新的地址空间,然后将新任务的代码装入并运行。
uCOS操作系统是基于spawn模型的。
任务的中止可能有多种原因,主要有下面三种情况:
A、正常退出。
B、错误推出。
C、被其他任务踢出。
在有些嵌入式系统中,尤其是一些控制系统中,它的某些任务被设计为“死循环”的模式,一直循环下去,不会中止。
(6)任务的状态
任务有三种基本状态:
A、运行状态:
任务占有CPU,并在CPU上运行。
B、就绪状态:
任务已经具备运行的条件,在等待CPU空闲。
C、阻塞状态:
任务因为正在等待某种事件的发生而暂时不能运行。
对于就绪状态和阻塞状态,它们的相同之处在于,任务都是处于暂停状态,没有运行。
不同之处在于,暂停的原因是不一样的,导致就绪状态的原因是外因,是操作系统的CPU正忙,而导致阻塞状态的原因是内因,是任务自身的问题。
任务状态的四种转换关系:
A、运行阻塞:
任务由于等待某个时间被阻塞起来。
B、运行就绪:
调度器由于某种原因(例如优先级)选择了另一个任务去运行。
C、就绪运行:
CPU空闲了,处于就绪状态的任务被调度器选中去运行。
D、阻塞就绪:
任务的等待事件完成,具备了继续运行的条件。
(7)任务控制块TCB
任务控制块TCB,就是在操作系统中,用来描述和管理一个任务的数据结构。
系统为每一个任务都维护了一个相应的TCB,用来保存该任务的各种相关信息。
它的主要内容包括下面几项:
A、任务的管理信息:
任务的标识ID、状态、优先级、调度信息、各种队列指针等。
B、CPU上下文信息:
CPU各种寄存器当前的值以及逻辑寄存器。
C、资源管理的信息:
段表地址、页表地址、根目录、文件描述字等。
当需要创建一个任务的时候,就为它生成一个TCB,并初始化这个TCB的内容;当需要中止一个任务的时候,只要回收它的TCB就可以了。
(8)任务的切换
基本思想:
把当前任务的运行上下文保存起来,并恢复新任务的上下文。
任务切换通常有下面的基本步骤:
A、将处理器的运行上下文保存在当前任务的TCB中。
B、更新当前任务的状态,从运行状态变为就绪状态或阻塞状态。
C、按照一定的策略,从所有处于就绪状态的任务中选择一个去运行。
D、修改新任务的状态,从就绪状态变成运行状态。
E、根据新任务的TCB的内容,恢复它的运行上下文环境。
在一个多任务的操作系统中,采用任务队列的方式来组织它的所有任务。
由操作系统来维护一组队列,用来表示系统当中所有任务的当前状态,不同的状态用不同的队列来标志。
(9)任务的调度
调度器可以看作CPU的资源管理者。
任务调度的首要问题是:
何时进行调度,即调度发生的时机。
一般有下面几种情形:
A、一个新任务被创建时,需要决定运行新任务还是继续执行父任务。
B、一个任务运行结束时,需要从就绪队列中选择某个任务去运行。
C、一个任务运行阻塞时,需要选择另一个任务去运行。
D、一个I/O操作完成,任务阻塞结束,立即执行新就绪任务还是继续执行被中断任务。
E、一个时钟节拍结束时,需要对就绪任务重新调度。
任务调度的第二个问题是:
如何调度,即调度方式。
主要有两种方式:
A、不可抢占调度方式:
例如时间片轮转。
B、可抢占调度方式:
例如优先级调度。
实时操作系统大都采用可抢占调度方式。
任务调度的第三个问题是:
调度算法。
A、先来先服务算法:
按照任务到达的先后次序进行调度,是不可抢占的调度方式。
B、短作业优先算法:
各个任务开始执行之前,事先预计好它的执行时间,从中选择用时较短的任务优先执行。
C、时间片轮转算法:
所有的就绪任务按照先来先服务的原则排成一个队列。
在每次调度的时候,把处理器分派给队列当中的第一个任务,让它去执行一小段时间。
在这个时间段里任务被阻塞或由于其他原因暂停,或者任务的时间片用完了,它会被送到就绪队列的末尾,然后调度器再执行当前队列的第一个任务。
这种算法的优点是各个就绪任务都平均地分配使用CPU的时间,每个就绪任务都能一直保持着活动性。
时间片轮转法有一个默认前提,即位于就绪队列中的各个任务是同等重要的。
D、优先级算法:
给每个任务都设置一个优先级。
然后在任务调度的时候,在所有处于就绪状态的任务中选择优先级最高的那个任务去运行。
采用优先级调度算法的一个问题是可能会发生优先级反转(教程P285),出现任务“饥饿”现象。
(10)实时系统调度
对于RTOS调度器来说,任务之间的公平性并不是最重要的,它追求的是实时性。
A、单调速率调度算法(RMS):
任务的优先级与它的周期表现为单调函数的关系,任务的周期越短,优先级越高,任务的周期越长,优先级越低。
RMS假定任务是相同独立的、周期性的、任务在能够在任何位置被抢占,而实际中的系统,任务之间需要进行通信和同步,这是一种理想的调度方法,实际中并不一定存在。
B、最早期限优先法(EDF):
根据任务的截止时间来确定其优先级,对于时间限期最近的任务,分配最高的优先级。
当有一个新的任务处于就绪状态时,各个任务的优先级就有可能要进行调整,选择截止时间最近的任务去运行。
(11)任务互斥
A、任务之间的关系:
相互独立、任务互斥、任务同步、任务通信。
B、任务间的互斥:
当前已经有一个任务正在访问临界区共享数据,那么其他任务暂时不能访问。
C、提出互斥访问的四个条件:
a、在任何时候最多只能有一个任务位于它的临界区中。
b、不能事先假定CPU的个数和系统的运行速度。
c、没有任务位于它的临界区中,它不妨碍其他任务去访问临界区资源。
d、任何一个任务进入临界区的请求必须在有限的时间内得到满足,不能无限期。
D、任务互斥的解决方案:
a、关闭中断法
b、繁忙等待法
c、信号量处理
E、临界资源:
一次只允许一个进程使用的资源称为临界资源;
临界区:
互斥进程中使用临界资源的那部分程序称为临界区;
访问临界资源应遵循的准则:
a、空闲让进:
当临界资源空闲时,任何有权使用临界资源的进程可立即进入。
b、忙则等待:
同时有多个进程申请进入临界区时,只能让一个进程进入临界区,其他进程必须等待。
c、有限等待:
对于要求访问临界资源的进程,应能在有限时间内得到满足。
进入临界区的进程应在有限时间内完成操作并释放该资源,退出临界区。
d、让权等待:
目前进不了临界区,处于等待状态的进程应放弃占用CPU,以使其他进程有机会得到CPU的使用权。
(12)信号量
信号量记录当前可用资源的数量。
信号量由操作系统维护,任务不能直接去修改它的值,只能通过初始化和两个标准原语(PV原语)来对它进行访问。
注:
关于原语。
原语通常由若干条语句组成,用来实现某个特点的操作,并通过一段不可分割或不可中断的程序来实现其功能。
原语时操作系统内核的一个组成部分,必须在内核态下执行。
原语的不可中断性是通过在其执行过程中关闭中断来实现的。
关键要理解PV原语的实现:
P(semaphoresS)
{
--S.count;//申请一个资源
if(S.count<0)//没有空闲资源
{
将当前任务阻塞起来,加到阻塞队列末尾,调度新的任务运行。
}
}
V(semaphoresS)
{
++S.count;//释放一个资源
if(S.count<=0)//有任务被阻塞
{
从阻塞队列中取出一个任务,把该任务改为就绪状态,插入就绪队列。
}
}
利用操作系统提供的信号量机制,可以方便、有效地实现对临界资源的互斥访问,优点有两个:
A、可以设置信号量的计数值,从而允许多个任务同时进入临界区。
B、当一个任务暂时无法进入临界区时,它会被阻塞起来,将CPU让给其他任务。
(13)任务同步
任务之间的同步可以使用信号量机制,通过引入PV操作来设定两个任务在运行时的先后顺序。
例如,可以把信号量视为某个共享资源的当前个数,然后由一个任务负责生成这种资源,而另一个任务则负责消费这种资源,这样可以构成两个任务之间的先后顺序。
在具体实现上,一般把信号量的初始值设为N,N大于或等于0。
然后在一个任务内使用V原语,把信号量加1,而在另外一个任务内部使用P原语,将信号量减1,从而实现这两个任务之间的同步关系。
(14)死锁
在一组任务中,每个任务都占用着若干资源,同时又在等待其他任务占用的资源,从而造成所有任务都无法进展下去的现象,这称为死锁现象。
除了资源的竞争之外,PV操作使用不当也会引起死锁。
(15)信号
所谓信号,是系统给任务的一个指示,表明某个异步事件已经发生了。
该事件可能来自外部,也可能来自内部。
信号机制也可以称为软中断机制。
信号机制与中断处理机制非常相似,相同点:
A、都具有中断性。
B、都有相应的服务程序。
C、都可以屏蔽响应。
不同点:
A、中断由硬件或特定指令产生,而信号由系统调用产生。
B、中断触发后,硬件会根据中断向量找到相应的处理程序执行;而信号则通过发送信号的系统调用来触发,系统不一定马上对它进行处理。
C、中断处理程序在系统内核的上下文中运行,是全局的;而信号处理程序在相关任务的上下文中运行,是任务的一个组成部分。
(16)任务间通信
任务之间的通信可以分为两种类型:
A、低级通信:
只能传递状态和整数值等控制信息,例如信号量机制。
B、高级通信:
能够传输任意数量的数据,只要有三类:
共享内存、消息传递和管道。
任务之间的通信方式有两种:
A、直接通信:
通信双方必须明确知道与之通信的对象。
例如PV原语。
B、间接通信:
通信双方不需指出消息的来源和去向,通过共享邮箱发送和接收消息。
邮箱只能存放单条消息,它提供一种低开销的消息传递机制,只有空和满两种状态。
消息队列与邮箱类似,但是可以同时存放若干条消息,提供了一种任务间缓冲通信的方法。
管道由UNIX首创,以文件系统为基础,连接两个任务之间的一个打开的共享文件,专用于任务直接的数据通信。
3、存储管理
(1)、存储器系统的层次架构
计算机系统的存储器被组织城一个金字塔的层次结构。
自上而下为:
CPU内部寄存器、芯片内部高速缓存(cache)、芯片外部高速缓存(SRAM、SDRAM、DRAM)、主存储器(FLASH、EEPROM)、外部存储器(磁盘、光盘、CF卡、SD卡)和远程二级存储器(分布式文件系统、WEB服务器),6个层次的结构。
上述设备从上而下,依次速度更慢、容量更大、访问频率更小,造价更便宜。
(2)、高速缓存(cache)
工作原理(参照教程126页,博客画不了图):
主要利用了程序的局部性特点。
地址映象是指把主存地址空间映象到cache的地址空间。
地址变换是指当程序或数据已经装入到cache后,在实际运行过程中,把主存地址如何编程cache空间的地址。
常用的地址映象和地址变换的方式有:
(教程127页)
直接映象和变换:
速度快,造价低,但有局限性,不能充分利用cache的好处。
组相联地址映象和变换:
速度稍慢但是命中率高。
全相联地址映象和变换:
可以任意映射。
常用的cache替换算法:
轮转法和随机替换算法。
高速缓存的分类:
统一cache和独立的数据/指令cache
写通cache和写回cache
读操作分配cache和写操作分配cache
(3)、存储管理单元(MMU)
MMU在CPU和物理内存之间进行地址转换,将地址从逻辑空间映射到物理空间,这个过程称为内存映射。
MMU主要完成下面的工作:
A. 虚拟存储空间到物理空间的映射。
B. 存储器访问权限的控制。
C. 设置虚拟存储空间的缓冲特性。
嵌入式系统中常常采用页式存储管理。
为了管理这些页引入了页表的概念。
页表是位于内存中的表,它的每一行对应虚拟存储空间的一个页,该行包含了该虚拟内存页对应的物理内存页的地址、该页的访问权限和该页的缓冲特性等。
从虚拟地址到物理地址的变换过程就是查询页表的过程。
由于页表存储在内存中的,整个查询过程需要付出很大的代价。
根据程序局部性的特点,增加了一个小容量、高速度的存储部件来存放当前访问需要的地址变换条目,这个存储部件称为:
地址转换后备缓冲器(TLB)。
当CPU访问内存时,首先在TLB中查找需要的地址变换条目,如果该条目不存在,CPU再从内存中的页表中查询,并把相应的结果添加到TLB中,更新它的内容。
嵌入式系统中虚拟存储空间到物理空间的映射以内存块为单位进行。
即虚拟存储空间中一块连续的存储空间被映射到物理存储空间中同样大小的一块连续存储空间。
在页表和TLB中,每一个地址变换条目实际上记录了一个虚拟存储空间的内存块的基地址与物理存储空间相对应的一个内存块的基地址之间的对应关系。
在MMU中实现虚拟地址到物理地址的映射是通过两级页表来实现的。
禁止MMU时,所有物理地址和虚拟地址相等,即使用平板存储模式。
(4)、内存保护
操作系统通常利用MMU来实现操作系统内核与应用程序之间的隔离,以及应用程序与应用程序之间的隔离。
内存保护包含两个方面的内容:
A. 防止地址越界,每个应用程序都有自己独立的地址空间。
B. 防止越权操作,每个应用程序都有自己的访问权限。
(5)、实模式与保护模式
在嵌入式系统中,常见的存储管理方案可以分为两大类:
实模式和保护模式。
实模式:
内存的平面使用模式。
特点有:
A. 不划分“系统空间”与“用户空间”,无须进行地址映射。
B. 操作系统与应用程序之间不再有物理的边界。
C. 系统中的“任务”或“进程”,实际上全是内核线程。
在实模式下,内存布局可以分为5个段:
A. 代码段:
包含操作系统和应用程序的所有代码。
B. 数据段:
所有带有初始值的全局变量。
C. BSS段:
所有未带初始值的全局变量。
D. 堆空间:
动态分配的内存空间。
E. 栈空间:
保存上下文以及函数调用时的局部变量和形参。
在实模式存储管理方案下,主要的工作在于堆空间的管理,即如何来管理空闲的堆空间、如何来分配内存、如何来回收内存等等。
保护模式:
处理器中必须有MMU硬件并启用。
特点有:
A. 系统内核和用户程序都有各自独立的地址空间。
B. 每个应用程序只能访问自己的地址空间,不能去破坏操作系统和其他应用程序的代码和数据。
(6)、分区存储管理
为了实现多道程序系统而采用的最简单的内存管理。
基本思路:
把整个内存划分为两大区域,即系统区和用户区,然后再把用户区划分为若干个分区,每个任务占有其中的一个分区。
这样,在内存当中就同时保留多个任务,让他们共享整个用户区,从而实现多个任务的并发运行。
分区存储管理又可以分为两类:
固定分区和可变分区。
固定分区:
各个用户分区的个数、位置和大小一旦确定后,就固定不变,不能再修改。
优点:
易于实现,系统开销较小。
缺点:
内存利用率不高,分区总数固定。
可变分区:
动态创建,在装入一个程序时,系统将根据它的需求和内存空间的使用情况来决定是否分配。
优点:
动态变化,非常灵活。
缺点:
可能存在外碎片。
在实现可变存储管理技术的时候,需要考虑三个方面的问题:
A. 内存管理的数据结构
B. 内存的分配算法
C. 内存的回收算法
(7)、地址映射
地址映射也叫地址重定位。
逻辑地址和物理地址是完全不同的,不能用逻辑地址来直接访问内存单元。
为了保证CPU在执行指令的时候,可以正确地访问内存单元,需要将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。
这个过程称为:
地址映射。
地址映射由存储管理单元MMU来完成。
地址映射主要有两种方式:
静态地址映射和动态地址映射。
静态地址映射:
当用户程序被装入内存时,直接对指令代码进行修改,一次性地实现逻辑地址到物理地址的转换。
动态地址映射:
当用户程序被装入内存时,不对指令代码做任何修改,而是在程序的运行过程中,当它需要访问内存单元的时候,再来进行地址转换。
在具体实现时,这项转换工作一般是由硬件的地址映射机制来完成的。
通常设置一个基地址寄存器,或者叫重定位寄存器。
当一个任务被调度运行时,就把它所在分区的起始地址装入到整个寄存器中。
然后,在程序运行的过程中,当需要访问某个内存单元时,硬件就会自动地将其中的逻辑地址加上基地址寄存器中的内容,从而得到实际的物理地址,并且按照这个物理地址区执行。
这个基地址寄存器位于MMU的内部,整个地址映射过程是自动运行的。
从理论上说,每访问一次内存都要进行一次地址映射。
(8)、页式存储管理(重点)
基本思路:
把物理内存划分为许多固定大小的内存块,称为物理页面;把逻辑地址空间也划分为大小相同的块,称为逻辑页面。
当一个用户程序被装入内存时,不是以整个程序为单位,把它存放在一整块连续的区域,而是以页面为单位来进行分配的。
对于一个大小为N的页面程序,需要有N个空闲的物理页面来把它装载。
这些物理页面不一定是要连续的。
在页式存储管理中需要解决三个问题:
数据结构、内存分配与回收、地址映射。
数据结构有两个:
页表和物理页面表。
A. 页表:
给出了任务逻辑页面号和内存中物理页面号之间的对应关系。
B. 物理页面表:
描述内存空间中,各个物理页面的使用情况。
内存的分配过程:
A. 对于一个新来的任务,计算它所需要的页面数N,然后查看位示图,看是否还有N个空闲的物理页面。
B. 如果有足够的空闲物理页面,就去申请一个页表,其长度为N,并把页表的起始地址填入到该任务的控制块中。
C. 分配N个空闲的物理页面,把他们的变换填到页表中,建立逻辑页面与物理页面直接的对应关系。
D. 修改位示图,对刚刚被占用的那些物理页面进行标记。
地址映射的基本思路:
A. 逻辑地址分析:
对逻辑地址,找到它所在的逻辑页面,以及它在页面内的偏移地址。
B. 页表查找:
根据逻辑页面号,从页表中找出它对应的物理页面号。
C. 物理地址合成:
根据物理页面号和页内偏移地址,最终确定物理地址。
逻辑地址分析:
页面的大小都是2的整数次幂。
对于给定的一个逻辑地址,可以直接把它的高位部分作为逻辑页面号,把它的低位部分作为页内偏移地址。
例如,假设页面的大小是4KB,即2的12次幂,逻辑地址为32为,那么在一个逻辑地址当中,最低12位为页内偏移地址,而剩下的20位就是逻辑页面号。
计算方法:
逻辑页面号=逻辑地址/页面大小
页内偏移量=逻辑地址%页面大小
页表查找:
页表作为操作系统的一个数据结构,通常保存在内核的地址空间中。
页表基地址寄存器用来指向页表的起始地址;页表长度寄存器用来指示页表的大小,即对于当前任务,它总共包含有多少个页面。
物理地址合成:
假设物理页面号为f,页内偏移地址为offset,每个页面大小为2n,那么相应的物理地址为:
f×2n+offset。
(9)、虚拟存储管理
程序局部性原理:
时间局限性和空间局限性。
虚拟页式存储管理:
在页式管理的基础上,增加了请求调页和页面置换的功能。
基本思路:
当一个用户程序需要调入内存去运行时,不是将这个程序的所有页面都装入内存,而是只装载部分的页面,就可以启动这个程序运行。
在运行过程中,如果发现要执行的指令或者访问的数据不在内存当中,就向系统发出缺页中断请
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 操作系统 复习 大纲