译者 : PhantomCat
作者 : Jerry Epplin
出处 :  [url]http://www.ddj.com/[/url]
我们知道 Linux 核心被视为一种老旧的设计 - 所谓的 monolithic (单一) 核心,而另一种管理复杂的 OS 的方式,就是 microkernel (微核心) 架构,像 Hurd 就承诺它是微核心架构 - 一个与 UNIX 相似并且开放源代码的系统... 

Dr. Dobb's Journal December 2000. Courtesy of Dr. Dobb's Journal

The Hurd's modular design enables customization


By Jerry Epplin (译: PhantomCat)

近几年来,Linux 的发展成为资讯界最常被拿来讨论的话题。您可以在电视上看到 Linux Torvalds,在软件商店中看到 Red Hat Linux,还可以在新闻中看到 Linux 准备好要对抗 Microsoft 的文章。就在这时,Linux 吸引许多软件发展者的目光,吸引的原因很多,不过最重要的理由在于它的开放性。无论是 Linux 操作系统,或大多数在上面所执行的软件,都允许任何人检视、学习或是修改源代码。它的开放性,让有心学习 OS 内部运作的人来说,就像一座矿山。记得以前学习操作系统时,几乎都是理论上的追求,最多只能用自己有限的力量写出像玩具般的操作系统。因为 Linux 可随意取得 (当然还有其它免费的操作系统像是 FreeBSD),现在的电脑课程可以在这个主流的操作系统中探索,或是计划为它加上一些新的功能。当这些计划完成后,其效果优于原有的功能,这些程序有可能被整合到未来的 Linux 版本中,并散播至数以万计的使用者手上。很迷人吧! 就是这股魔力趋使许多人在 OS 的内部探索。

上面所提到的都是 Linux (正确的来说,应该是 Linux kernel) 的优点,而令人失望的是,想要发展 Linux 并不是一件容易的事。在学习 Linux 时,你第一个遇到的问题就是源代码大太了,Linux kernel 的源代码包含了底层的排程与记忆体管理,到上层的网络,所以与程序码相关的档案多到一般人无法想像。另外,Linux kernel 的发展是具有***精神,如果不公开内部的技术文件就会被招到唾弃,即使程序码中加入了注解,这些注解都会别人怀疑它的真实性。在这种环境之下,修改程序码的速度成为首要的任务,至于要让那些不懂 Linux 的人了解 Linux 已不是最重要的了。Kernel 维护者所面临的挑战是,如何使原始程序码更有组织,但要达到此目的并非一日可及。

所以我们知道 Linux 核心被视为一种老旧的设计。这就是所谓的 "monolithic (单一)" 核心; 也就是将大大小小、零零种种所有与系统相关的功能,一股脑地塞到核心里。当 OS 须要新的功能,像是支援新的网络协定时,这种以单一核心为主的系统,就没有适当的架构来放置这些功能,因此我们所能做的,就是再一次将程序塞进核心。由于过去历史因素,导至 Linux 使用这种单一核心架构。我们可以由当时的硬件环境看出。Linux Torvalds 原本的目地想在 386 的时代,使用他所能获得的电脑来完成一个操作系统,一个拥有与 UNIX 相同功能的系统。要达到这个目标唯一的方法,就是有效地运用处理器,与所有可获得的系统资源。单一核心允许系统中的元件直接相互沟通 (所有元件在编程时就全被串在一起),来达到良好的效率。在这种状况下,只要核心的功能保持某种限度,一切都容易维护。不过,一旦核心加入过多的功能,就不容易维护了。

Microkernel Architectures


