千呼万唤始出来――Linux

讲了这么多,终于开始进入Linux这个主题了;等了这么久,终于有人为操作系统提供一种非MS Windows的选择了。

在众多商业操作系统和免费操作系统中,Linux占有独特的地位,它不但功能强大,有工业强度,而且结构设计优雅,具有良好的扩展性和移植性;接口定义规范,和Unix系统兼容。更为重要的是,Linux操作系统是最具影响力的开源软件,它的诞生揭开了开源运动的新纪元,对自由软件发展起到了前所未有的推动作用。

Linux的开放性,也就是它不拘一格的拿来主义精神,吸引了无数热情的软件爱好者,使他们忘我地投入到轰轰烈烈地大开发中去。因此,Linux是当今发展最快、范围最广的开源软件之一。它是社区中大家最乐意讨论和参与的项目,也正是这种开源精神使Linux成为了操作系统爱好者心中的至爱。而它带给整个社会的价值,从教育的角度体现得更加完美,这也是我们看重Linux的另外一个重要原因。

“我来了,我看到了,我征服了!”那么,你准备好了吗?

Linux操作系统的起源

Linux的第一个版本诞生于1991年,它的作者就是现在大名鼎鼎Linus Torvalds,这个芬兰小伙子据说最初是在做家庭作业――一个作业调度系统的时候,福至心灵(今天千千万万与Linux有各种联系的人的福啊),他突发灵感开始着手将其改造为一个实用的操作系统。在开发初期,他借助了最负盛名的教育类操作系统Minix的一些思想和成果,但他有自己的雄心,要把自己这个系统变的比Minix更实用、更强健。他决定把自己的系统代码公布于众,并且欢迎任何人来帮助修改和扩充Linux系统――这正是我们现在耳熟能详的GNU协议的权益――Linux选择了当时在世界上最受推崇的Unix系统接口标准:POSIX.1来作为自己的内核系统调用接口,由此Linux成为了Unix风格操作系统家族中的新贵,而且是一个代码完全公开的操作系统。

Linux的生命力来自于它的开源思想,自Linus公开Linux代码以来,世界各地的软件工程师和爱好者不断积极地对Linux系统进行修改和加强,将其版本从0.1 提高到2.0 2.22.4,一直到如今的2.6,同时Linux也被从初期的x86平台移植到了PowerPCSparcMIPS68K等几乎市面上能找到的所有体系结构上。更令人激动的是,拜开源运动之新风所赐,数不胜数的应用软件出现在Linux系统之上,大大加强了Linux系统的实用性。

Linux作为开源软件皇冠上的明珠,越来越受到欢迎,毫无疑问地成为人气最旺,最活跃的GNU项目,围绕Linux社区内各种组织雨后春笋般地出现,Linux必将在教育领域、在工业领域取得更大的成功。谁知道我们的生活,将因为Linux发生什么样令人激动的变化呢?

关于Linux的编年史,可以参看软件世界邹震写的,《Linux内核发展回顾》。(URL:http://www1.ccceo.com/~lilo/teach/linux/014.htm,挺详细的,如果你有耐心看完)

 

Linux 操作系统的特点

Linux系统吸收了Unix操作系统的精华思想――“简单就是美”,因此它采用了紧缩内核结构,只在内核中实现那些必要的功能,尽量保持内核短小精悍。至于那些附加功能统统交给用户空间的库函数或其它系统软件或应用软件完成。

为了能充分利用Unix已有的影响力,Linux的设计遵照Unix的系统调用接口标准POXIS.1来进行,保证了和Unix系统的兼容,从而吸引了广大的Unix开发人员。

另外Linux起源于小型通用型计算机,并非专门针对大型、专用计算机设计,因此结构复杂度适中。而且源于已有的系统,又借鉴了许多好的经验,规范性比较强。

不过,目前多数Linux操作系统版本都是以服务器为出发点,因此网络功能和系管理能力突出,多数应用也是专为网络管理服务的,对于个人用户所关注的桌面应用和嵌入应用关注的实时性支持尚且有限(今年Linux发展的一个重要议题就是针对桌面和嵌入开发的内核 )。

 

Linux 内核的技术特点

Linux是一种是实用性很强的现代操作系统。开发它的中坚力量是经验丰富的软件工程师,他们 多以实用性和效率为出发点,很多地方还考虑了工业规范和兼容性等因素,因此不同于教学性操作系统单纯追求理论上的先进性,Linux系统内核的实用性和高效率都让人叹为观止。

下面我们简要归纳一下Linux内核的特色。

第一,Linux内核被设计成单巨内核monolithic)结构(相对微内核而言。微内核是一种功能更贴近硬件的核心软件,它一般仅仅包括基本的内存管理、同步原语、进程间通讯机制、I/O操作和中断管理,这样做有利于提高可扩展性和可移植性。但是微内核与诸如文件管理、设备驱动、虚拟内存管理、进程管理等其它上层模块之间需要有较高的通讯开销,所以目前多集中在理论教学领域,对工业应用来说,效率难以保证 ),因此效率高,紧凑性强。

