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

相关文章

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

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

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam