seL4 Notifications(六)

Notification

  1. 理解如何在任务之间设置共享内存
  2. 能够使用通知对象在任务之间进行同步
  3. 理解如何使用徽章进行通知区分

Background

通知允许进程发送异步信号给彼此,主要用于中断处理以及同步访问共享数据缓存。

信号量对象

信号是通过能力上的调用进行发送和接收到通知对象的。一个通知对象由一个数据字以及一个等待通知的TCB队列组成,该数据字充当二进制信号量数组。

通知对象有三种状态:

  • Waiting ,有TCBs队列等待在该通知上等待被唤醒
  • Active,TCBs已就该通知发出了数据
  • Idle ,没有 TCB 排队,并且自上次设置为空闲以来没有 TCB 向该对象发出信号

Signalling

当任务通过 seL4_Signal 向一个通知对象发出信号时,发生的情况取决于该通知对象的状态:

  • Idle,数据字被设置为用于发送信号的能力的徽章,并且对象被转换为active
  • Active,用于向通知对象发出信号的能力徽章与通知数据字按位或运算
  • Waiting,TCB 队列的头被唤醒,并将徽章发送到该 TCB。如果队列为空,则通知对象将转换为空闲状态。

通过这种方式,通知对象可以被视为信号量的二进制数组——如果信号发送者都在徽章中使用不同的位来发送信号,则他们可以设置不同的徽章位,并且等待者可以观察已设置哪些位。

Waiting

任务可以使用 seL4_Wait 等待通知对象,它执行以下操作:

  • Idle,如果任务处于空闲状态,TCB(任务控制块)会被加入队列,通知对象的状态会变为“等待”状态。
  • Active,如果任务处于活动状态,TCB 会收到数据字,数据字会被重置为 0,同时通知对象的状态会变为“空闲”。
  • Waiting,如果任务处于等待状态,TCB 会被附加到队列中。

Polling

通知对象还可以使用 seL4_Poll 进行轮询,seL4_Poll 是 seL4_Wait 的非阻塞版本,无论状态如何都会立即返回。

Interrupts and IPC

通知对象可以用来接收中断传递的信号,也可以绑定到TCB,使得信号和IPC可以由同一个线程接收。定时器教程对此进行了更详细的解释。

练习

这些练习将指导您完成使用通知和共享内存设置的基本生产者消费者。本教程使用 capDL 加载程序,并且已经有 2 个生产者进程(生产者_1.c 和生产者_2)和 1 个正在运行的消费者进程(consumer.c)。每个进程都可以使用许多能力。
每个生产者与消费者共享一个缓冲区,消费者在来自两个生产者的数据可用时处理该缓冲区。当您开始本教程时,输出将如下所示:

Booting all finished, dropped to user space
Waiting for producer

Set up shared memory

两个生产者都立即启动并阻塞,等待消费者发送带有共享映射地址的 IPC。我们提供下面的代码来设置生产者 1 和消费者之间的共享页:

    /* 复制能力,将cnode->buf1_frame_cap这个能力复制到cnode->mapping_1这个里面,槽位大小为seL4_WordBits,权限为全部*/error = seL4_CNode_Copy(cnode, mapping_1, seL4_WordBits, cnode, buf1_frame_cap, seL4_WordBits, seL4_AllRights);ZF_LOGF_IFERR(error, "Failed to copy cap");/*将物理帧映射到虚拟地址,将mapping_1能力表示的物理帧映射到producer_1_vspace中,从BUF_VADDR这里开始映射,所有权限默认属性*/error = seL4_ARCH_Page_Map(mapping_1, producer_1_vspace, BUF_VADDR, seL4_AllRights, seL4_ARCH_Default_VMAttributes);ZF_LOGF_IFERR(error, "Failed to map frame");

为什么在进行物理帧映射时需要复制能力(capability)?
当复制一个能力时,可以为新的能力指定不同的权限。在 seL4_CNode_Copy 中,你可以指定不同的访问权限(如只读或读写)。这种操作有助于在不同的上下文中使用该帧时施加不同的访问控制。可以细粒度的分场景控制访问权限进行能力的管理和隔离。
一个物理帧通常需要被多个不同的虚拟地址空间映射,这在内存共享等场景下非常常见。通过复制能力,每个映射都可以有独立的能力实例,这样可以追踪、管理和撤销每个映射,而不会影响其他映射。例如,如果你想取消某个特定映射,只需要撤销该映射的能力,而不会影响原始的 buf1_frame_cap 或其他复制的能力。