第二, 2.6版本前Linux内核是单线程结构――所谓单线程结构是说同一时间只允许有一个执行线程(内核中的执行程序)在内核中运行 ,不会被调度程序打断而运行其它任务,这种内核成为非抢占式的,它的好处在于内核中没有并发任务(单处理器而言),因此避免了许多复杂的同步问题,但其不利影响是非抢占特性延迟了系统响应速度,新任务必须等待当前任务在内核执行完毕并自动退出后才能获得运行机会。然而,工业控制领域需要高响应速度,由于Robert love等人的贡献,2.6版本将抢占技术引入了Linux内核,使其变为可以进行内核抢占的操作系统 ――当然,付出的代价是同步变得更复杂了。

第三,为了保证能方便地支持新设备、新功能,又不会无限地扩大内核规模,Linux系统对设备驱动或新文件系统等采用了模块化的方式,用户在需要时可以现场动态加载,使用完毕可以动态卸载。同时对内核,用户也可以定制,选择适合自己的功能,将不需要的部分剔除出内核。这些都保证了内核的紧凑、可扩展性好。

第四,Linux内核纯粹是被动地提供服务。所谓被动是因为它为用户服务的唯一方式是用户通过系统调用来请求在内核空间执行某种任务。内核本身是一种函数和数据结构的集合,不存在运行的内核进程为用户服务 (虽然Linux的确存在一种被称为内核线程的进程,但它并不是用来服务于用户的,仅仅服务于内核自身)。

第五, Linux内核采用了虚拟内存技术,使得内存空间达到4GB 。其中0-3G属于用户空间,称为用户段,3G-4G属于内核空间,称为内核段。这样,应用程序就可以使用远远大于实际物理内存的存储空间了。

第六, Linux的文件系统实现了一种抽象文件模型――VFS(虚拟文件系统),该文件系统属于Unix风格。VFSLinux的特色之一。通过使用虚拟文件系统,内核屏蔽了各种不同文件系统的内在差别,使得用户可以通过统一的界面访问各种不同格式的文件系统,并且可以毫无区别地在不同介质、不同格式的文件系统之间通过VFS提供的统一接口进行数据交换。这种抽象给Linux带来了很大的弹性。

第七, Linux提供了一套很有效的延迟执行机制――下半部分、软中断、tasklet2.6新引入的工作队列等,这些技术保证了系统可以针对任务的轻重缓急,更细粒度地选择执行时机。保证了系统运行时尽量处于安全时间(不关中断)。

Linux除了以上提到的特色外,还有许多其它特点,我们将在以后各期杂志进行详细介绍。

Linux 操作系统内核结构

Linux内核虽然实现和Unix系统有很大不同,但是其结构还基本保持和Unix一致,其中功能也和我们前面提到的操作系统内核要求大体一致。

请见下图:

 



 

 

 

 

 

 

 

 

 

 

从上图可以看出,Linux主要由五个主要的子系统组成。

进程调度(Process SchedulerSCHED)控制着进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际是仅等待 CPU 资源的进程,如果某个进程在等待其他资源,则该进程是不可运行进程。Linux 使用了比较简单的基于优先级的进程调度算法来选择新进程。

       内存管理(Memory ManagerMM)允许多个进程安全地共享主内存区域。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码、数据和堆栈的总量可以超过实际内存的大小,操作系统只将当前使用的程序块保留在内存中,其余的程序块则保留在磁盘上。必要时,操作系统负责在磁盘和内存之间交换程序块。

    内存管理从逻辑上可以分为硬件无关的部分和硬件相关的部分。硬件无关的部分提供了进程的映射和虚拟内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。

虚拟文件系统(Virtul File System VFS)隐藏了各种不同硬件的具体细节,为所有设备提供了统一的接口,VFS还支持多达数十种不同的文件系统,这也是Linux较有特色的一部分。虚拟文件系统可分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2, fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

网络接口(Network InterfaceNET)提供了对各种网络标准协议的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序。

进程间通信(Inter-Process CommunicationIPC) 支持进程间各种通信机制。

    从图1.2可以看出,处于中心位置的是进程调度,所有其它的子系统都依赖于它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功地完成消息的发送,当消息被发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其它子系统(内存管理,虚拟文件系统及进程间通信)以相似的理由依赖于进程调度。

 