有一种可能的方式来管理复杂的 OS ,就是以 "microkernel" (微核心) 架构为基础的 OS,像 Hurd 就承诺它是微核心架构。Hurd 原本是 Free Software Foundation (自由软件基金会) 的计划,不过 Hurd 也吸引了许多其它组织的目光。(一般说到 Hurd 其实就是意谓著 "the Hurd",而不是只有 "Hurd"。这个字象徵了 "Hird of UNIX-replacing daemons"。如果您对 Hurd 的起源感到兴趣,请参考  [url]http://www.cs.pdx.edu/~trent/gnu/hurd/[/url]。"Hird",在其它方面代表 "Hurd of interfaces representing depth")。Hurd 起源于 1990 年,在 Linux 之前,其目地是成为 GNU 操作系统的核心。当时 GNU 的计划与其它计划重覆,俩者都是使用开放源代码的发展方式,都是与 UNIX 类似的功能,还有特别的是编译器与其它发展工具。其目标是生产一个完整的系统,一个与 UNIX 相似并且开放源代码的系统,由于整个系统中的核心尚未完成,Hurd 计划也开始酝酿。与 Linux 不同之处在于 Hurd 并不限定于 PC 架构; 它计划能使用于当时不同类型的微电脑或是工作站。因此 GNU 计划以慢工出细活的方式来设计这个核心。

微核心与一般核心不同之处,在于它将维持核心运作所须的最少功能实作于核心中。这包含 process 的建立与删除、排程处理、记忆体管理与中断处理。至于其它部分,像是网络协定与处理间的基本通讯,都被移除至核心外的 user space (使用者空间)。核心间的通讯介面都被适当的定义,这点与单一核心不同,单一核心内的元件可以看到并且操作另一个元件。

以微心为架构的操作系统在维护与修改上拥有不少优势,对于近 20 年来学过软件工程的人来说,无论由操作系统或是应用程序的角度来看,这架构再熟悉不过了。这些几乎都是使用物件导向的方式来设计。物件间的介面定义清楚而明确。因此物件内部有所变动时,不会影响到使用这个物件的程序。另一方面,存取物件的内部象徵著要有执行较快的程序来使用物件,效率的优势并无法用来判断增加多少复杂度。

Hurd 的模组化不只是使用介面简洁的微核心。它还将核心系统之外的功能组成不同的 "servers" (或是 daemons; 这些是 "UNIX-replacing daemons" 如同 Hurd 的缩写)。每一个 server 提供使用者程序固定的服务。这些 server、kernel 与使用者程序透过一组简洁的介面相户通讯。

你可以理性地问问自己,Hurd 对你有很大吸引力吗? 到目前为止,它只不过是一个不成熟的操作系统。对一个想学习操作系统的人来说,到处都可以轻易地找到一堆以微核心为基础的操作系统。微核心理论早在学术界盛行将近有 15 年之久,这段时间造就了无数的小型操作系统,您可以在许多网页上找到当时计划所留下来的资讯。每当这些计划完成后,参与计划的人就转移至另一个新的计划; 因此微核心并没有在学术界受到持续而长久的重视。许多计划发展出来的操作系统都受到相当好的评价,但是只有少数的计划能继续地被广泛应用。Hurd 的未来也许会与这些计划一样乏人问津,但是 Hurd 的特性也让它从这些计划中脱颖而出。

首先,一些重量级玩家努力的推广,使它成为 Linux 外另一个开放源代码。此外,Free Software Foundation 也赞助这个计划。因为 Hurd 很早就开始并持续的发展,可视为开放源代码价值观的先锋,而 FSF 与这计划也有很密切的关系。不过,比较重要的一点是 Debian ( [url]http://www.debian.org/[/url]) 也加入这个计划,Debian 的品质被大家所称赞,并且广泛地被使用。Debian 所生产的 distribution (又被称作 "Debian GNU/Linux",因为大部分的人认为 Linux 是 GNU 计划下的产品) 被 Linux 贡献者高度赞美。它也被视为开放源代码中最纯净的 Linux,因为它完全不受商业干扰,所有的供献者都是自愿的。无论如何,Debian 计划发行 Debian GNU/Hurd distribution,其中包括所有 Linux distribution 中的套件,除了系统更换为 Hurd。这个发展最大的义意在于,Linux 使用者可以很顺利的转换至 Hurd。在安装与使用上 Linux 与 Hurd 会尽可能相同。此外,Debian 的加入进一步保证 Hurd 会被完成,并且发行; 因为 Debian 曾发行过可用的系统。

第二个让 Hurd 能从这些小型操作系统中区隔出来的因素,是它的发展者承诺要完全相容 UNIX。当 Debian 加入时,最主要的意义在于 Hurd 将会相容 Linux。回顾 FSF 发展 Hurd 原本的目的,是要相容于一个免费的 UNIX 操作系统,而整个系统除了 kernel 外都已经开始发展。这个计划并不被认为完成,除非所有的 GNU 工具及发展工具都可以执行在这个新的操作系统。因此,发展 Hurd 的团体积极的开发一个能执行 UNIX 应用程序的操作系统。同样的,Debian 团体也想转移他们所发展的 Linux 套件。只要 Hurd 与为它发展的应用程序能被散布出去,他们就算是成功了。这个目标很明确,所以计划参与者都很积极的完成它,成为一个可以使用的操作系统。他们研究的目地不只是为了一个玩具般的操作系统。只要分析过 Hurd 架构,您会发现在一些发展人员的眼中, Hurd 比 Linux 还要迷人。

Overall Hurd Architecture


如同前面所说的,Hurd 由一个微核心及包含在微核心外的一组 server (服务)所组成,并用来服务应用程序。这样设计的目地是为了让核心可以被替换,所以设计者可以使用其它核心取代原有的核心; 例如,另一个不同的排程处理,不同演算法的记忆体管理。到目前为止,Hurd 相当依赖 Mach 微核心,一个相当有名的微核心。Mach 有许多不同的版本与变种,其中一个使用于 Hurd 的就是 GNU Mach,它是一个开放源代码的 Mach,也是 GNU 计划的一部分。在 Mach 周围的则是 server (这些是独立的 daemon,相互间有定义完整的介面) 与应用程序。

The Mach Microkernel


Mach 是个相当有名的微核心。如果您在最近十年内修过操作系统,那您应该有机会学到它。Mach 被宣称是一个以物件为导向的核心,一些严谨的人认为这是个曲解,如同它使用 C 语言来开发,C 语言并没有所谓的 inheritance (继承) 与 polymorphism (多型)。尽管如此,Mach 还是可被视为以下这些元件所组成: ports (埠)、messages (讯息)、tasks (工作)、threads (绪) 与 virtual memory (虚拟记忆体)。如同一个设计成熟的物件导向系统,这些物件的介面已经定义明确,因此物件内的改变不会影响到使用这些物件的程序。

您可将 Mach 中的 task 可以视为 UNIX 环境中的 process。 对执行中的程序而言,它是一个可执行的环境,如同虚拟记忆体或是处理器的执行周期。不过,相对于传统 UNIX 的 process,Mach 的 task 并不表示包含一个正在执行的 thread,对 Mach 而言,thread 也是一个独立的物件。因此,一个有用的 task 必须包含至少一个 thread。Mach 的 thread 与其它常见操作系统 (像是 UNIX 或是 Windows) 的 thread 是一样的,在同一个 task 中的 thread 相互同享记忆体与其它资源。Mach 在设计时,就希望成为一个 multithread,而且可以有效执行于多颗处理器上。相对的,Linux 发展之初,只是一个以 singal thread 为导向的系统,multithread 与多处理器的功能也只在最近加入。Linux 可以执行 multithread 是因为它使用最近流传广泛的 glibc C 函式库,至于多处理器部分虽然已经进行,但是还没完成。无论如何,Mach 与 Hurd 在设计初期已考虑并包括这些概念。

Task 在 Mach 中最主要的沟通方式是使用 port。Mach 的 port 有点像是 socket 中的 port,两个 task 间的一条沟通管道。如同 socket 环境下的 port,Mach 的 port 被设计在两个不同的 thread 执行于同一个处理器、不同的处理器,或是网络上不同的电脑时的通讯动作。因为 port 主要的用意在于两个 Mach 应用程序间内部的通讯,所以这个设计可以轻易地扩展到多颗处理器。同样的,这些资料的内容在传送前必须形成 message (讯息),message 是 Mach 内的一种物件。最后,Mach 提供 memory-management servers (记忆体管理服务),其目地在各 task 间分享记忆体。 

The Hurd Servers


Mach 微核心有许多特性,但是这些对 Hurd 而言都不重要。Hurd 只须要微核心提供几个基本而简单的功能: 排程、task 建立与删除、IPC、记忆体管理。换句话说,理论上其它的微核心只要提供这些基本功能,就可以取代 Mach,所以 Hurd 有很高的移植性; 不过目前为止, Hurd 只使用 Mach 这个微核心。除了微核心外,Hurd 另一个让人感到兴趣的技术就是 multiserver 的设计。这些环绕在微核心旁的 server 都执行于 user mode,并提供应用程序所须的服务。由这些 server 与其特性看来,可以清楚的了解 Hurd 整个设计。

Authentication server 在不同 task 间通讯时,提供使用者身分验证。一个 task 可以透过 port 连到 authentication server 使用其所提供的服务,并利用这些服务来辨识其它的 task。因此 authentication server 提供 Hurd 基本的安全机制。不过值得注意的是,这个 server 没有什么特别,它与其它 Hurd 的 server 一样,都是在 user-space 执行。因此,任何人可以设计并且执行他(她)自己的 authentication server; 其如果它使用者信任这个 server,那他们可以自由的使用它,如果他们不信任这个 server,那可以不使用它。

Process server 基本上扮演一个桥梁,藉于以 UNIX 为概念的 process 及以 Mach 为概念的 task。遵循 POSIX 标准的 UNIX 有许多概念无法使用于 Mach,这些缺少的功能就由 process server 来补足。此外,process server 提供了整个系统所有 process 的资讯 -- task 可在 process server 中注册,如此其它的 task (例如 UNIX 下的 process server 程序) 就可以获得系统中其它 task 的资讯。但是,这动作不是强制的,process 可以选择不在 process server 注册,因此其它 process 也就无法获得这个 process 的资讯。

Hurd 还包括许多其它 server,像是以 socket 为通讯基础的 server,NFS server 等等。这些 server 与 Hurd 一样还在发展中。记得一点,使用者可以随心所欲的加上他的 server,这个动作不须要特别的权限。

除了 server,Hurd 另一个重要的概念就是所谓的 translator。您可以将 translator 视为您熟习的 UNIX 其档案系统特色的实现,像是 mount points、devices 还有 symbolic links。在 Hurd 档案系统中,每个档案都被连结到一个叫 "translator" 的程序。当使用者程序存取这个档案时,控制权就转交给 translator 来处理。如果存取动作是读取 disk 中真正的档案,则这种档案系统格式的 translator 会向 disk 要求资料,并传回应用程序。如果存取的是 device,则这个 device 的 driver 会处理。同样的,在存取 symbolic link 时,translator 会直接导向到指定的位置,或是其它的档案架构。

目前为止,translator 做到了标准 UNIX 系统无法达到的功能,它提供了 files、device 与 symbolic link 一致的存取动作。Hurd 的 translator 还可以应用于任何种类的资料。以 FTP 存取为例,对方系统中的档案可以直接对应至您的档案结构中 (像是 /ftp/ftp.mydomain.com/pub/myfile),您可使用原有的工具进来拷贝、删除或是编辑。Translator 会转换到对应 FTP 动作。您可以想像其它的 translator 有那些功用,像是您可以使用 cat 或是 ls 等工具透过 translator 来流览数据库的内容。或是网管工具可以写成 translator,网络内所有的电脑可以对应到一个目录。Cat 可以列出网络的资料,像是机器的 IP 位址。Gateway 可以视为目录,所以执行 cd 到一个 gateway 时,可以看到这个 gateway 下子网域所有的机器。与 server 相同的一点,translator 不要须额外的权限。任何人都可以开发自己的 translator,除错并尝试完成,让其它使用者也可以一起使用。

Current Hurd Status


如同前面所说的,现在还不适合推荐 Hurd 给一般使用者。因为这系统还缺少一些基本的功能,所以尚未达到使用者所能操作的程度。Hurd 目前可以做到一些 Linux 无法达到的功能。因此,有经验的 Linux hacker 还是可以找到方式来驾驭它,如果您想对它有些贡献,目前还有许多机会。因为 Hurd 设计优良,大部分的程序设计者会发现它比 Linux 更容易了解。

此外,Hurd 的模组化设计允许您一再的为它量身订做。您会发现这些 server 可以轻易的被加入或是移除; 或是微核心也可以被取而代之。所以,我们可以想像,Hurd 会因不同的特殊需求而产生不同的变化,特别在嵌入式应用。我们可以使用 real-time 的微核心取代 GNU 的 Mach,也可以移除使用不到的 server。经过这些小小的改变,我们已经手动完成一个完整的 real-time 操作系统。一个嵌入式应用可以删除大部分的 server,只留下少数上层所用到的 server。这些应用程序可以在同样的桌上型 OS 开发。Linux 迷人的一点就是可依照需求自由的产生所要的操作系统。Hurd 也有同样的潜在可能。