嵌入式ppt第五章.ppt
《嵌入式ppt第五章.ppt》由会员分享,可在线阅读,更多相关《嵌入式ppt第五章.ppt(136页珍藏版)》请在文库网上搜索。
1、第第5章章 ARM-Linux内核内核目目 录录 5.1 5.1 ARM-LinuxARM-Linux概述概述5.2 5.2 ARM-LinuxARM-Linux进程管理进程管理5.3 5.3 ARM-LinuxARM-Linux内存管理内存管理5.4 5.4 ARM-LinuxARM-Linux模块模块5.5 5.5 ARM-LinuxARM-Linux中断管理中断管理5.6 5.6 ARM-LinuxARM-Linux系统调用系统调用Linux操作系统诞生于1991年,可安装在各种计算机硬件设备中,比如各种智能移动终端、路由器、台式计算机、大型机和超级计算机等。Linux支持包括x86、A
2、RM、MIPS和POWER-PC等在内的多种硬件体系结构。Linux存在着许多不同的版本,但它们都使用了Linux内核。Linux是一个一体化内核(monolithic kernel)系统。这里的“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件,一个内核不是一套完整的操作系统。一套建立在Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。LinuxLinux操作系统的灵魂是操作系统的灵魂是LinuxLinux内核内核,内核为系统其他部分提供系统服务。ARM-Linux内核是专门适应ARM体系结构设计的Linux内核,它负责整个系统的:进程管理
3、和调度、内存管理、文件管理、设备管理和网络管理等主要系统功能。ARM-Linux概述概述Part One5.15.15.1.1 GNU/Linux 操作系操作系统的基本体系的基本体系结构构用户空间包括用户应用程序和GNUC库(glibc库),负责执行用户应用程序。内核空间可以进一步划分成3层:系统调用接口(SystemCallInterface),它是用户空间与内核空间的桥梁独立于体系结构的内核代码依赖于体系结构的代码,构成了通常称为板级支持包BSP(BoardSupportPackage)的部分5.1.2 ARM-Linux内核版本及特点内核版本及特点ARM-Linux内核版本变化与内核版本
4、变化与Linux内核版本变内核版本变化保持同步。化保持同步。嵌入式linxu系统内核(如ARM_Linux内核)往往在标准linux基础上通过安装patch实现,如ARM_Linux内核就是对linux安装rmk补丁形成的,只有安装了这些补丁,内核才能顺利地移植到ARM_Linux上。当然也可以通过已经安装好补丁的内核源码包实现。在2.6版本之前,Linux内核版本的命名格式为“A.B.C”。数字A是内核版本号,数字B是内核主版本号,主版本号根据传统的奇-偶系统版本编号来分配:奇数为开发版,偶数为稳定版;数字C是内核次版本号,次版本号是无论在内核增加安全补丁、修复bug、实现新的特性或者驱动时
5、都会改变。2011年5月29号,设计者LinusTorvalds宣布为了纪念Linux发布20周年,在2.6.39版本发布之后,内核版本将升到3.0。Linux继续使用在2.6.0版本引入的基于时间的发布规律,但是使用第二个数例如在3.0发布的几个月之后发布3.1,同时当需要修复bug和安全漏洞的时候,增加一个数字(现在是第三个数)来表示,如3.0.18。Mainline是主线版本,Stable是稳定版,由Longterm是长期支持版Linux是一个内核运行在单独的内核地址空间的单内核单内核,但是汲取了微内核的精华汲取了微内核的精华如模块化设计、抢占式内核、支持内核线程以及动态装载内核模块等特
6、点。以2.6版本为例,其主要特点有:(1)支持动态加载内核模块机制。(2)支持对称多处理机制(SMP)。(3)O(1)的调度算法。(4)linux内核可抢占,linux内核具有允许在内核运行的任务优先执行的能力。(5)linux不区分线程和其他一般的进程,对内核来说,所有的进程都一样(仅部分共享资源)。(6)linux提供具有设备类的面向对象的设备模块、热插拔事件,以及用户空间的设备文件系统。5.1.3 ARM-Linux内核的主要架构及功能内核的主要架构及功能根据内核的核心功能,Linux内核具有5个主要的子系统,分别负责如下的功能:进程管理、内存管理、虚拟文件系统、进程间通信和网络接口。1
7、.1.进程管理进程管理进程管理负责管理CPU资源,以便让各个进程能够以尽量公平的方式访问CPU。进程管理负责进程的创建和销毁,并处理它们和外部世界之间的连接(输入输出)。除此之外,控制进程如何共享的调度器也是进程管理的一部分。概括来说,内核进程管理活动就是在单个或多个CPU上实现了多个进程的抽象。进程管理源码可参考./linux/kernel目录。2.内存管理内存管理Linux内核所管理的另外一个重要资源是内存。内存管理策略是决定系统性能好坏的一个关键因素。内核在有限的可用资源之上为每个进程都创建了一个虚拟空间。内存管理的源代码可以在./linux/mm中找到。3.虚拟文件系统虚拟文件系统文件
8、系统在Linux内核中具有十分重要的地位,用于对外设的驱动和存储,隐藏了各种硬件的具体细节。Linux引入了虚拟文件系统(VirtualFileSystem)为用户提供了统一、抽象的文件系统界面,以支持越来越繁杂的具体的文件系统。Linux内核将不同功能的外部设备,例如Disk设备、输入输出设备、显示设备等,抽象为可以通过统一的文件操作接口来访问。Linux中的绝大部分对象都可以视为文件并进行相关操作。4.进程间通信进程间通信不同进程之间的通信是操作系统的基本功能之一。Linux内核通过支持POSIX规范中标准的IPC(InterProcessCommunication,相互通信)机制和其他许
9、多广泛使用的IPC机制实现进程间通信。IPC不管理任何的硬件,它主要负责Linux系统中进程之间的通信。比如UNIX中最常见的管道、信号量、消息队列和共享内存等。另外,信号(signal)也常被用来作为进程间的通信手段。Linux内核支持POSIX规范的信号及信号处理并广泛应用。5.网络管理网络管理网络管理提供了各种网络标准的存取和各种网络硬件的支持,负责管理系统的网络设备,并实现多种多样的网络标准。网络接口可以分为网络设备驱动程序和网络协议。这五个系统相互依赖,缺一不可,但是相对而言进程管理处于比较重要的地位,其他子系统的挂起和恢复进程的运行都必须依靠进程调度子系统的参与。调度程序的初始化及
10、执行过程中需要内存管理模块分配其内存地址空间并进行处理;进程间通信需要内存管理实现进程间的内存共享;而内存管理利用虚拟文件系统支持数据交换,交换进程(swapd)定期由调度程序调度;虚拟文件系统需要使用网络接口实现网络文件系统,而且使用内存管理子系统实现内存设备管理,同时虚拟文件系统实现了内存管理中内存的交换。5.1.4 linux内核源内核源码目目录结构构Arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构Include目录包括编译核心所需要的大部分头文件,Init目录包含核心的初始化代码,需要注意的是该代码不是系统的引导代码。Mm目录包含了
11、所有的内存管理代码。与Drivers目录中是系统中所有的设备驱动程序。Ipc目录包含了核心进程间的通信代码。Modules目录存放了已建好的、可动态加载的模块。Fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如jffs2文件系统对应的就是jffs2子目录。Kernel内核管理的核心代码放在这里。另外与处理器结构相关代码都放在arch/*/kernel目录下。Net目录里是核心的网络部分代码。Lib目录包含了核心的库代码,但是与处理器结构相关的库代码被放在arch/*/lib/目录下。Scripts目录包含用于配置核心的脚本文件。Documentation目录下是一些
12、文档,是对目录作用的具体说明。ARM-Linux进程管理进程管理Part Two5.25.2进程是处于执行期的程序以及它所管理的资源的总称进程是处于执行期的程序以及它所管理的资源的总称,这些资源包括如打开的文件、挂起的信号、进程状态、地址空间等。程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源。进程管理是进程管理是LinuxLinux内核中最重要的子系统,它主要提供对内核中最重要的子系统,它主要提供对CPUCPU的访问控制。的访问控制。由于计算机中,CPU资源是有限的,而众多的应用程序都要使用CPU资源,所以需要“进程调度子系统”对CPU进行调度管理。
13、图5-4Linux进程管理调度子系统基本架构Scheduling Policy模块。模块。该模块实现进程调度的策略,它决定哪个(或者哪几个)进程将拥有CPU资源。Architecture-specific Schedulers模块模块。该模块涉及体系结构相关的部分,用于将对不同CPU的控制抽象为统一的接口。这些控制功能主要在suspend和resume进程时使用,包含CPU的寄存器访问、汇编指令操作等。Architecture-independent Scheduler模块。模块。该模块涉及体系结构无关的部分,会和“SchedulingPolicy模块”沟通,决定接下来要执行哪个进程,然后通过
14、“Architecture-specificSchedulers模块”指定的进程予以实现。System Call Interface,系统调用接口。,系统调用接口。进程调度子系统通过系统调用接口将需要提供给用户空间的接口开放出去,同时屏蔽掉不需要用户空间程序关心的细节。5.2.1 进程的表示和切换进程的表示和切换Linux内核通过一个被称为进程描述符的task_struct结构体(也叫进程控制块)来管理进程,这个结构体记录了进程的最基本的信息,进程描述符进程描述符中不仅包含了许多描述进程属性的字段,而且还包含一系列指向其他数据结构的指针。内核把每个进程的描述符放在一个叫做任务队列的双向循环链表
15、当中,它定义在./include/linux/sched.h文件中。系统中的每个进程都必然处于以上所列进程状态中的一种。这里对进程状态给予说明TASK_RUNNING表示进程要么正在执行,要么正要准备执行。TASK_INTERRUPTIBLE表示进程被阻塞(睡眠),直到某个条件变为真。条件一旦达成,进程的状态就被设置为TASK_RUNNING。TASK_UNINTERRUPTIBLE的意义与TASK_INTERRUPTIBLE基本类似,除了不能通过接受一个信号来唤醒以外。_TASK_STOPPED表示进程被停止执行。_TASK_TRACED表示进程被debugger等进程监视。TASK-WAK
16、EKILL该状态是当进程收到致命错误信号时唤醒进程。TASK_WAKING:该状态说明该任务正在唤醒,其他唤醒操作均会失败。都被置为TASK_DEAD状态。TASK_DEAD:一个进程在退出时,state字段都被置于该状态。EXIT_ZOMBIE:表示进程的执行被终止,但是其父进程还没有使用wait()等系统调用来获知它的终止信息。EXIT_DEAD:进程在系统中被删除时将进入该状态。该状态表示进程的最终状态。EXIT_ZOMBIE和EXIT_DEAD也可以存放在exit_state成员中。图5-5进程状态的切换5.2.2 进程、程、线程和内核程和内核线程程在Linux内核中,内核是采用进程、
17、线程和内核线程统一管理的方法实现进程管理的。内核将进程、线程和内核线程一视同仁内核将进程、线程和内核线程一视同仁1.即内核使用唯一的数据结构task_struct来分别表示它们;2.内核使用相同的调度算法对这三者进行调度;3.内核也使用同一个函数do_fork()来分别创建这三种执行线程(threadofexecution)。执行线程通常是指任何正在执行的代码实例,比如一个内核线程,一个中断处理程序或一个进入内核的进程。进程是系统资源分配的基本单位,线程是程序独立运行的基本单位线程有时候也被称作小型进程如果内核要对线程进行调度,那么线程必须如同进程那样在内核中对应一个数据结构。进程在内核中有相
18、应的进程进程描述符,即描述符,即task_struct结构结构。在内核中还有一种特殊的线程,称之为内核线程(KernelThread)。由于在内核中进程和线程不做区分,因此也可以将其称为内核进程。内核线程在内核中也是通过task_struct结构来表示的内核线程和普通进程的不同:内核线程和普通进程的不同:1.内核线程永远都运行在内核态,而不同进程既可以运行在用户态也可以运行在内核态。从地址空间的使用角度来讲,内核线程只能使用大于3GB的地址空间,而普通进程则可以使用整个4GB的地址空间。2.内核线程只能调用内核函数无法使用用户空间的函数,而普通进程必须通过系统调用才能使用内核函数。5.2.3
19、进程描述符进程描述符task_struct的几个特殊字段的几个特殊字段(1)mm字段:指向mm_struct结构的指针,该类型用来描述进程整个的虚拟地址空间。其数据结构如下:structmm_struct*mm,*active_mm;#ifdefCONFIG_COMPAT_BRKunsignedbrk_randomized:1;#endif#ifdefined(SPLIT_RSS_COUNTING)structtask_rss_statrss_stat;#endif(2)fs字段:指向fs_struct结构的指针,该字段用来描述进程所在文件系统的根目录和当前进程所在的目录信息。3)files字
20、段:指向files_struct结构的指针,该字段用来描述当前进程所打开文件的信息。5.2.3 进程描述符进程描述符task_struct的几个特殊字段的几个特殊字段(4)signal字段:指向signal_struct结构(信号描述符)的指针,该字段用来描述进程所能处理的信号。其数据结构如下;/*signalhandlers*/structsignal_struct*signal;structsighand_struct*sighand;sigset_tblocked,real_blocked;sigset_tsaved_sigmask;/*restoredifset_restore_sig
21、mask()wasused*/structsigpendingpending;unsignedlongsas_ss_sp;size_tsas_ss_size;int(*notifier)(void*priv);void*notifier_data;sigset_t*notifier_mask;对于普通进程来说,上述字段分别指向具体的数据结构以表示该进程所拥有的资源。对应每个线程而言,内核通过轻量级进程与其进行关联。轻量级进程之所轻量,是因为它与其它进程共享上述所提及的进程资源。举例:进进程程A A创创建建了了线线程程B B,则则B B线线程程会会在在内内核核中中对对应应一一个个轻轻量量级级进进
22、程程。这这个个轻轻量量级级进进程程对对应应一一个个进进程程描描述述符符,而而且且B B线线程程的的进进程程描描述述符符中中的的某某些些代代表表资资源源指指针针会会和和A A进进程程中中对对应应的的字字段段指指向向同同一一个个数数据据结结构构,这样就实现了多线程之间的资源共享。这样就实现了多线程之间的资源共享。5.2.4 do_fork()函数函数图5-6do_fork()函数对于进程、线程以及内核线程的应用内核中创建进程的核心函数即为do_fork(),该函数的原型如下:longdo_fork(unsignedlongclone_flags,unsignedlongstack_start,st
23、ructpt_regs*regs,unsignedlongstack_size,int_user*parent_tidptr,int_user*child_tidptr)该函数的参数的功能说明如下:clone_flagsclone_flags:代表进程各种特性的标志。低字节指定子进程结:代表进程各种特性的标志。低字节指定子进程结束时发送给父进程的信号代码,一般为束时发送给父进程的信号代码,一般为SIGCHLDSIGCHLD信号,剩余三个信号,剩余三个字节是若干个标志或运算的结果。字节是若干个标志或运算的结果。stack_startstack_start:子进程用户态堆栈的指针,该参数会被赋值给
24、子子进程用户态堆栈的指针,该参数会被赋值给子进程的进程的espesp寄存器寄存器。regs:指向通用寄存器值的指针,当进程从用户态切换到内核态时通用寄存器中的值会被保存到内核态堆栈中。stack_size:未被使用,默认值为0。parent_tidptr:该子进程的父进程用户态变量的地址,仅当CLONE_PARENT_SETTID被设置时有效。child_tidptr:该子进程用户态变量的地址,仅当CLONE_CHILD_SETTID被设置时有效。一个问题:一个问题:既然进程、线程和内核线程在内核中都既然进程、线程和内核线程在内核中都是通过是通过do_fork()完成创建的,那么完成创建的,那
25、么do_fork()是如何是如何体现其功能的多样性?体现其功能的多样性?clone_flags参数在这里起到了关键作用参数在这里起到了关键作用,通过选取不同的标志,从而保证了do_fork()函数实现多角色创建进程、线程和内核线程功能的实现。下面只介绍其中几个主要的标志。CLONE_VIM:子进程共享父进程内存描述符和所有的页表。CLONE_FS:子进程共享父进程所在文件系统的根目录和当前工作目录。CLONE_FILES:子进程共享父进程打开的文件。CLONE_SIGHAND:子进程共享父进程的信号处理程序、阻塞信号和挂起的信号。使用该标志必须同时设置CLONE_VM标志。如果创建子进程时设置
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 ppt 第五