介绍的均为内核不配置 MCS 的情况
内核实现了一类对象类型,应用程序可以调用它们的实例(也称为对象objects)。这些对象的接口构成了内核本身的接口。创建和使用内核服务就是通过创建、操作和组合这些内核对象来实现的:
-
CNodes:存储多个能力,许可线程调用特定对象的方法。
- 每个CNode有固定数量的slots(槽),且总是2的整数幂,这在CNode创建时确定。Slots可以是空的,也可以包含能力。
-
线程控制块:表示seL4中的一个线程。
-
端点:促成了线程之间的消息通信。
- IPC是同步的:一个线程试图在一个端点上发送或接收数据,会阻塞直到信息可以传递 (这里未考虑非阻塞的情况,因为非阻塞不要求必须成功发送或接收。) 。这意味着消息传递只会发生在发送方和接收方在端点会合时,从而内核可以通过一次拷⻉来传递消息(或无拷⻉而仅使用寄存器来传递短消息)。
- 端点能力可以限制为仅发送或仅接收。此外,端点还可以拥有授权能力,这允许将另
外的能力作为消息的一部分进行发送。
-
通知对象:提供了一个简单的信号机制。
- 一个通知对象是一个机器字大小的标志集合,每个标志类似于一个两值信号量。
- 操作包括发送信号、轮询检查任何标志的信号、阻塞等待任一标志的信号。
- 通知能力可以限制为仅发送或仅接收。
-
虚拟地址空间对象:用于为一个或多个线程构造虚拟地址空间(
VSpace
)。- 这些对象大部分直接对应硬件设备,因此是架构依赖的。
- 内核还引入了用于跟踪地址空间状态的ASID(Address Space IDentifier)池和ASID控制对象。
-
中断对象:赋予应用程序接收和应答硬件设备中断的能力。
- 初始时,系统有一个
IRQControl
能力,它允许创建IRQHandler
能力。一个IRQHandler
能力管理一个与特定设备关联的特定中断源,并被委托给一个设备驱动程序用以访问中断源。IRQHandler
对象允许线程等待并应答单个中断。
- 初始时,系统有一个
-
未分配内存:
Untyped Memory
是seL4内核内存分配的基础 。内核内存分配- 未分配内存能力只有一个单一的方法用于创建新的内核对象。如果方法成功了,则调用线程获得新创建对象的访问能力。此外,未分配内存可以分为一组更小的未分配内存对象,以代表其拥有的部分或全部系统内存。
retyped a new untyped:
分配为一个新的未分配对象
对象大小概览
对象大小在libsel4中定义。
注意,CNodes、SC和未分配内存对象都是可变大小的。当把未分配内存重新分配成CNodes、SC,或将其分成更小的未分配内存对象时,seL4_Untyped_Retype()
的size_bits参数用于指定生成对象的大小。对于所有其他对象类型,大小是固定的,seL4_Untyped_Retype()
的size_bits参数将被忽略。
类型 | size_bits含义 | 字节大小 |
---|---|---|
CNode | log2(slots数量) | 2^size_bits x 2^seL4_SlotBits seL4_SlotBits : 32位架构:4、64位架构:5 |
SchedContext(仅MCS) | log2(字节数量) | 2^size_bits |
Untyped | log2(字节数量) | 2^size_bits |
对seL4_Untyped_Retype()
的单个调用:
- 可以将一个未分配内存对象重新分配为多个对象,要创建的对象数量由num_objects参数指定。
- 同时创建的所有对象必须具有相同的类型,由type参数指定。
- 对于可变大小的对象,每个对象的大小也必须相同。
- 如果所需的内存区域大小(通过对象大小乘以num_objects计算)大于未分配内存对象剩余内存,则会导致错误。