给的consumer.c中只进行了第一个映射(consumer.c和producer1.c),没有进行第二个映射。下面做第二个映射:

	error = seL4_CNode_Copy(cnode, mapping_2, seL4_WordBits, cnode, buf2_frame_cap, seL4_WordBits, seL4_AllRights);ZF_LOGF_IFERR(error, "Failed to copy cap");error = seL4_ARCH_Page_Map(mapping_2, producer_2_vspace, BUF_VADDR, seL4_AllRights, seL4_ARCH_Default_VMAttributes);ZF_LOGF_IFERR(error, "Failed to map frame");

当消费者访问他们的缓冲区时,这是否成功将在下一次练习后可见。如果生产者 2 的共享页面设置不正确,它将因虚拟机故障而失败。

Signal the producers to go

此时,两个生产者都在等待空通知​​,以获取缓冲区已准备好写入的信号。
练习:通过 buf1_empty 和 buf2_empty 通知对象向两个生产者发出信号。
这里在OS的书里面可以学习到,就是生产者和消费者需要两个信号量,一个full一个empty,然后对二者进行pv操作,来协调生产消费。

// TODO signal both producers,唤醒等待在这两个信号量上的线程seL4_Signal(buf1_empty);seL4_Signal(buf2_empty);

Differentiate signals

唤醒之后的输出如下:
在这里插入图片描述
此时,消费者应该使用适当缓冲区中的数据,并向适当消费者发出缓冲区再次为空的信号。完整通知对象的功能已标记: Producer_1 副本的标记为 0b1, Producer_2 的标记为 0b10。通过检查徽章中的位,您可以看到哪个生产者(可能是两个)生产了数据。
练习:检查徽章并根据徽章值中设置的位向生产者发出empty通知信号。

// TODO, use the badge to check which producer has signalled you, and signal it back. Note that you // may recieve more than 1 signal at a time.if(badge == 1){seL4_Signal(buf1_empty);}else if(badge == 2){seL4_Signal(buf2_empty);}else{seL4_Signal(buf1_empty);seL4_Signal(buf2_empty);}

输出如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1558706.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

海洋大地测量基准与水下导航系列之二国外海底大地测量基准和海底观测网络发展现状(下)

