【Linux内核】以共享内存的方式实现进程间通信

news2024/11/23 22:25:17

现在有很多进程间通信的模式,但是我们选择一个简单的IPC机制(共享内存)来实现,并让它工作起来。

简单来讲我们实现了两个系统调用(不可避免地需要我们完善IDT),发送方查看接受方是否接收,并选择是否发送消息。本质是修改目标进程的页表,实现同一块物理内存的映射。

这两个函数命为sys_ipc_recv()和sys_ipc_try_send(),顾名思义,一个负责发送,一个负责接收。

发送函数sys_ipc_try_send

static int
sys_ipc_try_send(envid_t envid, uint32_t value, void *srcva, unsigned perm)  // 接收消息方进程为envid
{
	// LAB 4: Your code here.
	struct Env *env;
	if (envid2env(envid, &env, 0) < 0) return -E_BAD_ENV;					 // 指定进程要存在,并将其赋值给env
	if (!env->env_ipc_recving) return -E_IPC_NOT_RECV;						 // 对方是否要接收

	if ((size_t) srcva < UTOP) {
		if (((size_t) srcva % PGSIZE) != 0) {
			return -E_INVAL;
		}

		if ((perm & PTE_U) != PTE_U || (perm & PTE_P) != PTE_P) return -E_INVAL;  // 权限检查

		pte_t *pte;
		struct PageInfo *pp = page_lookup(curenv->env_pgdir, srcva, &pte);
		if (!pp) return -E_INVAL;

		if ((perm & PTE_W) && ((size_t) *pte & PTE_W) != PTE_W) return -E_INVAL;  // 权限检查
		if ((size_t) env->env_ipc_dstva < UTOP) {								  // 接收消息方虚拟地址要合理
			if (page_insert(env->env_pgdir, pp, env->env_ipc_dstva, perm) < 0) return -E_NO_MEM;  // 补充目标进程的页表
			env->env_ipc_perm = perm;
		}
	} else {
		env->env_ipc_perm = 0;
	}

	env->env_ipc_from = curenv->env_id;
	env->env_ipc_recving = 0;		// 不再等待
	env->env_ipc_value = value;		// 消息值是多少
	env->env_status = ENV_RUNNABLE; // 就绪态
	env->env_tf.tf_regs.reg_eax = 0;
	return 0;
}

接收函数sys_ipc_recv

static int
sys_ipc_recv(void *dstva)
{
	// LAB 4: Your code here.
	// 要映射的目的虚拟地址必须小于UTOP
	if ((size_t) dstva < UTOP && ((size_t) dstva % PGSIZE) != 0) return -E_INVAL;
	curenv->env_ipc_recving = 1;			// 我正在等待接收消息
	curenv->env_ipc_dstva = dstva;			// 希望将页面映射到这个虚拟地址中
	curenv->env_status = ENV_NOT_RUNNABLE;  // 因为我在等待,所以我阻塞自己,这样做不浪费cpu资源
	sys_yield();							// 主动阻塞自己,操作系统调度其他进程
											// 内核函数当然可以直接调用内核函数
	return 0;
}

除此之外需要包装两个函数

int32_t
ipc_recv(envid_t *from_env_store, void *pg, int *perm_store)
{
	// LAB 4: Your code here.
	if (pg == NULL) {
		pg = (void *)-1;
	}
	int r = sys_ipc_recv(pg);
	if (r < 0) {				//系统调用失败
		if (from_env_store) *from_env_store = 0;
		if (perm_store) *perm_store = 0;
		return r;
	}
	if (from_env_store)
		*from_env_store = thisenv->env_ipc_from;
	if (perm_store)
		*perm_store = thisenv->env_ipc_perm;
	return thisenv->env_ipc_value;
}

