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

相关文章

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据