2004年,英国、德国、法国等国家在欧洲“全球环境与安全监测’(Global Monitoring for Environment and Security,GMES)观测计划倡导下制定了“欧洲海底观测网络”(European Seafoor Observatory Network,ESONET)计划。ESONET是一个多学科的欧洲卓越网络(NoE &#x…

数论与同余 - 离散数学系列(七)

目录 1. 整数的性质 整除与因数 最大公约数与最小公倍数 2. 欧几里得算法 算法步骤 3. 模运算与同余 模运算 同余关系 同余的性质 4. 数论在密码学中的应用 RSA 加密算法 5. 实际应用场景 1. 数字签名 2. 哈希函数与数据完整性 3. 密钥交换 6. 例题与练习 例题…

WMS仓储管理系统与MES系统助力企业实现精细化管理

在当今这个信息化、数字化与智能化深度融合的制造业新时代,WMS仓储管理系统与MES管理系统的集成已成为企业提升生产效率、优化库存管理、增强市场竞争力的核心战略。这一创新性的技术整合不仅标志着制造业向更高层次智能化转型的迈进,更是企业实现精益生…

成都睿明智科技有限公司抖音电商服务佼佼者

在当今这个数字化浪潮汹涌的时代,抖音电商以其独特的魅力迅速崛起,成为众多商家竞相追逐的新蓝海。而在这场电商盛宴中,专业的服务商如同灯塔一般,为迷茫的商家指引方向。今天,我们就来深入探讨一家备受瞩目的服务商—…

docker-compose无法切换用户

问题描述 jupyter:image: flink:1.19-pyprivileged: trueuser: rootports:- "9999:8888"volumes:- /data/docker_data/jupyter:/workcommand: sh -c "cd / && jupyter notebook --ip 0.0.0.0 --port 8888 --allow-root --NotebookApp.passwordsha1:658…

从零开始学cv-17:图像绘制基本图形

文章目录 前言一、绘制直线与箭头二、绘制矩形三、绘制圆形椭圆形 前言 随着计算机视觉技术的不断发展,OpenCV作为一款强大的开源图像处理库,受到了越来越多开发者的喜爱。本文将带领读者走进OpenCV的世界,从基础入手,详细介绍如…

通过低代码平台实现CRM系统的快速开发与部署

在当今瞬息万变的商业环境中,企业需要快速响应市场变化,提升客户关系管理(CRM)系统的灵活性和效率。传统的CRM系统开发周期长、成本高、维护复杂,难以满足企业快速部署和迭代的需求。低代码平台的出现,为CR…

Python神仙级思维导图+入门教程(非常详细,入门从这篇开始)

入门 Python 绝非难事,但如何让自己坚持学下去是如今很多学习者面对的一大难题。为了避免像背单词永远停留在 abandon 一样,积极展开自救的小编在尝试过一些入门方法后,终于找到了一个超级棒的一份思维导图视频教程 这是我刚开始学习python时…

鸿蒙开发之ArkUI 界面篇 二十五 购物车

实现效果如下图: 为了好分析,我们将界面分为两部分,标注如下: 很明显区域1和区域2是垂直关系,用Colum容器,区域1又分为左右两部分,是水平关系,大容器使用的是Row,左边是…

爬虫实战:从HTTP请求获取数据解析社区,自动生成代码

在过去的实践中,我们通常通过爬取HTML网页来解析并提取所需数据,然而这只是一种方法。另一种更为直接的方式是通过发送HTTP请求来获取数据。考虑到大多数常见服务商的数据都是通过HTTP接口封装的,因此我们今天的讨论主题是如何通过调用接口来…

eBPF实战教程七 | 性能监控工具—bpftop

目录 bpftop介绍 工作原理 工具使用 功能小结 在之前的文章《USDT的预埋与性能测评》中,我们通过多次触发探针并统计用户态函数调用时间来分析USDT的性能,这种方法在编写demo时非常便捷,但在工程化的项目中,我们通常无法直接修…

竹云参编 | 《个人信息保护合规审计人员能力发展研究报告(2024)》正式发布!

近日,“个人信息保护合规审计实务研讨会”在北京成功举办,来自中国网络安全审查认证和市场监管大数据中心、中国通信学会、中国通信企业协会、中国行为法学会网络与数据法学研究部、蒙牛乳业、平安集团、大成律师事务所、竹云等80余名专家学者、行业精英…

【python实操】python小程序之魔法方法(__init__方法、__str__方法、__del__方法)

引言 python小程序之魔法方法(__init__方法、__str__方法、__del__方法) 文章目录 引言一、__init__方法1.1 题目1.2 代码1.3 代码解释1.3.1 逐行注释1.3.2 代码执行过程 二、__str__方法2.1 题目2.2 代码2.3 代码解释 三、__del__方法3.1 题目3.2 代码3…

2句话说通 一体化模型与矢量模型的不同

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道࿰

安卓系统属性persist类型prop深入剖析

背景: 近来学员朋友在群里问道了prop属性值进行持久化存储相关的问题,针对prop大部分情况下都是在代码端进行get获取读取操作,因为很多系统属性都是ro类型的,即不可以修改的,有一些debug可以修改的属性,但…

GC9008为什么能替代MX6208应用于红外开关,电流开关上

GC9008作为一种新型集成电路,具备了多个方面的优势,使其能够有效替代MX6208。以下是GC9008替代MX6208的主要原因及其优势: 1. 更低的功耗 优势:GC9008在设计上进行了优化,能够在更低的电压下运行,从而显著…

Android Compose 控件基本属性

本文的代码由上一篇文章的Demo进一步书写完成, 传送门:Android Compose的基本使用-CSDN博客 _____________________________________________________________________________ 以下代码分别列举了控件的: 内边距,外边距,内容居中,渐变自定义边框,宽度权重,string资源引用等…

JVM 内存模型与垃圾回收过程详解

JVM 内存模型与垃圾回收过程详解 文章目录 JVM 内存模型与垃圾回收过程详解1. JVM内存分区1.1 具体分区1.2 JVM内存分区的必要性 2. 垃圾回收2.1 CMS垃圾回收器2.2 G1垃圾回收器2.3 JVM垃圾回收从新生代到老年代 1. JVM内存分区 1.1 具体分区 Java虚拟机(JVM&#…

Ubuntu 18.04安装storcli查看阵列信息

rootCeph03:/opt/MegaRAID/storcli# cat /etc/issue Ubuntu 18.04.5 LTS \n \l 准备好storcli的安装包 解压 解压之后可以看到 根据系统版本选择 把storcli_1.18.11_all.deb包传到服务器 使用命令dpkg -I storcli_1.18.11_all.deb ./storcli64 show ./storcli64 /c1 show …

Nuxt3哔哩哔哩移动端项目实战

Nuxt3 - 哔哩哔哩 - 项目实战 简介 Nuxt 框架提供了一种基于 Node.js 的服务端渲染方案 SSR(Server Side Rendering),可以让 Vue 应用在服务器端进行渲染,从而提高页面的加载速度和 SEO。 项目预览 在线预览 https://bilibil…