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

现在有很多进程间通信的模式,但是我们选择一个简单的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;					 // 指定进程要存在,并将其赋值给envif (!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.// 要映射的目的虚拟地址必须小于UTOPif ((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.hqwc.cn/news/98742.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成都瀚网科技有限公司:抖店的评论会消失吗?

抖店是抖音推出的电子商务平台。很多用户在购物后都会对产品进行评价。但有时用户可能会发现抖店评论缺失&#xff0c;让用户产生一些疑惑和困惑。本文将围绕这个问题提供一些答案和解决方案。 1.为什么抖店评论不见了&#xff1f; 首先需要明确的是&#xff0c;抖店评论消失可…

STM32G030F6 (SOP-20)Cortex ® -M0+, 32KB Flash, 8KB RAM, 17 GPIOs

淘宝淘了一批 STM32G030F6P6 SOP20&#xff0e;先备注一下, 还没想到能干嘛用&#xff0e; 手上的 STM32F103C6T6还剩一些&#xff0e; 一堆 “淘宝原厂STM32F103C8T6”, 还烫着手. 理解信息: ( 逐步补充 ) System Clock GPIOs GPIOs 17 PA[7:0] : 8bits USART Timer ADC I2…

面试中的商业思维:如何展示你对业务的理解

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Ubuuntu22.04 LTS 用户管理,新建用户 adduser,sudo,管理员用户

1、新建用户zzsn adduser zzsn 为用户修改密码 # 为用户修改密码 sudo passwd zzsn 2、验证用户是否创建成功 cat /etc/passwd | grep zzsn 查看系统中所有用户&#xff08;可选&#xff09; grep bash /etc/passwd 3、为新用户授予管理或sudo权限&#xff08;可选&#x…

固定资产卡片乱怎么管理

固定资产卡片是记录公司固定资产信息的重要工具&#xff0c;如果管理不善&#xff0c;容易造成卡片混乱、数据错误等问题。 为了避免这种情况的发生&#xff0c;可以采取以下措施&#xff1a;  建立完善的资产管理制度&#xff0c;明确固定资产的分类、标准和使用情况&#x…

解决uniapp下拉框 内容被覆盖的问题

1. 下拉框 内容被覆盖的问题 场景: 现在是下拉框被表格覆盖了 解决办法: 在表格上添加css 样式来解决这个问题 .add-table{display: static;overflow: visible; } display: static: 将元素会按照默认的布局方式进行显示&#xff0c;不会分为块状或行内元素。 overflow: vi…

SpringMvc框架入门使用(详细教程)

目录 ​编辑 1.SpringMVC框架是什么&#xff1f; 2.SpringMVC工作流程 3.SpringMVC的入门 3.1 pom.xml 3.2spring-mvc.xml 3.3web.xml 3.4 建立一个web的方法 4.5 建立一个首页 4.6效果展示 4.图片处理 1.SpringMVC框架是什么&#xff1f; Spring MVC是一个基…

css让多个盒子强制自动等宽

1.width: calc( 100 / n‘%" ) 2.display:flex; flex:1;width:100px;&#xff08;width是几都行 只要保证一样就可以 会自动等分&#xff09; 3.display:grid;grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); 但是其中某一个内容较长的时候 会破坏1:1:1的…

Linux的命令

Linux的命令分为四个类型&#xff1a;文件操作命令、系统操作命令、文本处理命令和网络操作命令。下面简单介绍一下常用的Linux命令&#xff1a; 文件操作命令 ls&#xff1a;列出目录下的所有文件和目录。 cd&#xff1a;切换当前目录。 mkdir&#xff1a;创建一个新目录。…

skywalking springgateway 全链路

环境 spring-cloud-gateway 3.1.0 springGateway整合skywalking skywalking 默认是不整合springGateway的,需要手动拷贝skywalking optional-plugins下的 apm-spring-cloud-gateway-N.x-plugin-8.13.0.jar 和 apm-spring-webflux-5.x-plugin-8.13.0.jar 架包拷贝到plugins目…

【Python】爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据

目录 前言 一、配置环境 1.1、 安装Python 1.2、 安装Requests库和BeautifulSoup库 1.3.、安装Matplotlib 二、登录豆瓣网&#xff08;重点&#xff09; 2.1、获取代理 2.2、测试代理ip是否可用 2.3、设置大量请求头随机使用 2.4、登录豆瓣网 三、爬取某一部热门电影…

Arcmap操作系列:面数据提取DEM/DSM中的高程点

1.背景 面数据需要高程数据做体模型&#xff0c;原有的面数据没有高程数据&#xff0c;所以需要再dem数据上提取高度值赋给面数据 2.操作 2.1将面数据转线数据 【数据管理工具】--【要素】--【要素转线】 2.2线数据转点数据 【数据管理工具】--【要素】--【要素转点】 同…