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

2023-10-21 20:50
文章标签 内存 分配 ipc 内核 sel4

本文主要是介绍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缓冲区被分配给调用线程使用。
在这里插入图片描述
在这里插入图片描述

这篇关于SeL4 : 三 、内核内存分配与IPC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/256896

相关文章

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

nginx upstream六种方式分配小结

《nginxupstream六种方式分配小结》本文主要介绍了nginxupstream六种方式分配小结,包括轮询、加权轮询、IP哈希、公平轮询、URL哈希和备份服务器,具有一定的参考价格,感兴趣的可... 目录1 轮询(默认)2 weight3 ip_hash4 fair(第三方)5 url_hash(第三

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在