嵌入式 Linux 开发者资源分类
您想在新颖的、可联网的、基于 Linux 的、“家家户户都想要一个”的革命性设备上运行 Linux,而这个设备正是您刚刚开发的?恭喜您。现在您打算如何获取 Linux 版本、设备驱动程序、技术信息或工具?我们提出了一个分层系统,一个分类法,用于描述嵌入式 Linux 开发者(我们应该称他们为 ELDer 吗?)可能需要或至少想要的各种产品、服务或信息。我们的系统沿袭了林奈系统的传统。我们对栖息在嵌入式 Linux 世界中的动植物进行分类。至于特定项目是植物还是动物,我们留给读者自行判断。
我们描述了将在主机或目标系统上使用的产品的特性。嵌入式系统开发者可能会在一个与将要部署运行其软件的系统截然不同的系统上进行开发工作。例如,开发者可能正在使用运行 Solaris 的 Sun Microsystems 工作站,并为具有 StrongArm 处理器且只有 8MB RAM 的小型设备进行交叉编译。但是,应该注意的是,开发者通常可以使用基于 Linux 的开发环境,并结合基于 Linux 的目标,这被认为是一大优势。
我们使用术语 主机 来表示开发者用来与开发工具交互的计算机系统,使用术语 目标 来表示将运行正在开发的软件的嵌入式系统。嵌入式 Linux 产品为主机系统提供开发工具,并为目标系统提供驱动程序、特殊应用程序或自定义内核。在评估供应商时,需要同时考虑他们对主机和目标的支持。
分类法源于现有的产品和服务。至少存在一种产品或服务符合每个类别。
供应商的产品如何满足开发者的需求,可以用来确定供应商的良好选择。分类法可以帮助开发者在某种程度上编写所需内容的清单。预计没有一家供应商会提供所有所需的信息、硬件、软件等。一些供应商是志愿者,例如,他们提供单个设备驱动程序,而另一些供应商是商业组织,他们提供复杂的 Linux 发行版、支持和开发帮助。
我们的目标是为开发者提供一种系统化的方法来描述他们看到的产品。分类法的目的是能够对嵌入式 Linux 开发者可能受益的任何和所有产品或服务进行分类。分类法也方便供应商描述其产品。供应商现在可以说“我们不修补内核”,而不是说“我们使用标准内核”或“使用标准 Linux”或其他未定义的短语。通过这种方式,分类法为开发者和供应商提供了一种共同语言,以便相互交流。
分类法不提供评估供应商产品质量的方法,而仅表明供应商有可用的东西。分类法的前两层如图 1 所示。

谁应该使用分类法?
如果您是嵌入式 Linux 开发者,那么您可能会发现这个分类系统有助于理解概况。此外,我们还提供了可用资源的真实示例。供应商也将受益于使用这种已建立的对其产品进行分类的方法,而不是不得不编造自己的术语。
我们所说的 嵌入式系统 是指在设备内部发挥作用的计算机系统,该设备的主要功能不是作为计算系统。示例包括蜂窝电话、PDA 和微波炉。我们还将专注于资源相对有限的设备,例如没有硬盘或 RAM 大约为 16MB 或更少的设备。这意味着我们的讨论对于那些为莫纳克亚山顶上建造 256 处理器、16GB 望远镜导向系统以观测轨道上人造卫星的人来说,用处不大。
我们所说的 Linux,是指内核源自 Linux 内核发布的系统。该版本应与已发布版本共享大量源代码。例如,我们不是指可能恰好与 Linux 共享 API 的系统。当我们说 内核 时,我们指的是包含在内核发布 tar 文件中的软件。
供应商提供的内核是否未经修改来自 https://linuxkernel.org.cn/ 或者是否经过修补,这个问题可能很重要。一些嵌入式 Linux 供应商对其分发的内核进行了重大更改。这些更改对于目标应用程序可能是必不可少的。例如,这些更改可以提供所需的调度行为。另一方面,内核行为方式的这些更改可能会使应用程序对修改产生重大依赖性。内核中的更改会导致不同的路径或片段。这种碎片化让人想起导致 UNIX 版本(如 Solaris、HP-UX 和 Irix)在某种程度上不兼容的差异。
我们更希望供应商明确说明他们所做的更改。补丁文件是记录更改的标准方法。此外,清晰的文档也很有价值。如果供应商更改了内核,那么我们更希望他们给他们的版本命名,例如,Purple Chicken Linux 1.1。如果供应商没有做任何更改,那么仅说明 Linux 版本号是合适的,例如 Linux 2.2.14。同样,如果供应商更改了工具或应用程序,那么区分它是合适的,例如 Purple Chicken gdb。如果供应商没有更改工具,那么仅将其称为“gdb”是合适的。自从一些供应商在其发行版中将所有内容都称为其发行版名称以来,情况变得令人困惑。
例如,我们的分类方案允许人们注意到供应商有一个非标准版本的内核,使用了“软件®特殊发行版®修补内核”类别(参见图 2)。

