优秀的毕业设计论文网
计算机 JAVA 电子信息 单片机 机械机电 模具 土木工程 建筑结构 论文
热门搜索词:网络 ASP.NET 汽车 电气 数控 PLC

嵌入式操作系统的内核研究

以下是资料介绍,如需要完整的请充值下载.
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
  
资料介绍:
内存管理模块
内存管理子系统是操作系统最重要的部分之一。从早期计算机开始,系统的内存大小就难以满足人们的需要。为了解决这个问题,可利用虚拟内存。虚拟内存通过当需要时在竞争的进程之间共享内存,使系统显得有比实际上更多的内存空间。虚拟内存 不仅仅使机器上的内存变多,内存管理子系统还提供以下功能:
1. 大地址空间  操作系统使系统显得它有比实际上大得多的内存。虚拟内存可以比系统中的物理内存大许多倍。
2. 保护  系统中每个进程有自己的虚拟地址空间。这些虚拟地址空间相互之间完全分离,所以运行一个应用的进程不能影响其他的进程。同样,硬件的虚拟内存机制允许内存区域被写保护。这样保护了代码和数据不被恶意应用重写。
3. 内存映射  内存映射用来把映像和数据文件映像到一个进程的地址空间。在内存映射中,文件的内容被直接链接到进程的虚拟地址空间。
4. 公平  物理内存分配内存管理子系统给予系统中运行的每个进程公平的一份系统物理内存。
5. 共享虚拟内存  尽管虚拟内存允许进程拥有分隔的(虚拟)地址空间,有时你会需要进程共享内存。例如系统中可能会有几个进程运行命令解释shell bash。最好是在物理内存中只有一份bash拷贝,所有运行bash的进程共享它;而不是有几份bash拷贝,每个进程虚拟空间一个。动态库是另一个常见的几个进程共享执行代码的例子。

think58 [资料来源:http://THINK58.com]


共享内存也可以被用作进程间通信(IPC)机制,两个或更多进程通过共有的内存交换信息。Linux支持Unix(tm)SystemV 的共享内存IPC。
2.2.1虚拟内存
当处理器运行一个程序时,它从内存中读取一条指令并解码。在解码该指令过程中它可能需要取出或存放内存某个位置的内容。处理器然后执行该指令并移动到程序中下一条指令。这样处理器总是访问内存来取指令或存取数据。
在虚拟内存系统中以上所有的地址都是虚拟地址而不是物理地址。处理器基于由操作系统维护的一组表中的信息,将虚拟地址转换成物理地址。
为了使这种变换容易一些,虚拟内存和物理内存都被分为合适大小的块叫做“页(page)”。这些页都有同样的大小。AlphaA XP系统上Linux使用8KB字节大小的页,Intel x86系统上使用4KB字节大小的页。在这些页中每一个都有一个唯一的号码:页帧号(Page Frame Number,PI N)。在这种分页模型中,一个虚拟地址由两部分组成:一个偏移和一个虚拟页帧号。如果页大小是4KB字节,虚拟地址的11至0位包含偏移和虚拟页帧号。每当处理器面临一个虚拟地址时,它必须析取出偏移和虚拟页帧号。处理器必须将虚拟页帧号转换成物理的页帧号,然后在该物理页中正确的偏移位置上进行访问。为了完成这些处理器要使用页表。
[资料来源:http://THINK58.com]

理论上的页表中每一项包含下列信息:
1. 有效标志,用来指示该页表项是否有效。
2. 本项所描述的物理页帧号。
3. 访问控制信息。它描述该页可以如何使用。它是否可以被写,是否包含可执行代码。
处理器使用虚拟页帧号作为进程页表的索引来检索它的页表项。如果该偏移处页表项有效,处理器将从该项取出物理页帧号。如果该页表项无效,说明处理器访问了虚拟内存中不存在的区域。在这种情况下,处理器不能解析该地址,并且必须把控制传给操作系统来解决问题。
处理器如何通知操作系统一个正确的进程试图访问一个没有有效转换的虚拟地址,这是依处理器不同而不同的。无论如何处理器能够处理它,这被称作“页故障(page fault)”。操作系统被告知故障的虚拟地址和故障原因。
如果访问的是有效的页表项,处理器取出物理页帧号,并将它乘以页的大小以得到物理内存中该页的基地址。最后,处理器将偏移加到所需的指令或数据的地址。
访问控制
页表项中也包含访问控制信息。因为处理器要使用页表项来把进程虚拟地址映射到物理地址,它可以方便地使用访问控制信息来检查并保证进程没有以其不应该采用的方式来访问内存。
有许多原因导致限制访问内存区域。有些内存,如那些包含可执行代码的,自然就是只读内存;操作系统不应该允许进程将数据写到它的可执行代码中。相反,包含数据区域的则可以被写入,但是将它当作指令来执行就会失败。大部分处理器至少有两种执行模式:户态(M户模式)和核心态(核心模式)。我们不希望核心代码被用户执行或核心数据结构被访问,除非处理器运行在核心态下。

think58 [来源:http://think58.com]


2.3进程管理
进程执行操作系统中的任务。一个程序是保存在一个磁盘的可执行映像中的机器代码指令和数据的集合,并且,实际上是一个被动实体;一个进程可以被认为是一个执行中的计算机程序。它是一个动态实体,总是随着机器代码指令随处理器的执行而处于变化之中。除了程序的指令和数据,进程还包括程序计数器和所有CPU寄存器,以及含有例程参数、返回地址和保存的变量等临时变量的进程栈(stack)。当前正执行的程序或说进程,包含所有处理器当前的行为。Linux是一个多进程操作系统。进程是独立的任务,有自己的权利和责任。若一个进程崩溃并不会引起系统中另一个进程崩溃。每个单独的进程运行在自己的虚拟地址空间,并且只能通过安全的内核管理机制和其他进程交互。
在进程的生存期(life time)内将使用许多系统资源。它将使用系统的CPU来运行白己的指令并使用系统的物理内存来保存自己和自己的数据;将打开和使用文件子系统中的文件并直接或间接地使用系统中的物理没备。Linux必须跟踪进程本身和它拥有的系统资源,来保证它能公平地管理该进程和系统中其他进程。如果一个进程独自占有系统中的大部分物理内存或其CPU,系统中其他进程来说将是不公平的。
2.3.1 Linux进程数据结构
为了使Linux可以管理系统中的进程,每个进程通过一个task _struct数据结构表示。Task向量是一个指向系统中所有task_struct数据结构的指针数组。这意味着系统中最大进程受限于task向量的大小,缺省情况下它有512项。当进程被创建时,从系统内存中分配一个新的task¬_struct并把它加入到task向量中。为了便于查找,当前运行的进程由current指针来指向。 copyright think58 [资料来源:http://think58.com]
除了普通类型的进程,Linux还支持实时进程。这些进程必须对外部事件反应迅速(从而得到名字“实时”),并且它们被调度器区别于普通用户进程对待。尽管task_struct数据结构很大很复杂,但它的字段可以被分成几个功能区。
1. 状态  随着进程执行,它根据其环境改变状态。Linux进程有以下状态:
1) 运行  进程正在运行之中(它是系统中的当前进程)或是已经准备好运行(等待被分配到系统的一个CPU上)。
2) 等待  进程正在等待一个事件或一个资源。Linux区分两种类型的进程;可中断的和不可中断的。可中断等待进程可以被信号中断,而不可中断等待进程直接等待硬件条件,并且在任何环境下都不会被中断。
3) 停止  进程停止了,通常是通过接收一个信号。一个正在被调试的进程可以处于停止状态。
4) 死亡  这是一个被终止的进程,由于某种原因,仍在task向量中有一个task_struct数据结构,正像其名字那样,它是一个死去的进程。
2. 调度  信息调度器需要这些信息以公平地决定系统中哪个进程最值得运行。
3. 标识  系统中每个进程有一个进程标识。进程标识不是task向量的索引,它只是一个简单的数。每个进程还有用户和组标识,这些被用来控制本进程对系统中文件和设备的访问。