这幅图强调了所有子系统中,调度器位于中心位置:所有子系统都会挂起和恢复进程,所以每个子系统都要依靠调度器。一般的,子系统在需要等待硬件完成操作的时候,就会挂起进程;当操作完成后,再让进程恢复执行,比如,当信息发送之后(或者硬件返回一次错误),网络接口就会返回给进程一个代表成功或失败的返回值,并恢复进程的执行。其它子系统也都类似(内存管理器,虚拟文件系统和进程间通讯),因为同样的原因都得依靠调度器。

其它关联关系不那么明显,但一样重要:

l         调度器要利用内存管理器来给每个运行的进程调整硬件内存映像。

l         进程间通讯子系统要利用内存管理器来支持共享内存机制。这种机制允许两个进程像访问自己专属的内存那样使用一块共享的内存。

l         VFS通过利用网络接口实现网络文件系统(NFS),也通过它实现ramdisk设备。

l         内存管理器通过虚拟文件系统来支持换页(swapping),这是内存管理唯一依靠进程调度器的地方。当进程访问的地址目前换出的时候,内存管理器会向文件系统发送请求,要求将数据从外部存储设备调会内存,此时会挂起进程。

 

Linux 操作系统的目录分布

学习内核结构的一个重要目的就是推动我们更有效地使用Linux操作系统:无论是从系统管理角度来说或是从程序开发角度上说,掌握内核级别的系统调用、资源分配、中断控制或进程调度等技术 有不凡的价值,可以帮助你有效开发和驾驭系统。所以,最好在学习内核的过程中就能逐步提高这种能力。

 

内核虽说是Linux操作系统的精华所在,是其它程序赖以运行的基础,但是如果一个实用的操作系统仅仅只有内核,而在其上没有丰富、强大的系统程序和应用程序供用户使用,就好比大厦建好了,也通了电,但却没有电梯、电话和办公设备,用户仍然无法入住使用。因此Linux操作系统的发行版除了带有内核以外,还带有大量的系统程序和应用程序,比如最新红帽子系统的发行版本需要2-3张光盘,其中绝大部分是应用程序。

    正所谓,刨丁解牛,始见无非全牛者――外至内的学习Linux,再从内向外推敲;从感性深入理性,再由理性返回感性,才会获得最深刻的认识。内核的众多特点最终还是要反映到用户应用上的,先熟悉应用无疑会对内核学习有很大裨益。

所以我们需要能熟练使用Linux操作系统,了解整个系统从文件目录上是怎么构成的――登录进系统后(字符界面方式),一般看到的就是一堆目录(使用ls或dir),可你知道这些目录都是干什么的吗?为什么分门别类、林林总总的有这么多呢?听我一道来:

bin:该目录存放最常用的基本命令,比如拷贝命令cp、编辑命令vi、删除命令rm等。

boot:该目录包含了系统启动需要的配置文件、内核(vmliuxz)和系统镜像 (initrd.img)等。

dev:该目录下存放的是Linux中使用或未使用的外部设备文件(fd代表软盘,hd代表硬盘等),使用这些设备文件可以用操作文件的方式来操作设备。

     etc:该目录下包含了所有系统服务和系统管理使用的配置文件;比如系统日志服务的配置文件syslog.conf,系统用户密码文件passwd等

     home:该目录下包含了除系统管理员外的所有用户的主目录,用户主目录一般以用户登陆帐号命名。

     Lib:该目录下包含了系统使用的动态连接库(*.so)和内核模块(在modules下)。

     host+found:该目录包含了磁盘扫描检测到的文件碎片,如果你非法关机,那么下次启动时系统会进行磁盘扫描,将损坏的碎片存到该目录下。

     mnt:该目录下包含用户动态挂载的文件系统。如果要使用光盘,U盘都一般应该将它们安装到该目录下的特定位置。

     proc :该目录属于内存映射的一个虚拟目录,其中包含了许多系统现场数据,比如进程数,中断情况,cpu信息等等,其中的信息都是动态生成的,不在磁盘中存储。

     root:该目录是系统管理员(root用户)的主目录。

     sbin:该目录下包含系统管理员使用的系统管理命令,比如防火墙设置命令iptable,系统停机命令halt等

  tmp:该目录下包含一些临时文件。

  usr:该目录下一般来说包含系统发布时自带的程序(但具体放什么东西,并没有明确的要求)其中最值得说明的有三个子目录

      /usr/src Linux内核源代码就存在这个目录 

      /usr/man Linux中命令的帮助文件

      /usr/local :新安装的应用软件一般默认在该目录下

  var:该目录中存放着在不断扩充着的信息,比如日志文件。

 

到这里对Linux的介绍就结束了!是的,我们先认识它,对它有个全面的感觉,而切中砍的分析,会在其它文章里陆续介绍!

 

      

参考资料:

1 Conceptual Architecture of the Linux Kernel

作者: Ivan T. Bowman

URL http://plg.uwaterloo.ca/~itbowman/papers/CS746G-a1.html