bbs.ChinaUnix.net
首页 | 微博 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


精彩推荐帖子 专题:Linux系统2003年度综述

  首页 » 论坛 » IT业界新闻与评论 »
[打印] [收藏] [本帖文本页] [推荐此主题给朋友]

前言
2003年,Linux强劲的增长势头再次向人们展现了其独特的魅力。SCO公司诉讼IBM,让Linux在发展之初即倍受讨论的专利问题又重新回到了人们的视野之中;Linux内核被值入木马,让人对Linux系统的安全性能不得不重新审视;IBM拟明年为桌面Linux提供支持,让人又不禁对其充满期望。Linux在向人们展现了其强劲的服务器市场的同时,也不得不面对自身在桌面市场中的难堪。要想在桌面市场能有所作为,Linux要在系统的统一性和易用性方面下大的功夫,其自身“体系”更需要在探索中不断完善……

回首2003年Linux的发展历程

5年前,Linux对很多人来说,都还是一个全新的事物,有人观望,有人思索,有人徘徊,有人喝彩。现在,在业界已经很少有人不知道Linux,今天没有哪家公司敢忽略Linux的存在,Linux的势力是如此强劲,即使是软件帝国――微软都不敢加以小觑。

  然而今年的Linux发展历程却给人颇多的思考。

  中科红旗总裁刘博辞职

  中国近期最令人吃惊的消息莫过于中科红旗的总裁刘博的辞职,虽然辞职原因众口不一,有说是内部权利斗争,有说是刘博看淡Linux前景,不管怎样,这一事件无疑在原本就不甚太平的中国Linux界激起了阵阵涟漪。不知道接替刘博的原中科红旗副总裁赵晓亮能在新的一年里给中国的Linux带来什么,或带走什么。中科红旗的一举一动都是中国Linux界非常关心的,只是因为它是中国比较有资历的老大哥,然而红旗今年来的举动取的确不如前一些年。

  还有一种传言,说刘博看淡了Linux的发展前景,因此才转投其他业务。为什么人们一直对Linux的前景持怀疑态度呢?笔者认为主要的原因还是来自于人们迟迟没有看到Linux蓬勃的发展。Linux虽然一直叫座,但是却没有给人们带来预期的收益。尤其是经过了几年的苦苦等待,还是没有等到预期的效果的时候,人们的信心总是会出现动摇。

  IBM大力支持Linux

  IBM公司是国际性公司中,对于Linux支持力度比较大的公司之一,除了自己拥有Linux部门以外,还与很多Linux厂商或者Linux相关软件开发商合作密切,例如,前不久金山就隆重宣布,金山和IBM联盟正式启动,全面开展基于开放系统上的软件的研发。除了IBM,HP也与Linux有着密切的关系,虽然HP还没有彻底的消化Compaq,但是凭其强大的经济实力,HP已经在各个方面与竞争对手开始厮杀,前不久,为了应对Sun公司,HP抛出了Linux利器,HP宣布Linux LifeLine计划,为用户提供免费和优惠的产品和服务。

政府对Linux的支持

  除了公司以外,政府也在Linux发展上扮演着重要的角色。前不久,信产部信息产品管理司司长张琪表示,“中国、日本和韩国政府正在联手,准备开发可以替代微软Windows操作系统的公开源代码软件产品。但事情还处于初始阶段,三方正在谈判,近期会有结果。” 是什么促使三国做出这样的决定? 原因有三:第一,Linux的应用越来越广,功能越来越强,完全可以取代商业软件的作用;第二,Linux的价格低廉这将给三国节省非常大的政府预算;如果能有独立版权的操作系统,即可以摆脱微软的技术垄断,也可以形成对微软的一种压迫,至少可以成为与微软讨价还价的一个筹码。第三,也是出于长远的考虑,三国相信如果计算机在操作系统级依赖于别国的技术,那么就有可能在政治上,甚至军事上受制于他国,这是任何一国都不想看到的事情。相信三国的出发点是一样的。。

  再说中国,除了上面提到的发展三国联合版权的Linux以外,在电子政务方面也大力的提倡使用Linux作为平台。目前,全国已经建设、正在建设和打算建设电子政务平台的省、市、自治区、直辖市都与Linux联姻。只有上海是微软在电子政务领域的最后一块圣地。信息产业部电子信息产品管理司司长张琪明确指出:推动Linux操作系统发展的关键在于应用,电子政务建设要带头用Linux。中国在电子政务领域的建设是毫不含糊的采用Linux的。

  随着中国政府对Linux的态度的变化,很多的公司和企业也都在转变自己的发展战略。中科红旗就对电子政务表现出浓厚的兴趣和强烈的支持,中软也是不敢示弱,拼命争夺这块市场。

  Linux人才流动

  微软二号人物鲍尔默访华的当天,据传被架空的微软中国总裁唐骏将转投北京科委下面一家叫“北京共创开源软件股份有限公司”合作搞Linux。这似乎是很多Linux爱好者庆幸的事情,然而就在这个消息还没有尘埃落定之时,又一则消息传出,拓林思(TurboLinux)原亚太区总裁潘迪加盟微软,出任微软亚太副总裁,而且已经到微软位于三元桥的办公楼报到。消息还称,潘迪的聘任并非出自亚太总部的运作,是微软总部方面直接下文聘请。潘迪是Linux阵营中的重要人物。这样的人才流动虽然在IT里已经司空见惯,但是这两个重量级的人物的位置变化还是带给人很多值得思考的东西。