void
ipc_send(envid_t to_env, uint32_t val, void *pg, int perm)
{
	// LAB 4: Your code here.
	if (pg == NULL) {
		pg = (void *)-1;
	}
	int r;
	while(1) {
		r = sys_ipc_try_send(to_env, val, pg, perm);
		if (r == 0) {		//发送成功
			return;
		} else if (r == -E_IPC_NOT_RECV) {	//接收进程没有准备好
			sys_yield();
		} else {			//其它错误
			panic("ipc_send():%e", r);
		}
	}
}

本质其实就是实现地址映射,在网上看到一个很好的图,记录一下
在这里插入图片描述

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

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

相关文章

配电室智能运维解决方案

配电智能运维服务是以电易云-智慧电力物联网平台为核心&#xff0c;通过对配电室(或箱变)、高、低压配电柜加装在线监测装置&#xff0c;将运行状态实时传输到电易云平台&#xff0c;人工24小时运维值班&#xff0c;为客户提供大数据时代下的电力运维解决方案&#xff0c;更好的…

基于springboot绩效管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

2.5 PE结构:导入表详细解析

导入表&#xff08;Import Table&#xff09;是Windows可执行文件中的一部分&#xff0c;它记录了程序所需调用的外部函数&#xff08;或API&#xff09;的名称&#xff0c;以及这些函数在哪些动态链接库&#xff08;DLL&#xff09;中可以找到。在Win32编程中我们会经常用到导…

修改 gc2093.c 驱动程序改变摄像头预览的镜像效果

原理 查看gc2093芯片手册&#xff0c;修改寄存器0x0017的数值&#xff0c;可以修改摄像头预览镜像效果。如下&#xff1a; #define GC2093_MIRROR_FLIP_REG 0x0017 #define MIRROR_MASK BIT(0) #define FLIP_MASK BIT(1) 方法 通过修改 gc2093.c 驱动程序可以改变摄像头预览…

NET7快速开发一个商品管理模块-商品列表开发(一)

商品管理模块&#xff0c;一般包含以下几个模块&#xff1a; 商品列表&#xff1a;这里可以看到所有已发布的商品信息列表。 商品管理&#xff1a;添加商品、编辑商品以及删除商品。 具体功能如下图&#xff1a; 1.商品列表 2.添加商品 3.商品SKU编辑

【java】【项目实战】[外卖十]项目优化(mysql读写分离)

目录 一、问题说明 二、读写分离示例 三、Mysql主从复制 3.1 介绍 3.2 配置 3.2.1 前置条件 3.2.2 配置-主库Master 3.2.2.1 第一步 3.2.2.2 第二步 3.2.2.3 第三步 3.2.2.4 第四步 3.2.3 配置-从库Slave 3.2.3.1 第一步 3.2.3.2 第二步 3.2.3.3 第三步 3.2.3.4 …

【TypeScript学习】—编译选项(三)

【TypeScript学习】—编译选项&#xff08;三&#xff09; 一、自动编译文件 tsc xxx.ts -w二、自动编译整个项目 三、编译器选项

3. C++调试时显示代码所在文件 / 函数 / 行号信息

1. 说明 在执行C代码时&#xff0c;有时希望知道当前代码所在的文件名、函数名和对应行号位置信息&#xff0c;方便快速定位到代码所在处。想要获取这些信息&#xff0c;可以使用C提供的一些宏进行获取。 2. 简单说明 __FILE__ : 用于获取当前语句所在源文件的文件名 ——fu…

从本地到Gitee:一步步学习文件上传及解决常见报错问题

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;一步步学习文件上传及解决常见报错问题 文章目录 安装git进入gitee官网&#xff0c;登录账号新建仓库先打开git命令行上传本地资源到仓库第一步&#xff1a;git init第二步&#xff1a;git add .第三…

正版软件|Splashtop Personal 个人版桌面和移动远程控制软件

Splashtop Personal 个人版 - 从平板电脑、智能手机或另一台计算机轻松远程访问 Mac 或 Windows PC 最多可达 5 台设备。在本地网络上免费使用 Splashtop Personal *即可从舒适的沙发或卧室访问家用计算机。 通过订阅 Anywhere Access Pack&#xff0c;可以从 Internet 上的任何…

