




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计(论文)外文翻译(译文)编号: 毕业设计(论文)外文翻译(译文)学 院:专 业:学生姓名:学 号: 指导教师单位: 姓 名: 职 称: 2010年 6 月 15 日20毕业设计(论文)外文翻译(译文)Linux闪存文件系统剖析选择与体系架构摘要:你可能听说过日志闪存文件系统(JFFS)和另一种闪存文件系统(YAFFS),但你知道底层闪存设备拥有文件系统意味着什么吗?本文将向你介绍Linux中使用的闪存文件系统,探索它们是怎样通过磨损读写(wear leveling)来处理底层的消耗设备(即闪存部件),并鉴别各种各样可用的闪存文件系统以及它们的基本设计(译注:或“基本原理”)。固态驱动器在现今很流行,但嵌入式系统却是在很久以前就开始使用固态驱动设备了。你可以发现闪存文件系统被使用于个人数字助理(PDA)、手机、MP3播放器,数码相机,USB闪存设备(UFD),甚至是膝上电脑等等。许多情况下,商用设备的文件系统可以是定制的和专有的,但它们同样面临下面将要讨论的挑战。基于闪存的文件系统形式多种多样。本文探索几个只读文件系统,也回顾目前各种适用的读写文件系统及其原理。不过,首先,我们探讨闪存设备和它们面对的挑战。1、闪存内存技术闪存内存可以通过几种不同的技术来实现,它是一种非易失性内存,这意味着它的内容在掉电后仍可以保存。想了解更多闪存内存技术的光辉历史,参见资源列表。最常见的两种类型是由它们各自使用的技术所确定的:NOR和NAND。基于NOR的闪存技术出现较早,它支持较高的读性能,只是以降低容量为代价。NAND闪存提供大容量,同时也实现了快速高性能的擦写能力。当然,NAND也需要更加复杂的输入/输出(I/O)接口。闪存部件通常被划分为分区,它允许同时进行多重操作(擦除一个分区,同时读另一个分区)。分区可以进一步划分为块(大小一般为64KB或128KB)。使用分区的固件可以进一步对块进行单独的分段,比如,一个段分512字节,并不包括无数据(metadata)。闪存设备有一个常见的限制:相对于其它如RAM磁盘的存储设备,它需要进行设备管理。闪存设备唯一允许的写操作是将一个位(bit)从1变为0。如果需要做相反的操作,那么整个块就必须被擦除掉(复位所有的位为状态1)。这意味着必须要删除块内的其它有效数据以实现持久化。NOR闪存内存可以一次编写(programmed)一个字节,而NAND闪存内存必须编写多字节(典型的为512字节)。两种内存类型擦除块的处理过程不同。每一种都需要一个专门的擦除操作,此操作覆盖了闪存的整个块(译注:即擦除整个块)。NOR技术在擦写操作之前,需要预先将所有的值清除为0,闪存设备的“擦除”是一个特殊的操作,非常耗时。擦除是一种电子操作,它将整块中的每个单元的电子都放掉。NOR闪存设备的擦除操作一般需要几秒,而NAND设备则是毫秒级别的。闪存设备的主要特性是擦除操作的数量。NOR设备中,闪存内存中每块的擦写次数为100,000次,而NAND闪存闪存可以达到百万次。2、闪存内存的挑战除了前述的限制之外,管理闪存设备还面临几个挑战。最主要的三个分别是垃圾回收,坏块管理和磨损读写(wear leveling)。2.1、垃圾回收垃圾回收是收回无效块(这些块包含了无效数据)的过程。收回包括了将有效数据移到新的块,擦除无效块使之有效。如果文件系统可用空间很低的话,这个过程通常在后台完成,或根据需要来进行。2.2、坏块管理闪存设备用久了,就会出现坏块,甚至在出厂时就带有坏块而不能使用。如果操作闪存设备(如擦除操作)失效了,或者写操作失效(可以通过失效的纠错码(ECC)来发现),这说明闪存设备存在坏块。当识别出坏块后,就会在闪存的坏块表中标志它们。这是如何完成的呢?这些操作虽然是与设备相关的,但可以使用保留块的独立集合来实现,这些保留块与正常数据块的管理是分开的。处理坏块的过程无论它们是出厂时就有的还是在使用过程中出现的叫做“坏块管理”。在有些情况下,这种功能是硬件(通过内部微控制器)来实现的,所以,它对于上层文件系统是透明的。2.3、磨损读写回忆一下,闪存设备是属于损耗品,在一个块变成坏块(这里必须由坏块管理单元标记)之前,可以进行有限次的擦除操作。为了最大化闪存的寿命,提供了磨损读写(wear-leveling)算法。磨损读写分为两类:动态磨损读写和静态磨损读写。动态磨损读写解决(address)了给定块擦除周期限制次数的问题。动态磨损读写并不是随机使用可用的块,而是平均使用这些块,因而每个块都得到相同的使用机会。静态磨损读写算法则是解决一个更加有趣的问题。除了最大化擦除周期次数外,某些闪存设备还受到两个擦除周期之间的读周期最大化的影响。这意味着如果数据在块中存在时间过长,而又读取次数太多的话,数据可能会消失,造成数据丢失。静态磨损读写算法解决了这个问题,综可以周期性地移动陈旧的数据到新的块中。3、系统架构到目前为止,我已经讨论了闪存设备和它们基本的挑战。现在,看一下这些设备是如何组合到一起,成为有层次的架构(参见图1)。顶部是虚拟文件系统(VFS),它向高层次的应用程序提供一个通用的接口。VFS下面为闪存文件系统,它将在下一节讲述。再下来是闪存转换层(FTL),它提供了闪存设备的整体管理,包括分配底层闪存设备的块,还有地址转换,动态磨损读写以及垃圾回收。在一些闪存设备中,FTL的一部分可以由硬件来实现。图1,闪存文件系统的基本架构Linux内核使用内存技术设备(MTD)接口,它是闪存设备的一个通用接口。MTD可以自动检测闪存设备总线的宽度以及实现总线宽度所需要的设备数量。4、闪存文件系统Linux中可用的闪存文件系统有几种。下一节将探索一下它们的设计与优点。4.1、日志闪存文件系统(Journaling Flash File System)Linux中使用得最早的闪存文件系统之一是日志闪存文件系统。JFFS是一个基于结构体的文件系统,它的针对NOR闪存设备而设计的。它很独特,能解决(address)许多闪存设备的问题,但也带来另一些问题。JFFS将闪存设备当作是一种循环的块日志(a circular log of blocks)。闪存中的数据都是写到块尾(块尾?空间尾部?),而开头部分的块刚被回收(reclaim)。两者之间即为空闲空间,当这个空间当少时,将执行垃圾回收。垃圾回收器(garbage collector)将有效块移到日志(log)尾部,忽略无效的或者废弃的块,并擦除这些块(参见图2)。这样,该文件系统就可以静态和动态地进行磨损读写。这种架构的主要(fundamental)问题是闪存设备擦写太频繁(而不是最优擦除策略),从而使设备磨损过快。图2,垃圾回收前后的循环日志(circular log)当挂载JFFS时,结构元件structural detail)将被读取到内存中,它会延缓挂载时间,并消耗更多的内存。4.2、日志闪存文件系统第2版本(Journaling Flash File System 2)尽管JFFS在它那个时代十分有用,它的磨损读写算法会减少NOR闪存设备的寿命,因此需要重新设计底层算法来移除循环日志。JFFS2算法为NAND闪存设备而设计,并且改善了压缩性能。在JFFS2中,闪存中的每块都单独处理。JFFS2维持了块表(block list)来充分(sufficiently)完成设备的磨损读写。空白表(clean list)就表示设备中的块都是可用的结点(node)。而脏表(dirty list)则包含那些包括了至少一个废弃结点的块。最后,自由表(free list)表示已擦除且可用的块。垃圾回收算法可以通过合理的路径很聪明地决定该回收哪些块。目前,该算法根据概率从空白表或脏表中选择。脏表中,有99%的可回收块(将有效块移到另一块),而空白表的概率是1%(仅将内容移到新块中)。在这两种情况中,将擦除选择了的块,并置于自由表中(参见图3)。这就允许垃圾回收器重用那些被废弃的但仍围绕闪存移到数据的块,以支持静态磨损读写。图3,JFFS2中的块管理和垃圾回收4.3、Yet Another Flash File SystemYAFFS是专门为NAND闪存开发的另一种闪存文件系统。它的最初版本(YAFFS)支持512字节页面的闪存设备,但是新的版本(YAFFS2)支持新的页面更大的设备,还拥有更强大的写限制(Write constraint)。在大多数的闪存文件系统中,废弃的块都会被标记(mark),但YAFFS2则不尽然,它使用单调递增序列数据(monotonically increasing sequence number)额外地标记块。当在挂载期间文件系统被扫描时,有效的inode(译注:即索引结点)可以快速地标识。YAFFS还在内存中维持树的形式,以表示闪存设备的块结构,包括通过检查点(checkpointing)当正常卸载时,保存内存树结构到闪存设备的一个过程,以在挂载时能快速读并存储到内存中(参见图4)。与其它闪存文件系统相比,挂载时(mount-time)性能是它的最大优势。图4,YAFFS2 挂载时的优化(通过检查点)4.4、只读压缩文件系统在一些嵌入式系统中,没有必要提供一个可更改的(mutable)文件系统:一个不可更改的文件系统可能就满足要求了。Linux支持各种只读文件系统,最常用的两种是Cramfs和SquashFS。4.4.1、Cramfscramfs文件系统是一个经过压缩的只读Linux文件系统,可以用于闪存设备。它的主要特性是简单且有很高的空间利用率(spaces-efficient)。该文件系统可用于体积小(small-footprint)的嵌入式设计中。尽管cramfs的无数据(metadata)没有经过压缩,但cramfs在每页面使用zlib压缩库,允许随机访问页面(页面在访问时解压).你可以使用mkcramfs工具和环回设备(loopback)来使用cramfs4.4.2、SquashFSSquashFS是另一种压缩的只读Linux文件系统,在闪存设备中用处也很大。你可以在许多Live CD的Linux发行版本中找到它的身影。此外,为了添加对zlib压缩库的支持,SquashFS使用Lembel-Ziv_Markov链算法(LZMA),以提高压缩率和速度。与cramfs一样,你可以在一个标准的Linux系统中,使用mkaquashfs工具和环回设备来使用SquashFS,5、结束语与大多数开放源代码一样,软件不断在演变(evolve),新的闪存设备系统正在不断地开发。一种有趣的还处于开发阶段的备选文件系统是LogFS,它包括一些非常新颖的思想。例如,LogFS在闪存设备中自觉地维持一种树结构,因而挂载时间也传统的文件系统如ext2很相似。它的垃圾回收使用一种漫游树(wandering tree)(一种B+树的形式)。然而,让LogFS特别有趣的是它可伸缩并能支持多种闪存设备。随着闪存文件系统日益流行,你将会看到相当多的针对它们的研究。LogFS是其中一例,但其它的,如UbiFS,也在逐渐增长。闪存文件系统的架构非常有趣,将来也会继续成为改革创新的源泉。6、资源学习l 您可以参阅本文在 developerWorks 全球站点上的 英文原文。l 查看 Wikipedia 中的 overview of flash 内存技术概述 和 文件系统列表,包括基于磁盘的文件系统、分布式文件系统和特殊用途的文件系统(包括固态介质文件系统)。 l 了解更多关于 NAND vs. NOR flash 技术 的信息。 l Tim 撰写的 “Linux 文件系统剖析”(developerWorks,2007 年 10 月)介绍了 VFS 及其主要结构和架构。同时还介绍了文件系统并演示了 Linux 如何同时支持多种文件系统。 l 了解 JFFS 及其后继者 JFFS2(PDF 文件)如何使用各种方法进行 flash 设备管理。 l 比较 YAFFS 和其他流行的 flash 文件系统。 l LogFS 和 UbiFS 是两种新的 flash 文件系统,可以解决与目前的 flash 文件系统有关的众多问题。 l MTD 是针对内存设备的通用子系统,例如 flash 部件。它提供了底层硬件驱动器和上层文件系统之间的通用接口。 l Cramfs 和 SquashFS 是针对 Linux 的压缩式只读文件系统。两者都是为内存受限的嵌入式系统而设计,但是 SquashFS 也可用于 Live CD 发行版中。有时,它们也可以用于 UnionFS,实现了文件系统的联合挂载(文件系统互相叠加)。SquashFS 使用 LZMA 和 一组补丁,因此提供了较好的压缩功能和性能。l 阅读 developerWorks 上 Tim 所著的剖析 系列文章。l 在 developerWorks Linux 专区 中,查找更多面向 Linux 开发人员的参考资料,并浏览我们的 最受欢迎的文章和教程。 l 查看 developerWorks 上所有 Linux 技巧 和 Linux 教程。 l 随时关注 developerWorks 技术活动和网络广播。获得产品与技术支持l 订购 SEK for Linux,共包含两张 DVD,其中有用于 Linux 的最新 IBM 试用软件,包括 DB2、Lotus、Rational、Tivoli 和 WebSphere。l 使用可直接从 developerWorks 下载的 IBM 试用软件 构建您的下一个 Linux 开发项目。 讨论l 通过 新的 developerWorks 空间 中的博客、论坛、podcast 和社区主题加入 developerWorks 社区。7、关于作者M. Tim Jones 是一名嵌入式软件工程师,他是 GNU/Linux Application Programming、AI Application Programming 以及 BSD Sockets Programming from a Multilanguage Perspective 等书的作者。他的工程背景非常广泛,从同步宇宙飞船的内核开发到嵌入式架构设计,再到网络协议的开发。Tim 是位于科罗拉多州 Longmont 的 Emulex Corp. 的一名顾问工程师。Linux内核剖析历史与体系结构分解摘要:Linux内核是一个大型的、复杂的操作系统核心,尽管它庞大,但它的子系统和层次都组织得很好。本文将探究Linux内核的通用结构,并了解它的主要子系统和核心接口。如果可能,你可以链接其它IBM文章获得帮助。因为本文目的是介绍Linux内核,并探索它的体系结构和主要部件,让我们先回顾一下Linux内核的简短历史,之后从较高的角度看一下Linux内核结构,最后,介绍它的主要子系统。Linux内核具有超过6百万行代码,因此,本文不可能详尽地介绍它。请使用其它链接来进一步学习更多的内容。Linux还是GNU/Linux?你可能注意到了Linux操作系统有时被称为“Linux”,有时称为“GNU/Linux”。这背后的原因是:使用Linux作为操作系统的内核,使用大量的GNU软件使该操作系统变得十分有用。例如,窗口系统,编译器,各种shell,开发工具,编辑器,实用工具以及其它内核之外的应用程序,其中有许多是GNU软件。因为如此,许多人认为“GNU/Linux”更适合作为操作系统的名字,而“Linux”适合称为内核。1、Linux简短历史尽管Linux被认证为最流行的开放源码的操作系统,但是,相对于别的操作系统的漫长历史,它的历史实际上相当短暂。在计算机出现早期,程序员使用硬件语言在裸机上开发。缺乏操作系统意味着在每次只有一个应用程序(和一个用户)可以使用这些庞大而昂贵的设备。早期的操作系统于20世纪50年代开发,提供一个简单的开发体验。这些例子包括为IBM701开发的General Motors Operating System(GMOS,通用汽车操作系统)以及北美航空为IBM 709开发的FORTRAN Monitor System(FMS,FORTRAN 监控系统)。19世纪60年代,麻省理工学院(MIT)和许多公司为GE-645开发了一个实验用的操作系统,叫Multics(Multiplexed Information and Computing Service)。该操作系统的开发者之一,AT&T,退出了Multics,并在1970年开发了他们自己的操作系统,即Unics。与此操作系统一起诞生的是C语言,C语言就是为此而开发的,后来他们使用C语言对操作系统进行了重写,使得操作系统的开发具有可移植性。20年后,Andrew Tanenbaum创建一个UNIX的微内核版本,名为MINIX(意为微型UNIX),它可以运行在小型个人计算机上。这个开放源代码的操作系统激发了Linus Torvalds在20世纪90年代开发Linux的灵感(见图1)。图1,主要Linux内核发布的简短历史Linux很快就由一个个人项目进化为一个全世界数千开发者参与的项目。最重要的决策之一就是Linux采用了GNU通用公共协议(GPL)。在GPL条款保护下,Linux内核可以防止在商业上使用。它也利益于GNU项目(由Richard Stallman开发,它的源码比Linux内核大得多)的用户空间开发。这允许一些有用的应用程序,如GUN编译器集合(GCC)和各种shell支持。2、Linux 内核介绍现在从一个较高的视角来看一下GNU/Linux操作系统的体系结构。你可以从两个层次考虑操作系统,如图2所示。图2.GNU/Linux操作系统基本体系结构系统调用接口方法(SCI)实际上,Linux体系结构并不像图2所示那样清晰明了。例如,系统调用处理(传统上是从用户空间到内核空间)机制随体系结构不同而不同。新的x86中央处理单元(CPU)提供虚拟化指令支持,在这方面要比使用int 80h方法的老的x86处理器更有效。顶层是用户(或者应用程序)空间。用户应用程序就在这里执行。在用户空间之下就是内核空间。Linux内核即在此处存在。GNU C库(glibc)也在这里(指用户空间,见图)。它提供系统调用接口来连接到内核,并提供用户空间应用程序与内核的转换机制。这一点很重要,因为内核与用户应用程序占用不同的保护地址空间。每一个用户空间进程占用它自己私有地址空间,而内核只占用一个单独的地址空间。更多信息,参考资源列表的链接。Linux内核可以进一步划分成大约三层。最顶层为系统调用接口,它实现基本的功能如read和write。在系统调用接口之下的是内核代码,更准确的定义是与独立于体系结构的内核代码。这些代码是Linux所支持的自有处理器体系结构所共有的。在这之下,是依赖体系结构的代码,形成了通常所说的BSP(Board Suport Package,板级支持包)。这些代码用于给定的体系结构的处理器和平台相关代码。3、Linux内核的属性当讨论一个庞大而复杂的系统体系结构时,你可以从不同的角度来审视这个系统。分解某个体系结构的一个目的,就是提供一种途径以更好地理解源代码,这正是写本文的原因。Linux内核实现了许多重要的体系结构属性。无论从高的还是低的层次来看,内核可以分为许多独特的子系统。Linux也可以看成是一个整体,因为它将所有基本的服务都整合到内核中。这与微内核结构不同,微内核会提供基本服务,如通信,I/O,内存和进程管理,此外,更多的具体的服务正添加到微内核中层。每个内核都有自己的优点,但这里绕开这些辩论。随着时间的流逝,Linux内核已经在内存和CPU使用上变得更加有效,同时也更加稳定。但Linux最有趣的方面,考虑到它的大小与复杂性,是它的可移植性。Linux可以编译后运行于大量的处理器与不同体系结构的平台。一个例子就是Linux可以运行在有内存管理单元(MMU)的处理器上,也可以运行在那些没有MMU的处理器上。Linux内核的uClinux移植提供了对无MMU的支持。更多详细的信息,参考资源列表。4、Linux内核的主要子系统现在,让我们看一下Linux内核的一些主要组成部件,这些分类如图3所示。图3,Linux内核的一个架构透视图4.1、系统调用接口(SCI)SCI是一个细小的层次,它提供执行从用户空间到内核空间的函数调用的途径。所前所述,该接口可以是依赖于平台,甚至在同一类处理器之内(也如此)。SCI实际上是一个有用的函数调用的多路复用和多路分解的服务。你可以找到SCI的实现代码,位于./linux/kernel下,也可以在./linux/arch下找到与依赖体系结构的部分。更多这个部件的详细信息,参见资源列表小节。4.2、进程管理内核是什么?如图3所示,内核实际不过是一个资源管理器。无论这些被管理的资源是进程,内存还是硬件设备,内核负责管理并裁定多个计算机机用户对资源的访问(包括内核与用户空间)进程管理主要集中于进行的执行。在内核中,称此为“线程”,它代表处理器(线程代码,数据,堆栈和CPU寄存器)的一个独立虚拟化。在用户空间中,一般使用术语“进程”,尽管Linux的实现不区分这两个概念(进程和线程)。内核通过SCI提供一个应用程序接口(API)来创建新的进程(如fork,exec或POSIX等等函数),停止进程(如kill,exit函数),以及进程间的通信和同步(如signal函数,或POSIX机制)。此外,进程管理也需要在活动的线程之间共享CPU。内核实现了一种新型的调度算法,无论有多少线程竞争CPU,总能在固定时间内进行操作。这种算法称为O(1)调度程序(scheduler),它表示调度一个线程使用的时间与调度多个线程的时间是一样的。O(1)调度程序还支持多处理器(对称多处理器,或SMP)。你可以在./linux/kernel找到进程管理代码,在./linux/arch下找到依赖于体系结构的代码。你可以在资源列表一节中了解更多关于这个算法的信息。4.3、内存管理内核要管理的另一个重要资源是内存。为了提高效率,由硬件管理虚拟内存,内存管理是按照所谓的“页”来进行的(大多数体系结构是4KB大小)。Linux包含了管理可用内存的方式,以及物理和虚拟映射的硬件机制。但是,内存管理的要多于4KB缓冲区。Linux提供了对4KB缓冲区的抽象,比如slab分配器。这种模式的内存管理方式使用4KB缓冲区作为基数,然后从中分配结构,并跟踪内存页的使用情况,比如哪些是满的,哪些是部分使用,哪些是空的。这就允许该模式可以依据系统的需要动态增长和减少内存使用。为了支持多用户使用内存,会有可用内存被消耗完的时候。由于这个原因,页面可以移出内存,放到磁盘。这个过程叫做“交换”,因为页面是从内存交换到硬盘中。内存管理源代码可以在./linux/mn目录下找到。4.4、虚拟文件系统虚拟文件系统(VFS)是Linux内核中一个有用的方面,因为它提供文件系统的一个共同接口的抽象。VFS在SCI与Linux内核支持的文件系统之间提供一个切换层(见图4)。图4,VFS在用户与文件系统提供切换层VFS顶部是函数的共同API抽象,如open,close,read和write等函数。VFS底部是文件系统的抽象,它定义了上层函数是如何实现的。它们是给定文件系统(超过50个)的插件。这部分的源代码可以在./linux/fs目录下找到。在文件系统下面是缓冲区缓存,它为文件系统层提供一个共同的函数集合(独立于具体的文件系统)。这个缓存层优化了物理设备的访问,通过将数据保留一段时间(或者随机预先读取以便在需要时数据就可以使用)。在缓冲区缓存之下的是设备驱动程序,它实现了具体物理设备的接口。4.5、网络栈网络堆栈在设计上模仿协议本身的分层体系结构。回忆一下,Internet协议(IP)是核心网络层协议,位于传输协议(一般是传输控制协议,或TCP)。在TCP上面是socket层,它通过SCI进行调用。socket层是网络子系统的标准API,它为各种网络协议提供一个用户接口。从原始帧的访问到IP协议数据单元(PDU),再到TCP和UDP,socket层提供一个标准化的方法来管理连接,并在端点之间移动数据。网络源代码可以在内核的./linux/net下找到。4.6、设备驱动程序Linux内核中有大量的代码是设备驱动程序,它们使得一个特定的硬件设备可以工作。Linux源代码树提供一个驱动程序子目录,此目录进一步划分为各种支持的设备,如蓝牙,I2C,串口等等。可以在./linux/drivers下找到设备驱动程序的源代码。4.7、依赖于体系结构的代码尽管有Linux很大程序上是独立于它所运行的体系结构,但也有一些元素,它们必须考虑到体系结构才能正常操作并实现更高效率。./linux/arch子目录定义了内核源代码中依赖于体系结构的部分,其中包含了许多子目录,它们针对特定的体系结构(共同组成了BSP)。对于一个经典的桌面系统,使用的是i386目录。每个体系结构子目录包含了许多其它子目录,每个子目录都集中于内核的一个特定方面,如启动,内核,内存管理等等。可以在./linux/arch下找到依赖体系结构的代码。5、Linux内核的一些有用的特性如果Linux内核拥有可移植性和高效率等特性还不足够的话,它还提供一些其它的特性,这些特性不能归入到前述的分类。Linux作为一个操作系统和开放源码的产品,是测试新协议及其增强性的良好试验平台。Linux支持大量的网络协议,包括经典的TCP/IP协议和高速网络扩展(大于1GB以太网1GBE和10GBE)。Linux也支持诸如流控制传输协议(SCTP)之类的协议,比起TCP,它提供许多高级的特性(是传输层协议的一个代替品)。Linux也是一个动态内核,它支持动态(on the fly,实时?)添加和删除软件。这些称为动态可加载内核模块,可以在引导时根据需要加载或在任何时候由用户加载。Linux最近的新发展是为其它操作系统的操作系统(称为管理程序)。最近,又对内核进行修改,称为基于内核的虚拟机(KVM)。这个修改为用户启用了一个新的接口,它允许其它操作系统可以运行于激活了KVM的内核之上。另外,除了可以运行其它版本的Linux,还可以虚拟化微软的Windows系统(即在Linux上可以运行虚拟的Windows系统)。唯一的限制就是底层的处理器必须支持新的虚拟化指令。详细信息,可能参见资源列表一节内容。6、结束语本文仅仅简单地讲述了Linux内核体系结构和它的特性以及功能。有关内核内容的详细信息,可以参考每个Linux发行版附带的Documentation目录。记得查看本文最后的资源列表一节内容,以了解本文讨论的主题的更多信息。7、参考资料学习l GNU 站点 介绍了 GNU GPL,它涵盖了 Linux 内核及其附带的大量有用的应用程序。另外还介绍了一个比 GPL 限制更少的许可,即Lesser GPL (LGPL)。l UNIX、 MINIX 和 Linux 在 Wikipedia 上都有介绍,另外还详细介绍了操作系统系列。l GNU C Library,即 glibc,是标准 C 库的实现。它用于 GNU/Linux 操作系统,也可用于 GNU/Hurd 微内核操作系统。 l uClinux 是 Linux 内核的一个移植,它可以在一些缺少 MMU 的系统上执行。这允许 Linux 内核在很小的嵌入式平台上运行,例如 PalmPilot PalmPilot Personal Digital Assistants (PDAs) 上使用的 Motorola DragonBall 处理器。 l “使用 Linux 系统调用的内核命令”(developerWorks,2007 年 3 月)对 SCI 进行了介绍,这是 Linux 内核中非常重要的一层,具有 glibc 的用户空间支持,可以在用户空间和内核之间启用函数调用。 l “Linux 调度器内幕”(developerWorks,2006 年 6 月)介绍了 Linux 2.6 中引入的新 O(1) 调度程序,这是一个非常高效的算法,可以扩展到很大数量的进程(线程),并且可以利用 SMP 系统。 l “使用 /proc 文件系统来访问 Linux 内核的内容”(developerWorks,2006 年 3 月)介绍了 /proc 文件系统,这是一个虚拟文件系统,为用户空间的应用程序提供了一种全新的方法与内核进行通信。这篇文章展示了 /proc 以及可加载内核模块。l “服务器诊所: 使虚拟文件系统工作”(developerWorks,2003 年 4 月)深入介绍了 VFS 层,它允许 Linux 通过一个通用接口支持各种不同的文件系统。这个相同的接口也可以用于其他类型的设备,例如 socket。l “Linux 引导过程内幕”(developerWorks,2006 年 5 月)介绍了 Linux 的引导过程,该过程将启动一个 Linux 系统,并且不管是从硬盘、软盘、USB 内存条还是通过网络引导系统,该过程是相同的。l “Linux 初始 RAM 磁盘(initrd)概述”(developerWorks,2006 年 7 月)介绍了初始 RAM 磁盘,它将引导过程与所引导的物理介质隔离开来。l “使用 SCTP 优化网络”(developerWorks,2006 年 2 月)介绍了一种非常有用的网络协议:流控制传输协议,它的操作与 TCP 类似,但是增加了很多有用的特性,例如消息传递、 多宿主和多流。如果您对网络协议感兴趣,那么 Linux 与 BSD 一样,都是一种非常好的操作系统。l “Linux slab 分配器详解” (developerWorks,2007 年 5 月)介绍了 Linux 内存管理中最有用的一个工具:slab 分配器。这种机制源自于 SunOS,不过它在 Linux 内核中找到了合适的位置。l “虚拟 Linux”(developerWorks,2006 年 12 月)介绍了 Linux 是如何充分利用具有虚拟化能力的处理器。l “Linux 和对称多处理”(developerWorks,2007 年 3 月)讨论了 Linux 怎样利用提供芯片级多处理能力的芯片。l “探索 Linux 内核虚拟机”(developerWorks,2007 年 4 月)介绍了最近引入内核的虚拟化技术,它可以将 Linux 内核转换成其他虚拟化的操作系统的系统管理程序。l 有关在用户空间对 Linux 进行编程的更多信息,请参考 Tim 撰写的 GNU/Linux Application Programming 一书。l 在 developerWorks Linux 专区 中可找到适合 Linux 开发人员的更多资源,包括 Linux 教程 以及上月 读者最喜欢的 Linux 文章和教程。 l 随时关注 developerWorks 技术活动和网络广播。获得产品和技术l 定购 SEK for Linux,共包含两张 DVD,其中有用于 Linux 的最新 IBM 试用软件,包括 DB2、Lotus、Rational、Tivoli 和 WebSphere。 l 利用可直接从 developerWorks 下载的 IBM 试用软件 在 Linux 上构建您的下一个开发项目。讨论l 通过参与开发者博客、论坛、podcast 和新的 developerWorks 空间 中的社区主题,加入 developerWorks 社区。、关于作者M.Tim Jones 是一名嵌入式软件工程师,他是 GNU/Linux Application Programming、AI Application Programming 以及 BSD Sockets Programming from a Multilanguage Perspective 等书的作者。他的工程背景非常广泛,从同步宇宙飞船的内核开发到嵌入式架构设计,再到网络协议的开发。Tim 是位于科罗拉多州 Longmont 的 Emulex Corp. 的一名顾问工程师。Linux网络栈剖析从socket到设备驱动程序摘要:Linux操作系统最大的一个特性就是它的网络栈(networking stack)。它最初是从BSD网络栈派生而来的,并具有一套组织得非常好的完整的接口。它的接口从协议无关 (agnostics) 层,如通用socket层的接口或设备层,到种网络协议的具体接口。本文将从它的分层角度探索Linux网络栈的结构,并介绍(examine)它的一些主要结构。、协议简介对网络的正式介绍一般都是参考了OSI模型,但是本文对Linux基本网络栈的介绍使用了四层的Internet模型(参见图1)。图1,网络栈的Internet模型网络栈底部是链路层(link layer)。链路层是指(refers to)提供访问物理层的设备驱动,物理层包括各种媒介,比如,串行链路或者以太设备。链路层之上的是网络层(network layer),它负责将数据包(packet)定向到目标位置。再上一层,是运输层(transport layer),负责点对点(peer-to-peer)通信(例如,在一台主机内部)。网络层管理主机之间的通信,而运输层管理的是主机内部的端点之间的通信。最上层的是应用层(application layer),它通常是一个语义层(semantic layer),能够理解传输的数据。例如,超文本传输协议(HTTP)就负责传输服务器与客户机之间网页内容的请求与响应。从实际上来说,网络栈中的层有一些更为人知的名称。链路层中,你可以找到以太网,最通用的高速媒介。早的链路协议包括了串行协议,如串行线Inernet协议(SLIP),压缩SLIP(CSLIP),以及点对点协议(PPP)。最常用的网络层协议是Inernet协议(IP),但另一个协议也在网络层存在,以满足其它的需求,比如,Inernet控制报文协议(ICMP)和地址解析协议(ARP)。运输层中有传输控制协议(TCP)和用户数据报协议(UDP)。最后,应用层包括了许多我们熟知的协议,包括标准的网络协议,HTTP,e-mail协议,简单邮件传输协议(SMTP)。、核心网络架构现在继续来了解Linux网络栈的架构以及它们是如何实现Inerter模型的。图2中提供了Linux网络栈的一个高级视图。顶部是用户空间层,或称应用层,它定义了网络栈的用户。底部是物理设备,它提供了网络(串行的,或者高速网络,如以太网)的连接性。中间是内核空间,它是本文重点介绍的网络子系统。流经网络栈内部的是socket缓冲区(sk_buffs),它在源和汇点(sink)之间移动包数据(packet data)。你很快就可以看到sk_bufff数据结构了。图2,Linux高层网络栈架构首先,来快速浏览Linux网络子系统的核心元素,后续的章节会有更详细的介绍。顶部(参见图2)是系统调用接口。它仅仅为用户空间应用程序提供访问内核网络子系统的一种方法。接下来是与协议无关层,它提供一种通用方法来使用底层的运输层协议。再下来是实际的协议,在Linux中包含了内置的协议,如TCP、UDP和IP。然后是另外一个与协议无关层,它提供与各个设备驱动程序通信的通用接口,最下面的一层是设备驱动程序本身。.、系统调用接口系统调用接口可以从两个视角来描述。当由用户发起一个网络调用时,可以通过多路系统调用接口来进入内核。最后以调用./net/socket.c文件中的sys_socketcall函数结束该过程,之后进一步多路分解发送到指定目标(intended target)。系统调用接口的另一个视角是使用普通文件操作作为网络I/O。例如,典型的读写操作可以在网络socket上执行(使用文件描述符,就像普通文件一样)。因此,尽管存在许多网络专用的操作(使用socket调用来创建socket,使用connect调用连接一个目标,等等),但也存在许多标准文件操作可以应用于网络对象,就像操作普通文件一样。最后,系统调用接口提供了提供了一种在用户应用程序与内核之间转移控制的途径。.、协议无关接口socket层是一个协议无关接口,它提供一个通用函数的集合来支持各种不同的协议。socket层不仅支持典型的TCP和UDP协议,还支持IP、裸以太网(raw Ethernet)以及其它运输协议,如流控制发送协议(Stream Control Transmission Protocol,SCTP)。网络栈的通信是通过socket来进行的。Linux中socket结构体为struct sock,定义于linux/include/net/sock.h文件中。该结构体比较大,包含了特定的socket所必需的所有状态,如socket使用的特定协议以及在它之上可以执行的操作。网络子系统通过一个结构结就可以知道可用的协议,该结构体是一个定义了自身功能的特殊结构体。每种协议保持了一个名为proto的结构体(可以在linux/include/net/sock.h中找到)。这个结构体定义了特定的socket操作,这些操作可以在从socket层一直到运输层(例如,创建socket,使用socket建立连接,关闭socket,等等)都可以执行。.、网络协议网络协议这一节定义特定的可用的网络协议(比如,TCP,UDP,等等)。它们都是在linux/net/ipv4/af_inet.c(因为TCP和UDP是inet协议簇的一部分)中一个名为inet_init函数中初始化的。Inet_init函数使用proto_register函数来注册每一个内置的协议。该函数定义于linux/net/core/sock.c文件中,除了将这个协议添加到活动协议列表中之外,如果需要,该函数还可以有选择地分配一个或多个slab缓存。通过linux/net/ipv4目录下的tcp_ipv4,udp.c和raw.c文件的proto结构体,我们就可以了解到各个协议是如何标识(identify)自己的。这个协议结构体中,每一个都按照类型和协议映射到inetsw_array中,该数组将内置的转文与它们的操作映射到一起。inetsw_array结构体及其关系如图3所示。数组中的每个协议都首先会被初始化为inetsw,这是通过调用inet_init中的inet_register_protosw函数来实现的。函数inet_init也会对各种inet模块进行初始化,如ARP,ICMP,IP模块以及TCP和UDP模块。图3,网络协议阵列结构注意,在图3中,proto结构体定义了与运输层相关(transport-specific)的方法,而proto_ops结构体定义了通用socket方法。可以通过调用inet_register_protosw来添加其它协议到inetsw协议中。例如,SCTP通过调用linux/net/sctp/protocol.c中sctp_init函数添加自身到协议中。关于SCTP的更多消息,请参考资源列表小节。Socket 协议的相互关系回想一下,在创建 socket 时,需要指定类型和协议,例如my_sock = socket( AF_INET, SOCK_STREAM, 0)。AF_INET表示一个 Internet 地址簇,它使用的是一个流 socket,定义为 SOCK_STREAM(如此处的 inetsw_array 所示)。socket中数据传送是通过一个核心的结构体socket缓冲区(sk_buff)来实现的。sk_buff包含了报文(packet)数据以及协议栈中覆盖多层的状态数据。每个发送或接收的报文都可以用sk_buff来表示。sk_buff结构体在linux/include/linux/skbuff.h定义。如图4所示。图4,socket缓冲区以及它与别的结构体的关系如图所示,多个sk_buff可以通过给定的连接链接在一起。每个sk_buff都在设备结构(net_device)中标识了报文发送的目的,或者接收报文的来源。由于每个报文都是用一个sk_buff来表示的,因此报文头可以通过一个指针集合(th,iph和MAC头)方便地进行定位。因为sk_buff是socket数据管理的中心,因此可以创建很多支持函数来管理它们。其中有些函数用于创建和销毁sk_buff结构,以及对它进行克隆和列表管理。Socket缓冲区可以针对给定的socket链接在一起,这样就可以包含许多信息,包括到协议头的链接,时间戳(报文发送或接收的时间),以及与这个报文有关的设备。.、设备无关接口协议层之下的是另一个无关接口层,它将协议与具有各种不同功能的硬件设备驱动程序连接在一起。这一层提供一组通用函数集合供底层网络设备驱动程序使用,使得它们可以对高层的协议栈进行操作。首先,设备驱动程序可以在内核中注册或注销自身,这是通过调用register_netdevice或unregister_netdevice来实现的。调用者首先填充net_device结构体,然后传递这个结构体进行注册。内核调用它的init函数(如果定义了的话),然后执行一系列的健全性(sanity)检查,创建一个sysfs条目,然后添加新的设备到设备列表中(内核中的活动设备链表)。你可以在linux/include/linux/netdevice.h中找到net_device结构体。各种函数在linux/net/core/dev.c中实现。为了从协议层向设备发送sk_buff,需要用到dev_queue_xmit函数。这个函数将sk_buff入队(enqueue),以从底层设备驱动程序进行最终传输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年旅游推广专员笔试模拟题
- 2025年化妆品产品开发师专业知识评估试题及答案解析
- 2025年管理咨询师实务考试试题及答案解析
- 2025年文印中心招聘笔试模拟题及答案解析
- 机电知识培训方案课件
- 课件与多媒体融合的意义
- 2025年美术设计岗位招聘面试技巧与模拟题集锦
- 小学英语教学课件十五页
- 2025年安全员心理适应测试题库及解析
- 2025年摄影测量员初级技能面试题集
- 胆总管结石伴急性胆管炎
- 制度编写书写规范
- 电缆购销合同文本参考
- 新员工质量保证考试(中软国际)
- 安徽涵丰科技有限公司年产6000吨磷酸酯阻燃剂DOPO、4800吨磷酸酯阻燃剂DOPO衍生品、12000吨副产品盐酸、38000吨聚合氯化铝、20000吨固化剂项目环境影响报告书
- 制造业业务流程
- 石英长石无氟浮选分离工艺研究现状
- 对铁路机车乘务员规章培训的探讨与实践
- GB/T 18947-2003矿用钢丝增强液压软管及软管组合件
- 2016风行菱智m5原厂维修手册及电路图-14
- 车辆维修项目投标方案
评论
0/150
提交评论