Linux信任危机

  Linux的舆论形象一直比较“健康”,它以开放和安全赢得了众多的支持者。即使偶尔有负面消息,也往往被认为是微软的攻击。因此用户们在潜移默化中已经接受了Linux更安全这一说法。

  事实上,关于Linux存在安全漏洞的报道持续不断,只是报道的数量和密集程度比起微软Windows系统来要小的多。这很符合Linux的支持厂商们所宣称的“Linux比Windows安全”的说法。

  不久前,著名的Linux推广机构“Debian”和“Gentoo”都受到了攻击,黑客利用以前未被发现的一个漏洞,攻击了这两家机构的服务器(均采用了Linux系统),一度引起很大的震动。虽然两家机构很快便发布了针对攻击事件的安全公告及内核补丁软件包,但也让一直质疑Linux安全性的竞争对手找到了攻击借口。

  Linux之所以能够在这么短的时间得以迅速发展,(Linux最早诞生在1991年),是得益于它的Open Source的特性,也是自由软件突破商业软件束缚的表现。MS帝国一直在操作系统领域里不可一世,因此自然而然有无数看不惯MS的人出现了,他们期望有一股力量来打破这样的霸权者,Linux就成了这股新生的力量,因此,Linux迅速走红,Linux用户越来越多。它开放源代码,它使用免费,它软件丰富,它安全,它稳定,等等,当越来越多的人们了解Linux的时候,Linux的发展势头就更猛了。

  几年前,Bill Gates还对Linux不屑一顾,认为它对视窗系统不会造成什么威胁,但是今天,Gates不得不经常与董事们商量如何应对Linux。

  Linux的很多方面确实发展的非常好,但也有不利的地方。

  首先,很多人一直对Linux持怀疑态度,因为到目前为止,还没有哪家厂商能从Linux身上赚个盆盈钵满,因此导致投资者丧失信心,自然也就对它的投资兴趣大打折扣。

  其次,Linux的厂商太多TurboLinux,Redhat,Mandrake,SuSE,中科红旗,中软等等,这么多的Linux厂商之间都不能形成一致,更无法与原本就实力雄厚的微软叫板了。厂商多,也会导致用户的茫然性,似乎没有人能够说出究竟哪家的Linux是最棒的,这样,本来数目就不可观的用户又进一步分流,从而导致Linux用户的力量不能集中,不能一致的来对付微软的庞大火力。

  再者,Linux的技术较难掌握,在桌面市场,Linux的应用远远不如Windows系列,因为Windows系列产品的易用性是Linux无法比拟的,而且非常容易学习,但是Linux桌面系统来讲,就复杂的多,很难掌握系统的规律;各个厂家之间的界面还不一样,更导致Linux桌面用户在选择的时候无所适从,有些用户好容易才学会一个桌面系统的使用方法,换了另外一家后,甚至是换了一家公司的另外一个版本,界面和使用习惯上就发生了很大的变化,这就会影响一些非专业用户的选择。Linux在服务器领域的表现一直都是非常出众,它比Windows和Unix都低廉,而且性能又非常优异,但是遗憾的是很多公司没有这方面的专业人士,因此很难利用Linux来作为企业应用平台。也许随着Linux人才的丰富,这个问题会得到缓解。

  2003年是变化的一年,也是IT业再次进入辉煌期的前夜,随着IT行业的大规模扭转,相信明年的景色一定是非常乐观的,同时,我们也对Linux的发展表示乐观,它毕竟是IT花园中生命力极其旺盛的一枝奇葩,我们也渴望它能够给这个大花园带来更多的璀璨。



专题:Linux系统2003年度综述

Linux内核2.6在11月24日发表了第十个测试版本,正式版预计明年年初发布。作为一个主要发布版本,比较而言,2.4比2.6有了很大的改动,2.6引入了许多新的特性,同时也去除很多过时的特性。

  它在哪些方面有大的改动?下面我们一起来看看Linux 2.6版本的新变化:

线程模型以及NPTL支持        新的调度器

虚拟内存        驱动程序的移植

内存管理        工作队列接口

中断例程        统一的设备模型

文件系统       音频体系结构

内部设备总线       外部总线

软件方面的改进       用户界面层

即将发布的新的稳定的内核支持更多类型的处理器,并且可靠性和可扩展性得到了提高 ,因而将推动 Linux 得到更广泛的应用。在这里我们将重点介绍一些不同程度的变化,并给出部分代码样例。

  Linux 内核的开发已经经历了一个漫长的过程,最初是 Linus Torvalds 于1991年发布的原始的0.1版本,这个版本中包括一个基本的调度器、IPC(进程间通信)和内存管理算法。而现在它已经是一个以往操作系统的实用的替代品,在市场上表现出了强大的竞争力。越来越多的政府机构和IT巨头的注意力正在转向 Linux。从最小的嵌入式设备到 S/390,从手表到大型企业服务器,Linux 现在几乎可以用于所有的地方。

  Linux 2.6 是 Linux 开发周期中的下一个主要版本,它包括了一些强有力的特性,这些特性旨在改进高端企业服务器的性能和支持越来越多的嵌入式设备(要了解更详细的关于 Linux 2.6 对大型的、小型的以及多处理器系统支持问题的分析,请参阅参考资料一节中到 Joseph Pranevich 的“Linux 的精彩世界”的链接)。

  本文为关注 Linux 的用户分析了 Linux 2.6 的一些重要特性,并且讨论了驱动程序开发人员可能会感兴趣的多方面的变化。

  Linux 2.6亮点

  无论是对于企业服务器还是对于嵌入式系统,Linux 2.6 都是一个巨大的进步。对高端的机器来说,新特性针对的是性能改进、可扩展性、吞吐率,以及对 SMP 机器 NUMA 的支持。对于嵌入式领域,添加了新的体系结构和处理器类型——包括对那些没有硬件控制的内存管理方案的 MMU-less 系统的支持。并且,和往常一样,为了满足桌面用户群的需要,添加了一整套新的音频和多媒体驱动程序。

  在本文中,我们分析了 Linux 2.6的一些最引人关注的特性,但是仍有很多值得关注的变化,包括增强的内核核心转储、快速互斥支持、改进的I/O子系统,等等,在这里我们不能全部讨论。在侧栏中总结了其中一些,其余的我们在参考资料一节中给出了链接。

 新的调度器

  2.6版本的 Linux 内核使用了由 Ingo Molnar 开发的新的调度器算法,称为O(1)算法,它在高负载的情况下执行得极其出色,并且当有很多处理器时也可以很好地扩展。

  在2.4版本的调度器中,时间片重算算法要求在所有的进程都用尽它们的时间片以后,它们的新时间片才会被重新计算。这样的话在一个有很多处理器的系统中,当进程用完它们的时间片以后得等待重算(以得到新的时间片),从而导致大部分的处理器处于空闲状态;这将影响SMP的效率。除此之外,当空闲的处理器开始执行那些时间片尚未用尽的处于等待状态的进程(如果它们自己的处理器忙),会导致进程开始在处理器之间“跳跃”。当一个高优先级进程或者交互式进程发生跳跃时,整个系统的性能就会受到影响。

  新的调度器解决上述问题的方法是,基于每个 CPU 来分布时间片,并且取消了全局同步和重算循环。调度器使用了两个优先级数组,即活动数组和过期数组,可以通过指针来访问它们。活动数组中包含了所有映射到某个CPU而且时间片尚未用尽的任务。过期数组中包含了一个时间片已经用尽的所有任务的有序列表。如果所有活动任务的时间片都已用尽,那么指向这两个数组的指针互换,过期数组(包含了准备运行的任务)成为活动数组,而空的活动数组成为包含过期任务的新数组。数组的索引存储在一个64位的位图中,找到最高优先级的任务是很容易的。

  新的调度器现在不再有大的 runqueue_lock。它维持每个处理器的运行队列/锁机制,以使得两个不同处理器上的两个进程可以完全并行地休眠、唤醒和上下文切换。重算循环(为进程重新计算时间片)和 goodness 循环已经被取消,O(1)算法用于 wakeup() 和 schedulee()。

  新调度器的主要好处包括:

  SMP效率:如果有工作需要完成,那么所有处理器都会工作。
  等待进程:没有进程需要长时间地等待处理器;同时,没有进程会无端地占用大量的CPU时间。
  SMP进程映射:进程只映射到一个CPU而且不会在CPU之间跳跃。
  优先级:不重要的任务的优先级低(反之亦然)。
  负载平衡:调度器会降低那些超出处理器负载能力的进程的优先级。
  交互性能:使用新的调度器,即便是在非常高负载的情况下,系统花费很长时间来响应鼠标点击或者键盘输入的情况将不会再发生。


