前言
seL4作为微内核的代表,有很多经典思想,本文进行简单分析。
内容
seL4提供的基本服务
线程:是支持运行软件的CPU执行抽象。
调度上下文(仅MCS): Scheduling contexts, 是CPU执⾏时间的抽象。 地址空间:是虚拟内存空间, 每个空间都包含⼀个应⽤程序。 应⽤程序被限制在它们的地址空间进⾏内存访问。
进程间通信(IPC): 通过端点(endpoints)允许线程使用消息进行通信。
回复对象(仅MCS):Reply objects,用于存储一次性使用的回复能力,由接收方在消息传递期间传递。
通知:提供了一种类似于两值信号量的非阻塞发信号机制。
设备抽象:允许将设备驱动程序实现为非特权的应用程序,内核通过IPC消息传递硬件设备中断。
能力空间:Capability Spaces,存储对内核服务的操控和访问能力(例如访问权限)以及薄记信息。
基于能力的访问控制
为了执行操作,应用程序必须引用(invoke)所拥有的对请求服务有足够访问权限的能力。通过能力模型,系统既可以隔离软件组件,也可以选择特定的通信能力,达成组件之间授权、可控通信。 从概念上讲,能力驻留在应用程序的能力空间(capability space),空间中的每一个地址都指向一个slot(槽)-包含或不包含一个能力。应用程序可以通过使用容纳能力的slot地址来引用该能力-例如请求内核服务。 能力空间被实现为内核管理的CNodes(能力节点)有向图,一个CNode是一个slot表(数组),每个slot可以包含更进一步(另外的)CNode能力,能力空间中一个能力的地址,就是构成到目标能力的路径中各级CNode slot索引的连接。
系统调用
内核对象
应用程序可以调用内核的对象的实例(也称为对象objects)。这些对象的接口构成了内核本身的接口,创建和使用内核服务就是通过创建、操作和组合这些内核对象来实现的。
- CNodes:存储多个能力,许可线程调用特定对象的方法。每个CNode有固定数量的slots(槽),且总是2的整数幂,这在CNode创建时确定。Slots可以是空的,也可以包含能力。
- 线程控制块(TCBs):表示seL4中的一个线程,线程是已调度的、阻塞的、未阻塞的,等等的执行单元,这取决于应用程序与其他线程的交互。
- 调度上下文(仅MCS):在seL4中表示CPU时间。用户可以从未分配内存中创建调度上下文,初创时调度上下文为空,不代表任何时间。大部分情况下, 每个CPU节点都有一个SchedControl能力,它允许用参数填充上下文,并与优先级相结合来控制线程对该CPU的访问时间。
- 端点:促成了线程之间的消息通信,IPC是同步的:一个线程试图在一个端点上发送或接收数据,会阻塞直到信息可以传递。这意味着消息传递只会发生在发送方和接收方在端点会合时,从而内核可以通过一次拷贝来传递消息(或无拷贝而仅使用寄存器来传递短消息)。端点能力可以限制为仅发送或仅接受,此外端点还可以拥有授权能力,这允许将另外的能力作为消息的一部分进行发送。
- 回复对象:跟踪调度上下文让渡,提供一次性使用的回复能力容器。
- 通知对象:提供一个简单的信号机制,一个通知对象是一个机器字大小的标志集合,每个标志类似于一个两值信号量,操作包括发送信号、轮询检查任何标志的信号、阻塞等待任一标志的信号,通知能力可以限制为仅发送或仅接收。
- 虚拟地址空间对象:用于为一个或多个线程构造虚拟地址空间(VSpace),这些对象大部分直接对应硬件设备,因此是架构依赖的。内核还引入了用于跟踪地址空间状态的ASID池和ASID控制对象。
- 中断对象:赋予应用程序接收和应答硬件设备中断的能力。初始时,系统有一个IRQControl能力,它允许创建IRQHandler能力。一个IRQHandler能力管理一个与特定设备关联的特定中断源,并被委托给一个设备驱动程序用以访问中断源,IRQHandler对象允许线程等待并应答单个中断。
- 未分配内存:是seL4内核内存分配的基础,未分配内存能力只有一个单一的方法用于创建新的内核对象。如果方法成功了,则调用线程获得新创建对象的访问能力。此外,未分配内存可以分为一组更小的未分配内存对象,以代表其拥有的部分或全部系统内存。
能力空间
每个用户空间线程都有一个相关的能力空间,其中包含线程拥有的能力,从而控制线程的资源访问。 能力驻留在称为CNode的内核管理对象中,一个CNode是一个slot表,每个slot可以包含一个能力,这个能力也可能是对另一个CNode的引用,从而形成一个有向图,从概念上讲,一个线程的CSpace是从其根CNode能力开始可到达的有向图组成的空间。 CSpace地址指的是一个单独的slot(在CSpace中的某个CNode中),它可能包含也可能不包含能力。线程通过使用容纳能力的slot地址,来引用他们CSpace中的能力。CSpace中的地址是通往目标slot路径中各级CNode能力索引的链接。
能力和能力空间管理
创建CSpace
CSpace是通过创建和操作CNode对象来创建的,当创建一个CNode时,用户必须指定它拥有的slot数量,这决定了它将使用的内存量。
CNode方法
- seL4_CNode_Mint():在指定的CNode槽中从已有能力创建一个新能力、新创建的能力可能比原来的能力拥有更少的权限和不同的保护胃。seL4_CNode_Mint()也可以从未标记的能力创建一个有标记的能力。
- seL4_CNode_Copy():类似于seL4_CNode_Mint(),但是新创建的能力与原始能力有相同的标记和保护位。
- seL4_CNode_Move():在两个指定的能力slots之间移动能力。
- seL4_CNode_Mutate():可以向seL4_CNode_Move()一样移动能力;还可以像seL4_CNode_Mint那样减少它的权限,尽管没有保留原始副本。
- seL4_CNode_Rotate():在三个指定的能力slots之间"旋转"移动两个能力,它实际上是两个seL4_CNode_Move()调用:一个由第二个slot移至第一个slot,另一个由第三个slot移至第二个slot。第一和第三个slot可能是相同的位置,在这种情况下就是交换其中的能力。
- seL4_CNode_Delete():从指定的slot中删除一个能力。
- seL4_CNode_Revoke():相当于对指定能力的每个派生子能力调用seL4_CNode_Delete()。它对指定的能力本身没有影响。
- seL4_CNode_saveCaller():将内核为当前线程生成的回复能力,从创建时的特殊TCB槽移至指定的CSpace槽。
- seL4_CNode_CancelBadgedSend():取消明确阻塞于指定(端点)对象的未完成发送,即,发送者确实是通过这个指定的能力在发送,并且明确指示了与该能力相同的发送标记。
能力的权限
与能力关联的访问权限决定了可以调用的方法。seL4支持四种访问权限,读、写、授予(Grant)、授予回复(GrantReply)。