SeL4 : 三 、内核内存分配与IPC

内核内存分配

seL4微内核不会动态地为内核对象分配内存,相反,必须从应用程序控制的内存区域,通过未分配内存能力显式地创建对象。也就是:

  • 为了创建新对象,应用程序必须要有明确的授权(通过这些未分配内存能力)。
  • 对象一旦创建就会消耗固定数量的内存。

这些机制可以用于精确控制特定数量物理内存对应用程序的可用性,包括能够强制隔离应用程序或设备之间的物理内存访问。除了硬件专用的以外,内核本身不要求任何的资源限制(虚拟ASIDs的处理利用了固定数量的地址空间,这一限制将在后续的版本中移除),因此也就避免了很多通过消耗资源实施的拒绝服务攻击。

在系统引导时,seL4预先分配内核本身所需的内存,包括代码、数据和堆栈部分(seL4是单内核栈操作系统 )。然后,它创建一个初始用戶线程(使用适当的地址和能力空间),将所有剩余的内存,以未分配内存能力的形式交给初始线程,同时还有一些启动初始线程所需的附加内核对象能力。这些未分配内存区域可以使用seL4_Untyped_Retype()方法,进一步分割成多个小的区域或其他内核对象,这些新的对象称为其子对象。

用戶应用程序对使用seL4_Untyped_Retype()创建的对象拥有全部权限,它可以将全部或部分权限委托给它的一个或多个客戶程序。未分配内存对象可以表示两种不同的内存:通用内存或设备内存。

  • 通用内存可以执行内核提供的未分配内存上的任何操作,可以分配作任意类型的对象。
  • 设备内存指硬件平台保留的设备内存区域,这些对象的使用受到内核的以下限制:
    • 设备未分配内存只能重新分配为⻚帧或其他未分配内存对象,例如,开发者不能从设备内存中创建端点。
    • 从设备未分配内存中重新分配的⻚帧对象不能设置为线程IPC缓冲区,或用于创建ASID池。

子对象的这种通用内存或设备内存属性,继承自其父对象,开发者不能进行更改。

重用内存

目前所描述的模型足以让应用程序分配内核对象,在客戶应用程序之间分配权限,并获得由这些对象提供的各种不同的内核服务。对于简单的静态系统配置来说,这就足够了。

seL4内核还允许重用未分配内存区域。重用一个内存区域只有在没有悬空引用(即能力)作用于内存中的对象时才可实施。内核跟踪能力派生,即,由seL4_Untyped_Retype()seL4_CNode_Mint()seL4_CNode_Copy()seL4_CNode_Mutate ()生成的子对象。

这样生成的树结构称为能力派生树(CDT)。例如,当用戶通过分配内存创建新的内核对象时,新创建的能力将作为原始未分配内存对象的子能力插入到CDT中。(虽然从概念上讲CDT是独立的数据结构,但实现上它作为CNode对象的一部分而无需另外的内核元数据。)

对于每个未分配内存区域,内核都保持一个水印记录以前已经分配的区域。每当用戶请求内核在该区域创建新对象时,内核将执行以下两个操作中的一个:

  • 如果已经在该区域分配有对象,那么内核将会在当前水平上分配新对象,并增加水印;
  • 如果先前在该区域中分配的所有对象都已删除,则内核将重置水印,并重新从区域的开始分配新对象。

最后,由CNode对象提供的seL4_CNode_Revoke()方法将销毁指定能力的所有派生能力。撤销内核对象的最后一个能力将触发现在无人引用对象上的销毁操作,这只需清除它与其他对象及内核之间的任何内核依赖项。

通过调用原始未分配内存能力的seL4_CNode_Revoke()方法,用戶可以删除其所有的子对象 — 即所有指向该内存区域的对象能力。因此,在调用之后未分配区域内已经没有任何对象的有效引用,可以安全地重新分配利用。

IPC

seL4微内核为线程之间的通信提供了消息传递IPC机制,同样的机制也用于与内核提供的
服务进行通信。消息通过引用内核对象的能力来发送,发送到端点的消息被传递给其他线
程,而发送到其他对象的消息则由内核处理。本章描述常用的消息格式、端点以及如何将
它们用于应用程序之间的通信。

消息寄存器

每个消息包含一些消息字和一些可选的能力。消息字通过将它们放在线程的消息寄存器中
来发送或接收。消息寄存器都有编号,开始的几个消息寄存器使用物理CPU寄存器实现,
其余的由称为IPC缓冲区的固定内存区域来承担。这种设计的原因是效率:非常短的消息
不需要使用内存。IPC缓冲区被分配给调用线程使用。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值