内核抢占

  内核抢占补丁在2.5系列中就已经被打上,接下来在2.6中也会打。这将显著地降低用户交互式应用程序、多媒体应用程序等类似应用程序的延迟。这一特性对实时系统和嵌入式系统来说特别有用。

  2.5的内核抢占模块的工作由 Robert Love 完成。在先前的内核版本中(包括2.4内核),不允许抢占以内核模式运行的任务(包括通过系统调用进入内核模式的用户任务),直到它们自己主动释放 CPU。

  在内核2.6中,内核是可抢占的。一个内核任务可以被抢占,为的是让重要的用户应用程序可以继续运行。这样做最主要的优势在于,可以极大地增强系统的用户交互性,用户将会觉得鼠标点击和击键的事件得到了更快速的响应。

  当然,不是所有的内核代码段都可以被抢占。可以锁定内核代码的关键部分,不允许抢占。锁定可以确保每个 CPU 的数据结构和状态始终受到保护而不被抢占。

  以下的代码片断显示了每个 CPU 的数据结构问题(在SMP系统中):

  清单 1. 存在内核抢占问题的代码

      int arr[NR_CPUS];

      arr[smp_processor_id()] = i;
      /* kernel preemption could happen here */
      j = arr[smp_processor_id()]   /* i and j are not equal as
   smp_processor_id() may not be the same */

  在这种情形下,如果在特定点发生了内核抢占,任务将会由于重新调度而被分配到其他处理器——smp_processor_id() 将返回一个不同的值。

  这种情形应该通过锁定来进行保护。

  FPU 模式是另外一种CPU应该被保护起来不被抢占的情形。当内核在执行浮点指令时,FPU 状态不被保存。如果这时发生了抢占,由于重新调度,FPU 状态就会与抢占前完全不同。所以 FPU 代码必须始终被锁定,以防止内核抢占。

  锁定可以这样来实现,在关键部分禁止抢占,在之后再激活抢占。以下是在2.6内核中禁止和激活抢占的定义:

  preempt_enable() -- 抢占计数器减1
  preempt_disable() -- 抢占计数器加1
  get_cpu() -- 先后调用 preempt_disable() 和 smp_processor_id()
  put_cpu() -- 重新激活preemption()
  使用这些定义,清单 1可以重写成这样:

  清单 2. 使用防抢占锁的代码

    int cpu, arr[NR_CPUS];

     arr[get_cpu()] = i;  /* disable preemption */
     j = arr[smp_processor_id()];
     /* do some critical stuff here */
     put_cpu()  /* re-enable preemption */

  注意 preempt_disable()/enable()调用是可以嵌套的。也就是说,preempt_disable() 可以被调用 n 次,只有当第 n 次 preempt_enable() 被调用后,抢占才被重新激活。

  当使用自旋锁时,抢占是被隐式地禁止的。例如,一个 spin_lock_irqsave() 调用会隐式地通过调用 preempt_disable() 来防止抢占;spin_unlock_irqrestroe() 通过调用 preempt_enable() 来重新激活抢占。

