嵌入式系统第六章嵌入式Linux操作系统.ppt
《嵌入式系统第六章嵌入式Linux操作系统.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统第六章嵌入式Linux操作系统.ppt(87页珍藏版)》请在三一办公上搜索。
1、第5章 嵌入式Linux操作系统,5.1 与Linux相关术语,GNUGUN项目(GNU Project)开始于1984年,主要由自由软件基金(Free Software FoundationFSF)资助的一个项目,目标是开发一个自由的、UNIX类型的操作系统,称为GNU系统。GNU是“GNUs Not UNIX”的首字母的递归缩写。GPL所有的GNU软件和派生工作均遵循GNU通用公共许可证,即GPL。,5.1 与Linux相关术语,GNU LGPL(Library General Public License程序库公共许可证)允许用户在自己的应用程序中使用程序库,即使不公开自己的源代码。用户
2、必须能够获得在应用程序中使用的程序库的源代码,并且允许用户对这些程序库进行修改。遵循LGPL的一种方法是,随应用程序一起发布目标代码以及可以将这些目标程序和受LGPL保护的程序库链接起来的makefile文件。遵循LGPL的另一种比较好的方法是使用动态链接。FSF:Free Software Foundation 自由软件基金会,5.2 嵌入式Linux操作系统,5.2.1 Linux介绍 技术上说Linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完成的操作系统,还需要加载库文件、应用程序等,才可以形成完整的操作系统。一套基于L
3、inux内核的完整操作系统叫做Linux操作系统。Linux操作系统具备结构清晰、功能简介等特征,逐渐成为一个稳定可靠、功能完善的操作系统。作为一个操作系统,Linux几乎满足当今Unix操作系统的所有要求。,Linux具有的特点,1、完全免费2、开放型3、支持多用户访问和多任务编程 4、良好的用户界面5、支持多种文件系统 6、采用虚拟内存管理技术7、设备独立性8、丰富的网络功能9、可靠的系统安全10、良好的可移植性,完整的Linux架构图,作为一个完成的操作系统,Linux具有稳定而强大的功能,想要访问任何非自己的存储器空间的进程只能通过系统调用来达成。一般进程是处于用户模式底下,而运行系统
4、调用时会被切换成内核模式,所有的特殊指令只能在内核模式运行,此措施让内核可以完美管理系统内部与外部设备,并且拒绝无权限的进程提出的请求。因此理论上任何应用程序运行时的错误,都不可能让系统崩溃。,5.2.2 Linux作为嵌入式操作系统的优势1、支持多种硬件平台 2、占有较少的硬件资源3、高可定制性 4、具有实时处理能力 5、具备强大的网络功能 Linux作为嵌入式操作系统也存在着不足,主要表现在集成开发环境有待改善。,5.2.3 进程管理进程的基本概念 进程就是运行中的程序。一个运行着的程序,可能有多个进程。对于进程来说,可以看成是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行
5、活动,是处于活动状态的计算机程序。,进程的属性 进程的定义:一个进程是一个程序的一次执行的过程;程序是静态的,它是一些保存在磁盘上的可执行的代码和数据集合;进程是一个动态的概念,它是Linux系统的基本的调度单位。一个进程由如下元素组成:程序读取的上下文,它表示程序读取执行的状态。程序当前执行的目录。程序服务的文件和目录。程序访问的权限。内存和其他分配给进程的系统资源。,Linux进程中最知名的属性就是它的进程号(Process Idenity Number,PID)和它的父进程号(Parent Process ID,PPID)。PID、PPID都是非零正整数。一个PID唯一地标识一个进程。一
6、个进程创建新进程称为创建了子进程(Child Process)。相反地,创建子进程的进程称为父进程。所有进程追溯其祖先最终都会落到进程号为1的进程身上,这个进程叫做init进程,是内核自举后第一个启动的进程。init进程扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。,Linux下进程的结构 代码段是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。而数据段则存放程序的全局变量、常数及动态数据分配的数据空间。堆栈段存放的就是子程序的返回地址、子程序的参数及程序的局部变量。堆栈段包含在进程控
7、制块PCB(Process Control Block)中。PCB处于进程核心堆栈的底部,不需要额外分配空间。,进程状态进程在生存周期中的各种状态及状态的转换。Linux系统的进程状态模型的各种状态:用户状态:进程在用户状态下运行的状态。内核状态:进程在内核状态下运行的状态。内存中就绪:进程没有执行,但处于就绪状态,只要内核调度它,就可以执行。内存中睡眠:进程正在睡眠并且进程存储在内存中,没有被交换到SWAP设备。就绪且换出:进程处于就绪状态,但是必须把它换入内存,内核才能再次调度它运行。睡眠且换出:进程正在睡眠,且被换出内存。被抢先:进程从内核状态返回用户状态时,内核抢先于它做了上下文切换,
8、调度了另一个进程。原先这个进程就处于被抢先状态。创建状态:进程刚被创建。该进程存在,但既不是就绪状态,也不是睡眠状态。这个状态是除了进程0以外的所有进程的最初状态。僵死状态(zombie):进程调用exit结束,进程不再存在,但在进程表项中仍有记录,该记录可由父进程收集。,进程的创建与结束 在Linux系统中,通常使用fork()系统调用用来复制一个现有进程,从而创建一个全新的进程。被复制的进程被称为父进程,新产生的进程被称为子进程。为了方便用户处理父进程与子进程之间的一些事物,Linux允许父进程在创建了进程之后,通过调用wait()先进入等待状态,以使子进程先运行,然后再决定自己的进一步行
9、为,这成为父进程的阻塞方式。进程的结束可以使用exit()系统调用,无论在执行到什么位置,只要执行到exit系统调用,进程会停止所有操作并将其占用的资源释放掉。,进程的创建与结束有一个更简单的执行其他程序的函数system,参数string传递给一个命令解释器(一般为sh)执行,即string被解释为一条命令,由sh执行该命令。除了system之外,系统调用exec来执行一个可执行文件,来代替当前进程的执行映像。系统调用exit的功能是终止发出调用的进程。父进程和子进程的关系是管理和被管理的关系,当父进程终止时,子进程也随之而终止。但子进程终止时,父进程并不一定终止。,进程的组成,在Linux
10、中,进程是以进程号PID(Process ID)作为标示。任何对进程进行的操作都要给与其相应的PID号。每个进程都属于一个用户,进程要配备其所属的用户编号UID。此外,每个进程都属于多个用户组,所以进程还要配备其归属的用户组编号GID的数组。进程运行的环境成为进程上下文。Linux中进程的上下文由进程控制块PCB(Process Control Block)、正文段、数据段以及用户堆栈组成。其中,正文段存放该进程的可执行代码,数据段存放进程中静态产生的数据结构,而PCB包括进程的编号、状态、优先级以及正文段和数据段中数据分布的大概情况。一个称作进程表(Process Table)的链表结构将系
11、统中所有的PCB块联系起来。,启动一个进程有两个主要途径:手工启动和调度启动,后者是事先进行设置,根据用户要求自行启动。由用户输入命令,直接启动一个进程便是手工启动进程。但手工启动进程又可以分为很多种,根据启动的进程类型不同、性质不同,实际结果也不一样。(1)前台启动前台启动是手工启动一个进程的最常用的方式。用户键入一个命令“df”,就已经启动了一个进程,而且是一个前台的进程。(2)后台启动直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果。,进程的状态和调度 一般来说,所有进程都要经历三种状态,即运行态、就绪态和阻塞态,在Linux系统中将上述三种状态进行
12、重新组织,得到了Linux进程的几个状态:,进程的调度为了让Linux来管理系统中的进程,每个进程用一个task_struct数据结构来表示(任务与进程在Linux中可以混用)。数组task包含指向系统中所有task_struct结构的指针。这意味着系统中的最大进程数目受task数组大小的限制,缺省值一般为512。创建新进程时,Linux将从系统内存中分配一个task_struct结构并将其加入task数组。当前运行进程的结构用current指针来指示。,Linux还支持实时进程。这些进程必须对外部时间作出快速反应(这就是“实时”的意思),系统将区分对待这些进程和其他进程。虽然task_str
13、uct数据结构庞大而复杂,但它可以分成一些功能组成部分:State 进程在执行过程中会根据环境来改变state。SchedulingInformation 调度器需要这些信息以便判定系统中哪个进程最迫切需要运行。Identifiers 系统中每个进程都有进程标志。进程标志并不是task数组的索引,它仅仅是个数字。Inter-ProcessCommunication Linux支持经典的Unix IPC机制。Links Linux系统中所有进程都是相互联系的。TimesandTimers 核心需要记录进程的创建时间以及在其生命期中消耗的CPU时间。Filesystem 进程可以自由地打开或关闭文
14、件,进程的task_struct结构中包含一个指向每个打开文件描叙符的指针以及指向两个VFSinode的指针。Virtualmemory 多数进程都有一些虚拟内存(核心线程和后台进程没有),Linux核心必须跟踪虚拟内存与系统物理内存的映射关系。ProcessorSpecificContext 进程可以认为是系统当前状态的总和。,Linux使用用户和组标志符来检查对系统中文件和可执行映象的访问权限。Linux系统中所有的文件都有所有者和允许的权限,这些权限描叙了系统使用者对文件或者目录的使用权。基本的权限是读、写和可执行,这些权限被分配给三类用户:文件的所有者,属于相同组的进程以及系统中所有进
15、程。每类用户具有不同的权限,例如一个文件允许其拥有者读写,但是同组的只能读而其他进程不允许访问。,task_struct结构中有四对进程和组标志符:uid,gid 表示运行进程的用户标志符和组标志符。effectiveuidandgid 有些程序可以在执行过程中将执行进程的uid和gid改成其程序自身的uid和gid(保存在描叙可执行映象的VFSinode属性中)。这些程序被称为setuid程序,常在严格控制对某些服务的访问时使用,特别是那些为别的进程而运行的进程,例如网络后台进程。有效uid和gid是那些setuid执行过程在执行时变化出的uid和gid。当进程试图访问特权数据或代码时,核心
16、将检查进程的有效gid和uid。filesystemuidandgid 它们和有效uid和gid相似但用来检验进程的文件系统访问权限。如运行在用户模式下的NFS服务器存取文件时,NFS文件系统将使用这些标志符。此例中只有文件系统uid和gid发生了改变(而非有效uid和gid)。这样可以避免恶意用户向NFS服务器发送KILL信号。saveduidandgid POSIX标准中要求实现这两个标志符,它们被那些通过系统调用改变进程uid和gid的程序使用。当进程的原始uid和gid变化时,它们被用来保存真正的uid和gid。,进程调度机制的设计,还对系统复杂性有着极大的影响,常常会由于实现的复杂程
17、度而在功能和性能方面做出必要的权衡和让步。另外,进度调度的机制还要考虑到“公正性”,让系统所有进程都有机会向前推进,尽管其进度各有不同,并最终受到CPU速度和负载的影响。更重要的是,还要防止死锁的发生,以及防止对CPU能力的不合理使用,也就是说要防止CPU尚有能力且有进程等执行,却由于某种原因而长时间得不到执行的情况。一旦这些情况发生,调度机制还能识别与化解。,调度器必须选择最迫切需要运行而且可以执行的进程来执行。可运行进程是一个只等待CPU资源的进程。Linux使用基于优先级的简单调度算法来选择下一个运行进程。当选定新进程后,系统必须将当前进程的状态,处理器中的寄存器以及上下文状态保存到ta
18、sk_struct结构中。同时它将重新设置新进程的状态并将系统控制权交给此进程。为了将CPU时间合理的分配给系统中每个可执行进程,调度管理器必须将这些时间信息也保存在task_struct中。,在每个进程的task_struct结构中有以下四项:policy、priority、counter、rt_priority。这四项是选择进程的依据。其中,policy是进程的调度策略,用来区分实时进程和普通进程,实时进程优先于普通进程运行;priority是进程(包括实时和普通)的静态优先级;counter是进程剩余的时间片,它的起始值就是priority的值;由于counter在后面计算一个处于可运行
19、状态的进程值得运行的程度goodness时起重要作用,因此,counter也可以看作是进程的动态优先级。rt_priority是实时进程特有的,用于实时进程间的选择。,进程调度的核心在几个位置调用调度管理器。如当前进程被放入等待队列后运行或者系统调用结束时,以及从系统模式返回用户模式时。此时系统时钟将当前进程的counter值设为0以驱动调度管理器。每次调度管理器运行时将进行下列操作:kernelwork 调度管理器运行底层处理程序并处理调度任务队列。Currentprocess 当选定其他进程运行之前必须对当前进程进行一些处理。,如果当前进程的调度策略是时间片轮转,则它被放回到运行队列。如果
20、任务可中断且从上次被调度后接收到了一个信号,则它的状态变为运行态。如果当前进程的状态是Running,则状态保持不变。那些既不处于Running状态又不是可中断的进程将会从运行队列中删除。这意味着调度管理器选择运行进程时不会将这些进程考虑在内。调度器在运行队列中选择一个最迫切需要运行的进程。如果运行队列中存在实时进程(那些具有实时调度策略的进程),则它们比普通进程更多的优先级权值。在存在多个相同优先级进程的平衡系统中,每个进程被依次执行,这就是RoundRobin策略。然而由于进程经常需要等待某些资源,所以它们的运行顺序也常发变化。如果系统选择其他进程运行,则必须被挂起当前进程且开始执行新进程
21、。进程执行时将使用寄存器、物理内存以及CPU。每次调用子程序时,它将参数放在寄存器中并把返回地址放置在堆栈中,所以调度管理器总是运行在当前进程的上下文。,进程的切换发生在调度管理器运行之后。以前进程保存的上下文与当前进程加载时的上下文相同,包括进程程序计数器和寄存器内容。如果以前或者当前进程使用了虚拟内存,则系统必须更新其页表入口,这与具体体系结构有关。如果处理器使用了转换旁视缓冲或者缓冲了页表入口(如AlphaAXP),那么必须冲刷以前运行进程的页表入口。,5.2.4 存储管理在这里所说的存储管理一般指的是内存管理,在计算机业界,内存这个名词被广泛用来称呼 RAM(随机存取内存),计算机使用
22、随机存取内存来储存执行作业所须的暂时指令以及数据,以使计算机的 CPU能够更快速读取储存在内存的指令及数据。下面介绍Linux存储器管理几个基本概念:,存储管理的任务 存储管理是Linux中负责管理内存的模块。存储管理的任务有以下几点:屏蔽各种硬件的内存结构,并向上层返回同意的访问界面。Linux支持各种各样的硬件体系结构。对每种硬件结构,其内存的组织形式各不相同。然而,对于用户的应用程序来说,总是希望提供一个同意的界面以供调用。这样,存储模块就自然要担负这个屏蔽和转化的任务。解决进程状态下内存不足的问题,按需调页。随着硬件的发展,内存的增大,软件业相应地向着大规模方向发展。在一个多进程系统中
23、,所有进程所占用的内存总和往往会超过物理内存容量。这样就需要存储管理实现能够利用副存储器(比如硬盘)进行辅助存储的功能。存储管理机制甚至还能够处理单个进程所占用内存超过主存大小的情况。阻止进程肆意访问其他进程的地址空间和内核地址空间。由于并发执行的进程所在的地址空间都不能冲突,而进程太多,物理内存空间根本不够,故需要模拟出一个更大的虚拟逻辑空间提供给上层应用程序,并通过一个可靠的机制建立起逻辑空间到物理空间的映射关系。为进程中通信所需要的共享内存提供必要的基础。对于上层用户来讲,共享内存和普通内存是两种概念;然而对于存储管理系统来讲,这两者却都是内存中的一部分,所有内存空间的任一部分都可被划为
24、共享内存使用。因此,实现共享内存的任务就需要由存储管理模块来实现,虚拟内存 虚拟内存是现代操作系统的重要特征。对于一个多进程的操作系统来说,每个进程都要占据自己唯一的内存地址空间。虚拟内存的基本原理是将内存中一部分近期不需要的内容移出到外存上,从而让出一块内存空间,以供其他需要的内存使用。当要访问到那些已经被调出到外存的数据时,存储管理要将内存中一部分不常被访问的数据调出,让出一块空间以供需要的数据调入内存。,页面模式 页面为存储管理中调入调出的基本单位。在存储管理中,将内存划分为长度相等的页面。Linux将每个用户进程4GB长度的虚拟内存划分成固定大小的页面。其中,03GB是用户态空间,由各
25、进程独占;34GB是内核态空间,由所有进程共享,但只有内核态的进程才能访问。,按需调页 当进程访问到某个虚存地址,却发现该地址所对应的物理页面已经被换出内存时,系统会自动产生一个硬件中断,即缺页中断。在中断产生后,系统会自动调用相应的中断处理程序,来将所需的页面从外存调入,或者干脆新建一个空白页面。这个过程就叫做按需调页。,对换 对于虚拟内存页面来说,总是要将其改动过的内容写回到外存中,才能够将其丢弃。一个被更改过的内存页面,但还没有将其内容写到外存中,就称之为“脏页面”。在换入页面时,首先考虑的肯定是将“干净的”页面直接丢弃,然后将外存数据写进来,因为这样不会破坏数据的完整性。然而这是一个矛
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 第六 Linux 操作系统

链接地址:https://www.31ppt.com/p-6415019.html