copyright think58 [资料来源:http://www.THINK58.com]


4. 进程间通信  Linux支持经典的UNIXTM IPC机制如信一号、管道和信号灯,以及System V IPC机制如共享内存、信号灯和消息队列。
5. 链接  在Linux系统中没有哪个进程与其他进程完全独立。除了初始进程,系统中每个进程都有一个父进程,新的进程不是被创建,它们是从先前的进程被复制(或说克隆)。每一个表示一个进程的task_struct都有指针指向其父进程及其兄弟进程(和它具有相同父进程的进程)以及它自己的子进程。你可以用ptre命令查看Linux系统中运行的进程之间的家族关系。另外系统中所有的进程都保存在一个双向链表中,它的根是init进程的task_struct数据结构。这个链表使得Linux可以查看系统中每一个进程,它需要这样来为一些命令如ps或kill提供支持。
6. 时间和时钟  内核记住进程的创建时间以及在它生存期内消耗的CPU时间。每次时钟“滴答”时,内核更新保留在jiffies中的时间量,表示当前进程花费在系统和用户态下的时间。Linux还支持进程相关的间隔定时器。进程可以用系统调用来设置定时器,以便当定时器超时后给进程自己发送信号。定时器可以是一次触发的或周期性多发的。
7. 文件系统  进程在需要的时候可以打开和关闭文件:进程的task_struct包含每个打开的文件的描述符指针以及两个VFS索引节点的指针。每个VFS索引节点唯一地描述文件系统中的一个文件或目录,并提供一个底层文件系统的统一接口。两个VFS索引节点指针第一个指向进程的根目录,第二个指向其当前的或称pwd目录。pwd从UNIX命令pwd-打印工作目录(print working directory)而来。这两个VFS索引节点使自己的count字段(field)递增来表示一个或多个进程在引用它们。这就是为什么不能删除被一个进程设成pwd的目录的原因。同样的原因,也不能删除它的子目录。 本文来自think58 [来源:http://think58.com]
8. 虚拟内存  大多数进程有一些虚拟内存(内核线程和守护进程没有),并且Linux必须跟踪虚拟内存如何映射到系统物理内存。
9. 处理器相关上下文  一个进程可以被认为是系统当前状态的总和。每当一个进程运行时,它要使用处理器的寄存器、栈等等,这是进程的上下文(context)。并且,每当一个进程被暂停时,所有的CPU相关上下文必须被保存在该进程的task_struct中。当进程被调度器重新启动时其上下文将从这里恢复。