嵌入式 Linux 是指在嵌入式系统中使用 Linux 作为操作系统。关于为什么这是一个值得考虑的有价值的概念,有各种参考资料。有关更多信息,请参见,例如,http://www.linuxdevices.com/。
为什么开发者不能只使用标准的桌面或服务器发行版?嵌入式的定义包括我们的目标系统比标准桌面或服务器系统具有更有限的资源这一特征。如果您的目标系统不是这样,那么只要它可以满足您的时间限制,您很可能可以使用标准发行版。由于桌面或服务器应用程序开发者与嵌入式系统开发者的需求之间存在许多重叠,因此分类法确实包含一些也会让其他开发者感兴趣的类别。然而,自然地,分类法仅包括专门设计用于对嵌入式 Linux 系统产品进行分类的类别。
这些区别导致了嵌入式 Linux 发行版的两个主要特征——它们可以帮助节省资源,并且可以帮助提高性能。对于性能,我们通常指的是它们具有确保实时性能的特殊功能。这可能意味着使用辅助实时操作系统。这些操作系统的示例包括 RTLinux 和 RTAI。另一种辅助实时(尽管是“软”实时)的方法是更改 Linux 调度器。如果您不需要资源节约或性能提升,那么如果桌面或服务器发行版支持您的目标,您就可以使用它。
此外,嵌入式 Linux 发行版还为嵌入式系统特有的处理器或板卡提供内核和应用程序代码,而不仅仅是为桌面或服务器系统提供。嵌入式 Linux 发行版还可以提供特殊工具,以帮助嵌入式 Linux 开发者减小其目标配置的大小。
为嵌入式系统构建 Linux 版本的组织可能需要做相当多的内核工作。为了了解开发者可能会遇到什么情况,请考虑 TiVo Systems (www.tivo.com) 的案例,他们构建了一个运行 Linux 的机顶盒。他们使用了内核版本 2.1.24,添加了更新的驱动程序,此外,他们还添加了 29 个文件并修改了其他 31 个文件。他们的新代码约有 11,500 行。他们添加了几个系统调用,修改了内核中多个检查超级用户权限的位置,以允许任何用户访问资源(毕竟它是嵌入式系统),添加了额外的内核诊断程序,添加了一些测试代码,并创建了一种新的文件系统。
嵌入式 Linux 发行版通常也涉及大量修改。例如,来自 LynuxWorks 的 Blue Cat Linux 涉及内核版本 2.2.12 的 193 个文件的补丁。请注意,Blue Cat Linux 源自 Red Hat Linux,这是一个针对桌面和服务器应用程序的发行版。Blue Cat Linux 附带的内核软件包说“...您的 Red Hat Linux 操作系统的核心...”
通常不能将较新版本的内核与供应商的补丁一起使用。例如,如果您盲目地尝试将 Blue Cat 补丁应用于内核版本 2.2.14,那么您会发现 15 个文件无法修补。如果您真的很有冒险精神,并且尝试在内核版本 2.4.0.test7 上使用他们的补丁,您会发现 59 个文件无法修补。这仅代表来自 patch 命令的失败。仅因为 patch 命令在其他文件上成功并不意味着它们会按要求工作。这意味着想要利用新内核中可用功能的开发者可能会面临巨大的开发工作。
然而,情况并不像典型的独立软件供应商 (ISV) 所面临的那样糟糕。当 ISV 生成其软件版本时,他们通常依赖于其客户和供应商正在使用的操作系统版本。然而,对于嵌入式系统开发者来说,他们可以控制其客户将要运行的操作系统,因为他们将其与其应用程序一起提供。
除了内核修改之外,嵌入式 Linux 发行版还可以提供特殊工具来帮助减少资源使用、特定目标的自定义内核版本、较小版本的标准软件或专有软件(例如,许可的二进制驱动程序)。(有关 busybox 的更多信息,它是各种标准 Linux 命令的替代品,请参阅 Bruce Perens 的“使用 Busybox 构建微型 Linux 系统”)。Linux 内核针对桌面和服务器吞吐量进行了优化。标准内核未针对实时响应或在资源相对匮乏的设备上使用进行优化。这意味着嵌入式 Linux 系统很可能使用修改后的内核。特殊发行版的特性如图 3 所示。

分类法概述
让我们参观一下分类法,为许多类别提供示例。我们从左到右、从上到下浏览图表。选择的示例并不意味着任何形式的推荐;它们只是用于帮助澄清类别的定义。我们添加了关于类别的评论,以正确定义它们。
信息 类别(参见图 4)适用于信息性或参考性产品。我们将产品定义为会议、网站或出版物。每个类别的示例包括:嵌入式 Linux 博览会和会议、www.linuxdevices.com 和 Linux Journal。我们将电子邮件列表与网站相关联,作为其信息产品的一部分。

硬件/软件 类别(参见图 5)适用于将硬件和软件捆绑在一起的产品。这些捆绑产品通常作为 OEM 的套件或系统进行推广。因此,这些产品的重点与单独的硬件和软件类别不同。子类别的示例是芯片/芯片组:DiskOnChip 及其 Linux 驱动程序。对于单板计算机:AVS 无线 LAN 开发者套件及其 Linux 版本。对于完整系统:Easy I/O™ Linux DAQ 系统,完整系统,配备双处理器计算机和 Red Hat Linux 6.2。

我们所说的 服务(参见图 6)是指专业服务。我们的类别包括:支持,例如 MontaVista 的订阅服务;咨询,例如 emLinux 提供的咨询;培训,例如 K Computing 提供的培训;以及编程,例如 Echo Labs 提供的编程。咨询是在固定价格的片段中提供的建议或帮助。支持是旨在解决问题的建议或帮助。此外,支持是一种被动服务,等待有人打电话或发送电子邮件。编程是合同编程帮助。培训可以是传统的讲师指导或计算机/网络培训。