改进的线程模型以及对 NPTL 的支持

  在2.5内核中已经做了很多的改进线程性能的工作。在2.6中改进的线程模型仍然是由 Ingo Molnar 来完成的。它基于一个1:1的线程模型(一个内核线程对应一个用户线程),包括内核内在的对新的 NPTL(Native Posix Threading Library)的支持,这个新的 NPTL 是由 Molnar 和 Ulrich Drepper 合作开发的。

  2.6内核中其他引人注目的变化 

  文件系统

  对 ext2/ext3 文件系统做了改进,包括对扩展属性和POSIX访问控制列表的支持。NTFS的驱动程序也已经重写,可以支持(reentrant safe)SMP,大于4KB的簇,等等。同时2.6也支持 IBM 的 JFS(journaling file system) 和 SGI 的 XFS。

  音频

  对桌面用户而言,一个更令人期待的特性是称为 ALSA(Advanced Linux Sound Architecture) 的新的 Linux 音频体系结构,它取代了缺陷很多的旧的 OSS (Open Sound System)。新的声音体系结构支持USB音频和MIDI设备,全双工重放,等等。在桌面上播放 MP3 和其他音频文件再也不会像以前那样了!

  总线

  SCSI/IDE子系统经过大幅度的重写,一些驱动程序仍然处于测试阶段或者收尾阶段。

  电源管理

  支持 ACPI(高级电源配置管理界面,Advanced Configuration and Power Interface),用于调整 CPU(可以在不同的负载下使CPU工作于不同的时钟频率以节电)和软件挂起(这一特性仍在测试中)。

  联网和IPSec

  内核中加入了对 IPSec (IP安全)的支持,因此也支持 IP 有效负载压缩等各种 RFC。删除了原来内核内置的HTTP服务器 kttpd。IPSec 特性使用了内核提供的新的加密 API。这个加密API中包含了各种流行的算法,比如 MD4,MD5 DES,等等。加入了对新的 NFSv4 (网络文件系统)客户机/服务器的支持。

  用户界面层

  2.6内核重写了帧缓冲/控制台层。这将意味着需要更新各种用户空间帧缓冲工具,如 fbset 和 fbdesl。人机界面层还加入了对近乎所有可接入设备的支持,从触摸屏到盲人用的设备,到各种各样的鼠标。

  线程操作可以提高速度;2.6内核现在可以处理任意数目的线程,PID最大可以到20亿(IA32上)。

  另外一个变化是引入了 TLS(Thread Local Storage)系统调用,这个调用允许分配一个或多个 GDT(Global Descriptor Table)条目,作为线程注册表。每个 CPU 有一个 GDT,每个条目对应一个线程。这样就可以实现一个不受创建的线程数限制的1:1线程模型(因为每一个新的内核线程都是为一个用户线程而创建)。2.4内核中每个处理器最多只能支持8,192个线程。

  系统调用 clone 被扩展,以优化线程的创建。如果 CLONE_PARENT_SETID 标志被设置,内核会把线程ID存储在一个给定的内存位置,如果当线程结束时 CLONE_CLEARID 标志被设置,内核就会把那个内存位置清空。这有助于用户级的内存管理去识别没有使用的内存块。同样,对线程注册表的信号安全加载的支持也已经融入到这个体系中。当 pthread_join 发生时由内核根据线程ID来完成 Futex(fast user space mutex)。(要了解futex的更多信息,请参阅参考资料).

  POSIX信号处理在内核空间中完成。一个信号会传递给进程中一个可用的线程;销毁信号会终止整个进程。停止和继续信号也会影响整个进程,这样就可以实现对多线程进程的工作控制。

  引入了退出系统调用的一个变种,叫做 exit_group(),这个系统调用终止整个进程和它的线程。此外,退出处理通过引入O(1)算法得到了改进,从而可以在两秒内终止一个具有成千上万个线程的进程(而在2.4内核中完成同样的事情需要15分钟)。

  修改了 proc 文件系统,不再报告所有的线程而只是报告原始的线程。这样就避免了 /proc 报告速度的下降。内核保证原始的线程在所有其他线程终止之前不会终止。



专题:Linux系统2003年度综述

虚拟内存的变化

  从虚拟内存的角度来看,新内核融合了 Rik van Riel 的 r-map (反向映射,reverse mapping)技术,将显著改善虚拟内存 在一定程度负载下的性能。

  为了理解反向映射技术,让我们来首先简单了解 Linux 虚拟内存系统的一些基本原理。

  Linux 内核工作于虚拟内存模式:每一个虚拟页对应一个相应的系统内存的物理页。虚拟页和物理页之间的地址转换由硬件的页表来完成。对于一个特定的虚拟页,根据一条页表记录可以找到对应的物理页,或者是页无法找到的提示(说明存在一个页错误)。但是这种"虚拟到物理"的页映射不是总是一一对应的:多个虚拟页(被不同的进程共享的页)有可能指向同一个物理页。在这种情况下,每个共享进程的页记录将有指向对应物理页的映射。如果有类似这样的情况,当内核想要释放特定的物理页时,事情会变得复杂,因为它必须遍历所有的进程页表记录来查找指向这个物理页的引用;它只能在引用数达到0时才能释放这个物理页,因为它没有别的办法可以知道是不是还存在实际指向这个页的引用。这样当负载较高时会让虚拟内存变得非常慢。

  反向地址映射补丁通过在结构页引入一个叫做 pte_chain 的数据结构(物理页结构)来解决这一问题。pte_chain 是一个指向页的 PTE 的简单链接列表,可以返回特定的被引用页的 PTE 列表。页释放一下子变得非常简单了。 不过,在这种模式中存在一个指针开销。系统中的每一个结构页都必须有一个额外的用于 pte_chain 的结构。在一个256M内存的系统中,有64K个物理页,这样就需要有 64KB * (sizeof(struct pte_chain)) 的内存被分配用于 pte_chain 的结构――一个很可观的数字。

  有一些可以解决这个问题的技术,包括从结构页中删掉 wait_queue_head_t 域(用于对页的独占访问)。因为这个等待队列极少用到,所以在 rmap 补丁中实现了一个更小的队列,通过哈希队列来找到正确的等待队列。

  尽管如此,rmap 的性能――尤其是处于高负载的高端系统――相对于2.4内核的虚拟内存系统还是有了显著的提高。

  Linux 2.6的驱动程序移植

  2.6内核给驱动程序开发人员带来了一系列非常有意义的变化。本节重点介绍将驱动程序从2.4内核移植到2.6内核的一些重要方面。

  首先,相对于2.4来说,改进了内核编译系统,从而获得更快的编译速度。加入了改进的图形化工具:make xconfig(需要Qt库)和make gconfig(需要GTK库)。


