本文译至:http://sel4.systems/CAmkES/About.pml
关于CAmkES
CAmkES是面向seL4的一个基于组件的软件平台。它提供了一个软件开发和运行时平台,允许开发人员设计基于seL4的系统作为交互组件的集合。
动机
基于微内核的多服务器操作系统被设计成一个保护和分离服务的集合,服务之间通过进程间通信机制进行通信。由于这些服务是由内核和硬件保护的组合保护彼此,所得到的系统有可能是高度可靠和安全的。
然而,随着服务的数量和它们的互连的复杂性的增加,这样的系统的设计变得越来越困难。当没有明确的规范规定服务间应该如何做相互操作时,它们变得特别难以构建和维护。通过使这些服务之间的交互更明确,基于组件的软件工程方法为开发者减少了复杂性,使基于微内核的系统的设计和实现变得可行。
基于组件的软件工程
基于构件的软件工程(CBSE)是一种软件开发方法,它是基于将系统分解成一组相互关联的软件组件。
定义的接口提供预定义的服务。软件组件类似于在面向对象的范式中的对象,它们封装它们的状态以便它是不可见的或不能直接从组件外部访问。然而,组件通常比对象粒度更粗,和抽象层次更高,并有关于它们的接口更严格的要求。特别是,除了定义它们所提供的接口之外,它们还定义了它们使用的接口,也就是,它们依赖的其他组件的接口。软件组件的一个重要特点是,它们是为了可重复使用,并应该被设计和实现为使得它们可以在许多不同的系统中使用。
组件使用连接器相互连接,连接器是系统元件用于显式连接进行相应的通信组件接口。连接器实现了胶水代码来将组件连接在一起,并且它们是该系统的唯一需要显式使用底层系统机制(例如IPC,capabilities,等)的组件。组件的集合和它们之间的连接形成一个系统架构,它通常被称组件系统或组件架构。
组件,组件接口和组件架构如何指定的细节是由一个组件模型定义的。一个组件模型的特点决定了一个特定的基于CBSE的方法的灵活性和能力。 组件平台实现了一个组件模型,并根据该模型提供工具和支持软件用于构建组件和基于组件的系统。(请注意,术语各不相同,有一些重叠。尤其是我们所说的组伯平台有时被称为一个组件框架,组件体系架构或组件系统)
CAmkES的关键属性
最小的核心模型
CAmkES模型的核心提供了构建静态组件化系统所需的最小功能。由核心模型提供的功能包括:RPC规范,事件和数据端口接口,组件规格,和连接器规格。
静态
CAmkES是一个静态系统。这意味着,所有的组件实例以及它们之间的连接器必须在系统的体系结构规范中定义。此外,在启动时,所有的组件和连接器由系统初始化处理在该系统开始运行前创建。
显式交互
在组件化的系统内使组件之间显示通信对提供可重用的组件来说是关键的。这意味着组件仅通过良好定义的接口和与系统的其余部分交互。因此所有的通讯(包括通过共享数据通信)在CAmkES系统架构是显式的。
显式连接器
此外,在CAmkES我们已经确定了组件之间的通信是一个可靠和高性能系统的重要组成部分。其结果是,实现在我们的模型通信的连接器都是一类实体。这意味着,系统开发人员可以选择使用哪些连接器连接的软件组件,也可以定义和实现自己的连接器。另外连接器可以被定义,实现,以及由系统程序员复用就像组件一样。我们称这些为用户定义连接器。
低负荷
CAmkES具有最小的,静态的核心,这就使我们有可能限制基于组件的设计引入的开销。由用户定义的连接器所提供的灵活性允许我们根据的具体要求进一步优化系统。
可优化性
由于组件之间的所有通信是显示的,并且,系统开发者可以影响通信如何发生,CAmkES提供了很大的空间用于特定系统的优化。这种优化的范围可以从基于已知的最佳做法或模式对系统架构进行重组来提高性能,到连接器和关键组件的利用了系统的特定行为来优化性能热点的具体系统实现。这使得系统设计人员能够专注于构建结合良好的软件工程实践的高性能系统。
CAmkES 组件模型
基于CAmkES的系统被设计成一个由连接器连接在一起的组件实例的集合。 CAmkES组件实例代表系统服务,并最终实现为独立的seL4地址空间。 CAmkES连接器表示通信的通道,并使用合适的seL4 IPC机制,包括同步IPC,异步通知,和共享内存段来实现。
组件
组件是功能的封装(类似于面向对象编程的对象,但是,粒度更粗)。 组件显式地定义了它与其他组件的交互点。它指定了它提供给其他部分的接口,以及从其他部分使用接口。
接口
可能的交互类型。 CAmkES提供三类接口:
- 过程调用(也称为远程过程调用,或RPC):一个过程调用接口表示一个组件实现,或者一个组件需要来调用另一个组件的的程序的集合。
- 事件:事件表示异步通知(不包含数据),可以接收或发送到一个组件。
- 数据端口:一个数据端口表示由两个或多个组件共享的内存区域。
接口类型声明指定接口的一种特定类型及它具有的属性。一个过程接口类型声明指定的程序(或方法)和它们的参数和返回类型。一个过程的接口类型是在IDL(接口定义语言)里指定。事件接口类型声明指定一个事件类型。一个数据端口接口类型指定要共享的数据类型。数据端口接口类型在C中指定。
接口实例
组件的定义指定了哪些接口是组件的实例提供给其他部分的,哪些接口是需要使用其他部分的。组件实例之间的相互作用是在它们的接口实例上执行的。每一个这样的接口实例都有一个单一的接口类型。接口实例通常具有与它相关联的方向。对于过程接口,其方向要么是使用,这意味着接口实例可以被用于访问由另一个组件所提供的实现,或者是提供,这意味着该接口的实例是由该组件执行。对一个事件而言,该方向可以是发送,这意味着该接口实例可以用于发送一个事件到另一个组件实例,或者是消费,这意味着该接口实例将接收事件。数据端口情况下不指定方向。
连接器
连接器描述了如何组件实例是如何被连接在一起。
连接器定义了如何组件之间的通信是如何发生的,用于实现该连接的底层机制是什么。连接器类型必须指定它将连接的接口类型。
Assembly
assembly封装了组件系统的描述。一个assembly可以被认为是作为一个完整的系统的完整描述。在一个系统的上下文下,只能有一个assembly。
Composition
并定义成构成系统的组件和连接器的实例。
组件实例
组件实例是组件类型的一个实例。它是在系统中存在的实际组件。可以有一个单一的组件类型的多个实例。组件实例通常(但不一定)是实现为一个独立的seL4地址空间的。组件实例通常也有几个与之相关的seL4线程。
连接
被连接,因此,为了使组件实例能够相互通信,它们的接口的实例必须通过连接由连接。一个连接是使用适当的底层内核机制来实现。
配置
配置是一个组件的另一部分,它描述了系统设置。设置被表示为分配值给属于特定组件或连接器实例的属性。
实体实例化时被赋值,并且这个赋值被称为一个设置。属性通常用于特定或区分一个运行时组件。
CAmkES 系统
CAmkES 平台提供:
ADL
一个架构描述语言用来定义组件和系统架构。
IDL
一个接口定义语言用来定义组件接口。 CAmkES使用的IDL的灵感来自CORBA的OMG IDL。
ADL 和 IDL 编译器
CAmkES的核心是一个从系统ADL和IDL描述生成所有必要的脚手架和胶水代码的工具。这个生成的代码处理seL4初始化,性能管理,资源管理,进程间通信的各个方面。 基于CAmkES系统的开发人员不需要和seL4的基本API直接交互。
CAmkES编译器是基于模板的;生成的代码被定义为基于所构建系统的扩展模板。这意味着开发人员可以很容易地适应生成的代码来扩展或特定其功能。此外,CAmkES可通过其用户定义的连接器扩展,它允许开发者添加的系统特定功能,而不必修改核心的工具。
模板
CAmkES提供所有用来生成seL4的系统代码所需要的必要模板。它也提供了一些模板替代的实现,这些模板利用特定的seL4功能,可能会导致更好的性能。我们也正在开发模板,让CAmkES针对非seL4的系统。
seL4 构建系统集成
seL4内核和所需的库进行配置和构建。
CAmkES的开发
在设计CAmkES系统时,开发人员首先决定于所需要的组件。这些既可以是预先存在的可复用的部件,或者是可能需要为所需系统而定制的。组件通常被设计成使得它们可在不同的系统里复用,可实现从可重用软件组件库的快速的系统开发。
在设计和构建组件时,开发人员首先定义了组件提供的接口。该接口在接口定义语言(IDL)中定义。
然后开发者通过指定由该组件提供和使用的接口来定义组件。这是使用体系结构描述语言(ADL)来定义的。该部件的实际功能是由C源代码提供。
一旦所有的组件被选择和定义,开发者定义系统的体系结构,例如,如何将所有的部件将连接到一起。此架构是使用ADL描述,并指定所有使用的组件,它们之间的连接,并且用于连接的连接器。
然后,开发人员调用编译系统,解析ADL的描述,生成相应的运行时和胶水代码,并将其和组件和连接器的代码一同编译和链接,以产生适当的seL4服务器映像。
然后构建系统再进一步把这些映像和seL4内核和系统初始化服务器结合在一起来生成一个最终的可引导的系统映像。
最后,映像可以在期望的硬件或仿真器中运行。