与嵌入式 Linux 系统相关的 软件(参见图 7 和图 8)既可以用于目标系统,也可以用于主机系统。目标软件包括特殊发行版、修补内核以及 Linux 到新处理器或系统的移植。在主机方面,软件包括开发工具。
[这些图表丢失了]。
用于嵌入式系统的 Linux 特殊发行版包括诸如较小版本的标准软件、新的设备驱动程序和用于嵌入式系统的特殊版本的应用程序等内容。标准软件或应用程序的特殊版本旨在使用更少的内存。常见的示例是 busybox、tinylogin 和 GoAhead web 服务器。程序 busybox 和 tinylogin 是诸如 cp、init 和 tar 等一系列标准 Linux 程序的替代品。GoAhead web 服务器比更常用的 Apache 小得多。
一个经过深思熟虑的发行版包括您可能想要在嵌入式系统上使用的软件包。发行版还应省略您不需要的软件包。桌面和服务器发行版(例如 Red Hat 6.2)包含的软件包比嵌入式发行版多得多。例如,Red Hat 6.2 包含约 600 个软件包,而 Embedix 包含 57 个。
Linux 内核的补丁主要有三个原因:提高性能、修复错误或减小内核大小。提高性能通常意味着确保确定性或实时响应。一些嵌入式 Linux 发行版包括 RTAI 或 RTLinux 实时增强功能。RTAI 和 RTLinux 涉及内核补丁以及其他软件的集合,以使人们能够开发真正的实时、“硬实时”任务来运行,并使这些任务能够与同一台计算机上的 Linux 进程进行通信。嵌入式 Linux 发行版也通常为 Linux 中的进程提供改进的调度。与内核修补相关的是可加载内核模块的使用。我们发现嵌入式 Linux 开发者使用了两种类型的可加载模块。第一种类型是设备驱动程序。有许多设备驱动程序,例如以太网驱动程序,可以编译为动态加载模块。第二种类型的可加载模块是提供内核扩展以帮助实现实时性能的模块。这些类型的示例是 RTAI 和 TimeSys 的调度支持。
我们没有为可加载模块设置单独的类别,因为这两种类型都可以放入其他类别。驱动程序进入“特殊发行版®驱动程序”类别,扩展程序进入“修补内核®提高性能”类别。这些可加载模块进入“修补内核”类别的理由是,为了使用这些类型的可加载模块,内核必须进行修改。例如,添加了新的系统调用。
减小 Linux 内核的大小是通过重新配置、剥离可执行文件和从库中删除不需要的成员来完成的。嵌入式 Linux 版本使用每种技术的情况并不少见。一些产品提供用于执行这些操作的特殊工具和说明。一些用于嵌入式 Linux 的特殊发行版的示例包括来自 MontaVista 的 Hard Hat Linux、来自 LynuxWorks 的 Blue Cat Linux 和来自 Lineo 的 Embedix。还有许多较小的发行版专为嵌入式开发者设计,但包含的组件少得多——一个例子是 Cool Linux。
在主机方面,有各种开发工具。人们期望在所有 Linux 发行版中都找到 gcc 编译器。您可能需要此编译器来重新编译内核。除了 gcc 之外,其他标准 GPL 工具还包括 gdb(调试器)和 gprof(性能分析器)。
有集成开发环境,例如 CodeWarrior;工具包或库,例如 Qt/Embedded GUI;内存分析器,例如 Blue Cat Linux 中可用的内存大小基准测试;跟踪工具,例如 Linux Trace Toolkit;测试覆盖率,例如 ATTOL Testware;以及源代码浏览器,例如 Source-Navigator。许多这些工具还需要某些组件在目标系统上运行,尽管您可能不会在已部署的系统中使用它们。当您能够在功能强大的开发主机而不是小型目标平台上分析、测试、调试或跟踪您的新应用程序时,使用 Linux 作为主机和目标的一些优势就得到了体现。
虽然使用基于 Linux 的主机有很多优势,但嵌入式 Linux 系统开发者使用的一些软件是用于其他平台的。事实上,一些开发工具并非旨在在 Linux 下运行。例如,来自 TimeSys 的 TimeWiz 在 Windows 上运行,而不是在 Linux 上运行。
一些供应商完成的大部分工作是为了确保他们的发行版和工具可以在各种目标上工作。此类工作可能需要内核修改或仅仅是严格的测试。我们已包括我们发现支持嵌入式 Linux 的那些目标。这些目标包括以下处理器:Intel IA32/x86、MIPS、PowerPC、StrongARM、Cirrus Logic Maverick 和 PowerQUICC II。这些处理器可以用于各种板卡或系统中,我们的分类包括其中的许多。随着我们了解更多端口,分类的这一部分很可能会迅速扩展。
我们的 硬件 类别(参见图 9)是指供应硬件但不供应 Linux 软件的供应商。开发者可以从一个供应商处获取硬件组件,从另一个供应商处获取软件。事实上,这通常是常见情况。硬件组件的示例包括芯片/芯片组:您可以从很多地方购买 x86 微处理器;完整系统:购买基于 Windows 的 PC,您必须自己将其变成基于 Linux 的系统;板卡:例如以太网板卡。