以下是2.6编译系统的一些亮点:

  当使用make时自动创建 arch-zImage 和模块
  使用 make -jN 可以进行并行的 make
  make 默认的不是冗余方式(可以通过设置 KBUILD_VERBOSE=1 或者使用 make V=1来设置为冗余方式)
  make subdir/ 将编译 subdir/ 及其子目录下的所有文件
  make help 将提供 make 目标支持
  在任何一个阶段都不需要再运行 make dep

  内核模块加载器也在2.5中完全被重新实现,这意味着模块编译机制相对于2.4有了很大不同。需要一组新的模块工具来完成模块的加载和缷载 (他们的下载链接可以在参考资料中找到),原来的2.4所用的 makefile 在2.6下不能再用。

  新的内核模块加载器是由 Rusty Russel 开发的。它使用内核编译机制,产生一个 .ko(内核目标文件,kernel object)模块目标文件而不是一个 .o 模块目标文件。内核编译系统首先编译这些模块,并将其连接成为 vermagic.o。这一过程在目标模块创建了一个特定部分,以记录使用的编译器版本号,内核版本号,是否使用内核抢占等信息。

  现在让我们来看一个例子,分析一下新的内核编译系统如何来编译并加载一个简单的模块。这个模块是一个“hello world”模块,代码和2.4模块代码基本类似,只是 module_init 和 module_exit 要换成 init_module 和 cleanup_module (内核2.4.10模块已经使用这种机制)。这个模块命名为 hello.c,Makefile 文件如下:

  清单 3. 驱动程序 makefile 文件示例

       KERNEL_SRC = /usr/src/linux
       SUBDIR = $(KERNEL_SRC)/drivers/char/hello/
       all: modules

       obj-m := module.o
       hello-objs := hello.o

       EXTRA_FLAGS += -DDEBUG=1

       modules:
        $(MAKE) -C $(KERNEL_SRC) SUBDIR=$(SUBDIR) modules

  makefile 文件使用内核编译机制来编译模块。编译好的模块将被命名为 module.ko,并通过编译 hello.c 和连接 vermagic 而获得。KERNEL_SRC 指定内核源文件所在的目录,SUBDIR 指定放置模块的目录。EXTRA_FLAGS 指定了需要给出的编译期标记。

  一旦新模块(module.ko)被创建,它可以被新的模块工具加载或缷载。2.4中的原有模块工具不能用来加载或缷载2.6的内核模块。这个新的模块加载工具会尽量减少在一个设备仍在使用的情况下相应的模块却被缷载的冲突发生,而是在确认这些模块已经没有任何设备在使用后再缷载它。产生这种冲突的原因之一是模块使用计数是由模块代码自己来控制的(通过MOD_DEC/INC_USE_COUNT)。

  在2.6中,模块不再需要对引用计数进行加或减,这些工作将在模块代码外部进行。任何要引用模块的代码都必须调用 try_module_get(&module),只有在调用成功以后才能访问那个模块;如果被调用的模块已经被缷载,那么这次调用会失败。相应的,可以通过使用 module_put() 来释放对模块的引用。

内存管理的变化

  在2.5的开发过程中,加入了内存池,以满足无间断地进行内存分配。其思想是预分配一个内存池,并保留到真正需要的时候。一个内存池由 mempool_create() 调用来创建(应该包含头文件 linux/mempool.h)。

  mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn,
  mempool_free_t *free_fn, void *pool_data);

  在这里 min_nr 是需要预分配对象的数目,alloc_fn 和 free_fn 是指向内存池机制提供的标准对象分配和回收例程的指针。他们的类型是:

  typedef void *(mempool_alloc_t)(int gfp_mask, void *pool_data);
  typedef void (mempool_free_t)(void *element, void *pool_data);
  pool_data 是分配和回收函数用到的指针,gfp_mask 是分配标记。只有当 __GFP_WAIT 标记被指定时,分配函数才会休眠。

  在池中分配和回收对象是由以下程序完成的:

  void *mempool_alloc(mempool_t *pool, int gfp_mask);
  void mempool_free(void *element, mempool_t *pool);
  mempool_alloc() 用来分配对象;如果内存池分配器无法提供内存,那么就可以用预分配的池。

  系统使用 mempool_destroy() 来回收内存池。

  除了为内存分配引入了内存池之外,2.5内核还引入了三个用于常规内存分配的新的GFP标记,它们是:

  __GFP_REPEAT -- 告诉页分配器尽力去分配内存。如果内存分配失败过多,应该减少这个标记的使用。

  __GFP_NOFAIL -- 不能出现内存分配失败。这样,由于调用者被转入休眠状态,可能需要一段比较长的时间才能完成分配,调用者的需求才能得到满足。

  __GFP_NORETRY -- 保证分配失败后不再重试,而向调用者报告失败状态。

  除了内存分配的变化以外,remap_page_range()调用——用来映射页到用户空间——也经过了少量修改。相对于2.4来说,现在它多了一个参数。虚拟内存区域(VMA)指针要作为第一个参数,然后是四个常用的参数(start,end,size 和 protection 标记)。

工作队列接口

  工作队列接口是在2.5的开发过程中引入的,用于取代任务队列接口(用于调度内核任务)。每个工作队列有一个专门的线程,所有来自运行队列的任务在进程的上下文中运行(这样它们可以休眠)。驱动程序可以创建并使用它们自己的工作队列,或者使用内核的一个工作队列。工作队列用以下方式创建:

  struct workqueue_struct *create_workqueue(const char *name);
  在这里 name 是工作队列的名字。

  工作队列任务可以在编译时或者运行时创建。任务需要封装为一个叫做 work_struct 的结构体。在编译期初始化一个工作队列任务时要用到:

  DECLARE_WORK(name, void (*function)(void *), void *data);
  在这里 name 是 work_struct 的名字,function 是当任务被调度时调用的函数,data 是指向那个函数的指针。

  在运行期初始化一个工作队列时要用到:

  INIT_WORK(struct work_struct *work, void (*function)(void *), void *data);
  用下面的函数调用来把一个作业(一个类型为work_struct 结构的工作队列作业/任务)加入到工作队列中:

  int queue_work(struct workqueue_struct *queue, struct work_struct *work);
  int queue_delayed_work(struct workqueue_struct *queue, struct work_struct
  *work, unsigned long delay);

  在queue_delay_work()中指定 delay,是为了保证至少在经过一段给定的最小延迟时间以后,工作队列中的任务才可以真正执行。

  工作队列中的任务由相关的工作线程执行,可能是在一个无法预期的时间(取决于负载,中断等等),或者是在一段延迟以后。任何一个在工作队列中等待了无限长的时间也没有运行的任务可以用下面的方法取消:

  int cancel_delayed_work(struct work_struct *work);
  如果当一个取消操作的调用返回时,任务正在执行中,那么这个任务将继续执行下去,但不会再加入到队列中。清空工作队列中的所有任务使用:

  void flush_workqueue(struct workqueue_struct *queue);
  销毁工作队列使用:

  void destroy_workqueue(struct workqueue_struct *queue);
  不是所有的驱动程序都必须有自己的工作队列。驱动程序可以使用内核提供的缺省工作队列。由于这个工作队列由很多驱动程序共享,任务可能会需要比较长一段时间才能开始执行。为了解决这一问题,工作函数中的延迟应该保持最小或者干脆不要。

  需要特别注意的是缺省队列对所有驱动程序来说都是可用的,但是只有经过GP许可的驱动程序可以用自定义的工作队列:

  int schedule_work(struct work_struct *work); -- 向工作队列中添加一个任务
  int schedule_delayed_work(struct work_struct *work, unsigned long delay); -- 向工作队列中添加一个任务并延迟执行

  当模块被缷载时应该去调用一个 flash_scheduled_work() 函数,这个函数会使等待队列中所有的任务都被执行。