JLink和ST-Link接口引脚介绍

STM32F1系列&#xff0c;STM8S系列&#xff0c;PY32F003系列都用过好久了&#xff0c;但是对JLink和ST-Link下载器认识&#xff0c;还是很肤浅的。有时候&#xff0c;需要自己接线&#xff0c;却不知道引脚定义&#xff0c;特整理如下&#xff1a; 1、ST-Link ST-Link适合对象…

按钮控件之4---QToolButton 工具按钮控件

一、设置和基本显示 QWidget w; QToolButton *pb1new QToolButton(&w); 设置文字 setText() 设置图标 setIcon() 改变图标大小 setIconSize() 设置提示文本 setToolTip() pb1.setToolTip("hello"); 二、属性 1. arrowType&#xff1a; Qt::ArrowType 设置…

如何让数据成为企业的生产力?

为什么有的企业投入大量的人力、物力、财力做数字化转型建设最终做了个寂寞&#xff01;企业领导没看到数字化的任何价值&#xff01; 如果要问企业数字化转型建设最核心的价值体现是什么&#xff0c;大部分人都会说是&#xff1a;数据&#xff01; 然而&#xff0c;不同的人…

Nginx 配置中root和alias的区别分析

root和alias都可以定义在location模块中&#xff0c;都是用来指定请求资源的真实路径&#xff0c;比如&#xff1a; location /i/ { root /data/w3; } 请求 http://foofish.net/i/top.gif 这个地址时&#xff0c;那么在服务器里面对应的真正的资源 是 /data/w3/i/top.gif文…

使用Vue + axios实现图片上传,轻松又简单

目录 一、Vue框架介绍 二、Axios 介绍 三、实现图片上传 四、Java接收前端图片 一、Vue框架介绍 Vue是一款流行的用于构建用户界面的开源JavaScript框架。它被设计用于简化Web应用程序的开发&#xff0c;特别是单页面应用程序。 Vue具有轻量级、灵活和易学的特点&#xf…

Centos7安装黑客矩阵特效软件cmatrix

一&#xff1a;Cmatrix 是一款 Linux 环境下的炫酷屏保软件 其效果类似于黑客帝国电影中的代码雨 同时该软件也是一个开源软件&#xff0c;开源项目地址&#xff1a;GitHub - abishekvashok/cmatrix: Terminal based "The Matrix" like implementation 二&#xff…

requests模块

1、简介 Requests是⼀个优雅⽽简单的Python HTTP库&#xff0c;专为⼈类⽽构建。 Requests是有史以来下载次数最多的Python软件包之⼀&#xff0c;每天下载量超过400,000次。 之前的urllib做为Python的标准库&#xff0c;因为历史原因&#xff0c;使⽤的⽅式可以说是⾮常的麻烦…

单臂路由实验:通过Trunk和子接口实现VLAN互通

文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1. PC 配置 IP 地址2. PC3 属于 Vlan10&#xff0c;PC4 属于 Vlan20&#xff0c;配置单臂路由实现 Vlan10 和 Vlan20 三层互通3. 测试在 PC3 上 Ping PC4 &#xff0c;可以 Ping 通 PC4 摘要&#xff1a; 本文…

附录1-爬虫的一些技巧

目录 1 寻找url与显示内容的关系 2 修改请求头 3 局部刷新 4 阅读返回信息 5 多尝试页面其他的使用方式 6 尝试不同类型参数 7 表单类型的post多用data发&#xff0c;接口类型的post多用json发 8 消除degger 9 你在浏览器上看到的html与你下载下来的html不一…

【LeetCode每日一题合集】2023.8.21-2023.8.27(统计点对的数目)

文章目录 2337. 移动片段得到字符串⭐解法——脑筋急转弯 849. 到最近的人的最大距离1782. 统计点对的数目&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;解法——从双指针到终极优化单独处理每个询问终极优化TODO 技巧总结用一个int存储两个不超过 65535…