分类法的使用——供应商示例
MontaVista 提供了一个名为 Hard Hat Linux 的 Linux 发行版。让我们通过使用分类法来看看他们有哪些产品。我们应该注意到,确定 MontaVista 产品在分类法方面的范围受到阻碍,因为 MontaVista 没有以有组织的方式提供这些类型问题的答案。这正是使用分类法将有益的情况。
MontaVista 在所有三个类别中都提供特殊信息。他们举办了研讨会,他们的技术和营销人员在会上做了演示并回答了问题。研讨会自然而然地侧重于嵌入式和 Linux。
MontaVista 发布了其交叉开发套件的手册,并提供了某些标准工具的手册的 PDF 版本。
MontaVista 提供了一个网站,其中包含各种对嵌入式 Linux 开发者有用的信息 (http://www.mvista.com/)。Monta Vista 不提供硬件加软件,实际上根本不提供硬件。
MontaVista 提供对其提供的设备驱动程序、应用程序和内核的支持。MontaVista 还提供咨询服务。MontaVista 目前不提供有组织的培训。MontaVista 为设备驱动程序和内核提供编程服务。
MontaVista 提供了一个专为嵌入式系统设计的特殊 Linux 发行版——Hard Hat Linux。Hard Hat Linux 提供了较小版本的标准软件,包括 busybox。Hard Hat Linux 还为各种设备提供驱动程序。Hard Hat Linux 提供了特殊的嵌入式应用程序,例如 MicroWindows 系统。
Hard Hat Linux 经过修补以提高性能和修复错误,例如使用其 Linux 调度器的替代品。此外,Hard Hat Linux 通过支持内核配置提供了更小的内核。Hard Hat Linux 附带编译器 gcc;工具包和库 MicroWindows;调试器 gdb;和性能分析 gprof。
MontaVista 开发工具在 Solaris、Red Hat Linux 和 YellowDog Linux 上运行。Hard Hat Linux 已移植到表 1 中的系统。
IA32/x86
Ampro LB3-P5X
Zioatech 5531
Force Computers 730-731
Intel Pica
Motorola 5350/5360
Radisys EMB-1
Winsys LBCPlus
MIPS
NEC Osprey 4181A
PowerPC
Embedded Planet
823 (RPX-Lite)
CLLF 860T
850 (RPX-Lite)
Linux Planet
EST SBC-8260
FORCEComputers 6750/680(G3)
Motorola
MCP 750
Sandpoint/755
MCPN 750
Sandpoint/8240
SBC Technologies SBS/K2
提出的分类法旨在帮助嵌入式 Linux 开发者理解可用的各种产品和服务的使用。分类法可以任意深度地扩展,以提供更多信息。例如,了解特殊的嵌入式应用程序是否需要许可费很有价值。人们可以扩展层次结构的这一部分,以包括那些需要付费的和那些不需要付费的。分类方案旨在全面性,而不是深度。我们鼓励每个人都为层次结构添加内容,使其更加有用。
Kevin Dankwardt 是 K Computing 的创始人兼总裁,K Computing 是一家硅谷培训和咨询公司。在过去的九年中,他大部分时间都在为世界各地的各种组织设计、开发和交付关于 UNIX 系统编程、Linux 设备驱动程序、实时编程和并行编程等主题的技术培训。他于 1988 年获得计算机科学博士学位。可以通过 k@kcomputing.com/ 与他联系。
Matt Reilly 在 K Computing 工作了三年,负责管理 Linux 服务器和教授 UNIX 和 Linux 课程。不旅行时,他喜欢演奏凯尔特竖琴。