中断例程的变化

  2.5的中断处理程序内部已经经历了许多变化,但是绝大部分对于普通的驱动程序开发者来说没有影响。不过,还是有一些重要的变化会影响到驱动程序开发者。

  现在的中断处理函数的返回代码是一个 irqreturn_t 类型。这个由 Linus 引入的变化意味着中断处理程序告诉通用的 IRQ 层是否真的要中断。这样做是为了当中断请求不断到来时(原因是驱动程序偶然激活了一个中断位或者硬件坏掉了),捕获假中断(尤其是在共享的PCI线上),而任何驱动程序对此都是无能为力的。在2.6中,驱动程序如果要从一个设备上发出一个中断需要返回 IRQ_HANDLED,如果不是的话返回 IRQ_NONE。这样可以帮助内核的 IRQ 层清楚地识别出哪个驱动程序正在处理那个特定的中断。如果一个中断请求不断到来而且没有注册那个设备的处理程序(例如,所有的驱动程序都返回 IRQ_NONE),内核就会忽略来自那个设备的中断。缺省情况下,驱动程序 IRQ 例程应该返回 IRQ_HANDLED,当驱动程序正在处理那个中断时却返回了 IRQ_NONE,说明存在 bug。新的中断处理程序可能是类似于这样:

  清单 4. 2.6的中断处理程序伪代码


       irqreturn_t irq_handler(...) {
             ..
             if (!(my_interrupt)
                   return IRQ_NONE;  // not our interrupt
             ...
             return IRQ_HANDLED;  // return by default
       }

  注意,cli(),sti(),save_flags()和 restor_flags() 是不赞成使用的方法。取而代之的是 local_save_flags() 和 local_irq_disable(),用来禁止所有的本地中断(本处理器内的)。禁止所有处理器的中断是不可能的。

  统一的设备模型

  2.5开发过程中另一个最值得关注的变化是创建了一个统一的设备模型。这个设备模型通过维持大量的数据结构囊括了几乎所有的设备结构和系统。这样做的好处是,可以改进设备的电源管理和简化设备相关的任务管理,包括对以下信息的追踪:

  系统中存在的设备,其所连接的总线
  特定情形下设备的电源状态
  系统清楚设备的驱动程序,并清楚哪些设备受其控制
  系统的总线结构:哪个设备连接在哪个总线上,以及哪些总线互连(例如,USB和PCI总线的互连)
  设备在系统中的类别描述(类别包括磁盘,分区等等)
  在2.5内核中,与设备驱动程序相关的其他发展包括:

  不再使用 malloc.h。所有包含 <linux/malloc.h>;(用于内存分配)的代码现在要替换为 <linux/slab.h>;。

  用于 x86 体系结构的 HZ 值增加到1000。引入了一个叫做 jiffies_64 的瞬间计算器,以避免由于 HZ 值的变化而引起瞬间变量的迅速溢出。

  引入了一个叫做 ndelay() 的新的延迟函数,允许纳秒级的等待。

  引入了一个叫做 seqlock() 的新类型的锁,用于锁定小段的经常被访问的数据(不是指针)。

  由于2.6内核可以抢占,应该在驱动程序中使用 preempt_disable() 和 preempt_enable(),从而保护代码段不被抢占(禁止 IRQ 同时也就隐式地禁止了抢占)。

  在2.5中加入了异步 I/O。这意味着用户进程可以同时进行多个 I/O 操作,而不用等待它们完成。在字符驱动程序中引入了异步 API。

  块层在2.5的开发过程中经历了大幅度的变化。这意味着原来用于2.4的块设备需要进行重新设计。

  在2.5中引入了sys文件系统,它给出了系统的设备模型的用户空间描述。它挂载在 /sys 目录下。

  结束语

  由于相对于2.4来说 Linux2.6发生了太多的变化,所以在 Linux 内核界有一种说法是新的发布版本应该命名为3.0。Linus 将最终决定如何命名,官方可能将于2003年11月发布官方版本。不管最终采用哪个版本号,相对于2.4来说,新的内核发布版本在多种平台和体系结构上性能将更快,可扩展性更强,更加稳定。

  Linus 已经邀请世界各地的测试人员来查找 bug 和报告问题,并要求发行者提供2.6版本的下载。



专题:Linux系统2003年度综述

不管是SCO向IBM追讨巨额索赔演出一幕幕闹剧也好,还是微软在忙着给自己的系统打补丁同时还抽空以经济学的观点评论“Windows其实比Linux更廉价”“Windows比Linux更安全”也好,还是Linux的内核被安放进了很大一匹木马也好, 或者是Red Hat将Red Hat 9卖了个的满堂红后立即宣布退出桌面操作系统开发并号召大家使用Windows的举动也好,如果说1998年兴起的Linux热是盲目狂热的追捧,那么2003年的Linux则是实实在在地赚足了眼球吸引了看客引来了关注。

  热闹的2003年即将过去,各大小linux厂商和IT业界巨头们已经开始了来年的计划部署。在这里让我们预测一下明年Linux会如何发展吧?

IPS和ICP

  IPS和ICP常用的服务器操作系统一般以freebsd、netbsd、solaris和windows系统居多,因为其24x7x365的工作特性决定了稳定是第一位的。Linux在IBM的支持下发展迅速,目前IBM以及其他厂商例如HP的某些服务器默认安装的操作系统已经是Linux了。目前Linux在稳定性方面来说的确不如Freebsd,但是由于其在易用性、功能多样性的特点,原本Freebsd/Solaris上的对稳定性要求不是特别严格的服务可以移交到了Linux的旗下。而就整体来说,Linux的界面友好性、新特性众多、安全性比较好、稳定性佳,而且价格低廉——不要小看这点,对服务器众多的营运商来说买下1套Linux和20套5授权版本的Windows 服务器版以及其他相关软件的价格可是天渊之别的。因此Linux将会取代部分Windows操作系统而被装在服务器上用以提供服务。

移动通信

  就如短信成为救济中国门户的稻草一样,移动通讯用户市场永远是一块创造经济效益的大蛋糕。多媒体手机以及集成pad、游戏、音乐播放功能的手机将成为明年发展的主流,就象大家都知道的一个定律一样“一个事物越复杂,则出错的概率越大”,原来简单的手机内核将受到性能、稳定性的考验。今年已经初露头角的Linux内核手机会逐步完善其功能,其良好的内核裁减性和绝佳的稳定性,配合上java程序将在多媒体手机市场上大放异彩。另外顺便提到大家众所周知的,不少门户网站的短信网关正是用linux来作为操作系统的。

  网络游戏

  网络游戏日益火暴,不少游戏营运商们赚得盆满钵满。有羊群的地方就会招来狼,太多太多的机会让网络上的cracker将魔爪伸向了游戏服务器。随着对国内的朋友们对网络游戏认识的加深,不光对游戏本身,对游戏的服务也提出了更高的要求。“xx网络游戏数据库被黑”、“服务器因例行维护,暂停xx小时”、“由于服务器故障,数据恢复为xx日xx时,请大家原谅”这样的新闻不断在各大游戏客服上演。随着对国内的朋友们对网络游戏认识的加深,不光对游戏本身,对游戏的服务也提出了更高的要求。“可否不要每周就停半天来关机维护?”、“希望改进动不动就提示服务器人数已满的问题?”网游朋友们对服务器在安全性、稳定性和持续工作时间等各个方面对游戏营运商提出了更高的要求。而Linux因为具有稳定、高效、自带防火墙工具、升级迅速方便等几大特点,并且配置得当的Linux的确具有比较高的安全性,再考虑到操作系统费用和相关数据库软件的费用,相当一部分网络游戏的服务器操作系统平台会转到Linux操作系统上面来。

  IT厂商

  IBM将进一步增大对Linux的支持力度,毕竟有个操作系统能跟Windows叫板是IBM最高兴的事情,何况依靠Linux而卖出的方案、软件的确也不菲。HP则依然一边主推自己的HP-UX一边将Windows和Linux都抓牢不放的中庸策略,DELL这个最大的零售商则依然是“墙头草随风倒”客户需要什么操作系统我就装什么。倒是SUN似乎觉得自己将Solaris和主机捆绑销售的策略限制到了自己发展,于是放出了for X86的Solaris操作系统,想让日薄西山的太阳。就笔者对Solaris、Linux几个版本的使用情况来看,其操作系统本身极富竞争力,事实上别的不论,只就多语化支持界面上来看Solaris比任何一个Linux发行版默认的都要好。但好马配好鞍,才子还需要佳人配,好的操作系统还需要配合众多功能强大的软件才能被人所接纳,Windows在桌面系统成功的因素之一就是有众多功能强大的各类第三方软件的支持。Linux的自身所带的开放精神注定了为它编写程序的人比为Solaris的多上几倍,相应的应用软件也多少不少,虽然Solaris中也能使用Linux软件,但是注定没办法100%兼容,于是高低立显。服务器市场上的操作系统之争从来就没有停息过,Linux不过是以IBM之名加入混战的又一只新兵,但愿它能愈战愈勇,早日独挡一面。

Linux厂商

  2003年的Linux厂商可说是几家欢乐几家愁,在个人用户上叫好又叫座的万年销售亚军Mandrake在年初就沦落到了申请破产保护的地步,而精力主要放在服务器而对个人用户不甚在意的Red Hat赚了个金玉满怀,不得不让人感慨世事难料。从1998年的linux热一路走来,众多高举着Linux大旗的厂商中为数不少已经倒下或转移阵地,剩下的都是在技术和服务方案上有所独到的精英(天缘插话——此词对国内某Linux厂商例外)公司。由于Linux本身的GNU性质决定了不能靠卖其操作系统本身赢利,需要靠作增值开发软件及服务解决方案来赢利,因此面向企业、ISP、ICP更能获得收益,而在个人市场上则较难收回成本,明年跟Red Hat一样走上面向商业用户服务之路的Linux厂家大概会增加不少吧?

  局域网

  随着网络建设的发展,企业上网、公司上网、学校上网、政府上网、住宅小区上网,可以说,现在互联网已经成为现代人解决工作问题、获取信息、休闲娱乐的重要方式之一。作为在局域网内来说,由于资金等问题,在硬件上很多时候难以与ISP、ICP相提并论,使用的一些服务器不过是一些硬件配置较高的pc机,根据实际需求和网络管理员自身的技术水平,使用Linux作为服务器的情况将日益增多。以天缘自己为例,我不希望我管理的网络中的几十台服务器(其中大概有七八台PC,分别装着Linux、FreeBSD和Windows操作系统)每个月都要重新启动那么几次,不希望每天都有打不完的补丁,不希望每次不管打了什么大大小小的补丁后就要重新启动服务器,也不希望半夜有人打电话来告诉我FTP死机了,更不希望当XX病毒/攻击来到的时候,自己管理的服务器第一个倒下。对我来说最重要的是能稳定的提供服务、尽量能够高负载、尽量少重启、半年不死一次机、对新的一些服务支持够好(例如流媒体播放等等),因此我在服务器上装Linux和Unix作为操作系统的较多。就易用性上面来说,整个Unix/Linux家族里面,Linux彩色显示文件名、tab自动命令/目录补全这些小的细节方面的确是做得最好的,因此我在我经常需要手工操作的几台PC服务器上都装的是Linux。就安全性来说,Linux自己带的防火墙功能比较强大,设置得当足够保护自己,在某些危机时候简单设置后甚至能充当网络NAT代理和网络防火墙来使用,觉得功能很棒。相信随着明年Linux在内核和软件上的发展,功能会更加强大,易用性上也会不少。伴随着对Windows某些方面的失望以及对其他操作系统的了解,相信明年会有更多的网管跟我一样喜欢上Linux吧。

  网络安全

  目前的网络安全除了在路由器/交换机等环节进行适当的设置外,主流的就是架设网络防火墙(网关防火墙、邮件防火墙、病毒防火墙)以及攻击检测系统(IDS、蜜罐)。防火墙和IDS产品一般分为硬件型和软件型两类,硬件型和软件型各有优劣在此不再赘述(顺便提一句:国内存在某些厂家的销售人员利用用户的认识误差将附带着机器、操作系统的软防火墙当作硬防火墙卖的,其中不乏知名厂商请大家留意)。Linux目前因为其费用低廉、稳定性好、效率高、内核自带防火墙接口、系统本身安全性较好等因素,已经成为了目前不少软件防火墙/IDS生产商的最爱,在来年中,会有更多的安全产品将Linux作为其操作系统。

嵌入式系统

  有限的ROM、有限的RAM、有限的传输速率、使用广泛而且其中不乏高危场合。这一切的一切,都要求嵌入式产品需要一个核心很小,效率很高,优秀的内存管理、功能按需裁减而且非常稳定的内核才行。其实早在linux出生不久,就引起了嵌入式系统的关注,我们前面提到的linux手机也算是linux在嵌入式系统上面应用的体现了。随着明年linux内核的不断发展,智能家电、精密工控乃至航天探测等大有其用武之地。

  集群系统

  按照摩尔定律,PC硬件的性能不断提高,原本一些需要使用昂贵小型机才能解决问题的场合,现在通过较廉价的集群系统已经能够满足需求。我们看到的《泰坦尼克》、《黑客帝国》中的那些特级动画都是使用PC集群来渲染的,而那原本是需要小型机或者SGI工作站才能完成的。集群系统一般用于大规模的并行/分布式计算(也就是进来很热门的“网格”技术,其实如果片面来看待,bt下载也能看做是这种技术的应用),计算的周期从几个小时到几天乃至几个月不等,因此对每个节点的操作系统稳定性和计算能力上都有一定要求,而使用Linux事实证明能获得比较优异的性能和稳定性。由于每个节点上都需要一个操作系统,因此廉价、高效、高可用(HA)、高可靠、有免费的支持并行/分布计算功能强大的软件的操作系统是最为理想的。Linux正因其免费和强大的功能成为宠儿。相当多的集群提供商将linux选作操作系统,例如根据天缘所知,国内曙光公司的集群系统TC1700上安装的就是Red Hat。

  桌面应用

  不管是浏览器对多媒体播放的支持也好,GUI界面的响应速度也好,对硬件的兼容性也好,还是软件的丰富程度也好,Windows都是首屈一指。事实上天缘自己在操作Linux的服务器的时候大多也是在Windows下用ssh方式访问的。微软20年的桌面操作系统功力打造出来的操作系统自然不是Linux下的Xwindows短短时日能够赶上的,明年的桌面依旧会是Windows年。当然我们也要看到Windows和Linux在同样默认安装的情况下,的确存在某些安全隐患,但是在2003已经极大改善了。在微软没有研制出“绝对无法破解”(个人认为。。。不太现实)的操作系统前,由于盗版因素使得Linux的价格优势无法体现,同样是用着“Free”的用户们自然依旧是亲微软的多了。因此,明年的Linux桌面,虽然Xfree86在更新,KDE在更新,GNOME在更新,FVWM在更新,XFACE在更新,但依然会不敌微软那长长的牛角,在桌面系统上依然是微软的天下。只有少数追求个性,和深明“读书人偷书也是偷”道理的朋友会坚持使用Linux桌面吧。只是天缘常常在想,当类似冲击波这样的利用系统漏洞而来的病毒再次泛滥时,“因病毒无法上网,请上网下载专杀工具查杀”这样的事情会不会又再发生呢?反正天缘有WinXP和Linux的双操作系统,可以在Windows遇到麻烦的时候替它人工呼吸一下,朋友你呢?

  当各行各业忙着盘点的时候,当凛冽的寒风吹拂着IT业的时候,当我在Linux的OpenOffice中打下这篇文章的时候,我衷心地期盼:Linux,辉煌2004!



专题:Linux系统2003年度综述

月份          主要事件     
1月           LinuxWorld大会在纽约召开   
2月           XFree86 4.3.0 发布
3月           Mandrake Linux 9.1 正式发布
4月          “红帽”发布Red Hat Linux 9操作系统
5月           与IBM打官司 SCO网站遭到攻击
6月           SCO取消IBM的Unix授权
              IBM在中国建Linux解决方案中心  
7月           Red Hat推出最新Linux测试版
              Linux内核2.6的测试版发布
              中国打造AMD+Linux超级计算机
8月           LinuxWorld China大会在北京召开
9月           Red Hat将推出最新版的Linux
                     中科红旗发布Red Flag Server4
                     中日韩联盟举起反抗微软大旗
10月         Mandrake Linux9.2发布
              Linux2.6核心程序测试版发布
              Vector Linux 4.0问世!
11月         IBM拟明年为桌面Linux提供支持
              中国政府将注资支持Linux
                     Linux 内核存在木马漏洞
              IBM注资Novell以2.1亿收购SuSE
                     Red Hat将停止提供免费Linux
12月         Linux内核被发现存重大缺陷



专题:Linux系统2003年度综述

LINUX的性能是不错的
__________________________________
A-OK Virgo
★ 永别了——绿色兵团 ★



专题:Linux系统2003年度综述

LINUX,应该关注一下自己的面子了,内核是给高手们玩的,面子才是我们这些傻瓜们自己的.
__________________________________
这个世界上,最卑鄙的职业就是老师:传的是歪道,授的是恶业,解的是邪惑.



专题:Linux系统2003年度综述

经典贴子
__________________________________
梳影橫斜水清淺,暗香浮動月黃昏.



专题:Linux系统2003年度综述

Linux学习中,好好学习
__________________________________
君子之交淡如水!



专题:Linux系统2003年度综述

这么长,累。
__________________________________

To be the happy children of the mother nature,
To be The Best among the best.


Copyright © 2001-2010 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP