11.Lab Ten —— mmap

news2024/11/25 23:53:13

内存映射文件(Memory-Mapped File)是一种将文件内容映射到进程的虚拟地址空间的技术,使得文件的内容可以像内存一样被访问。

通过内存映射文件,可以高效地访问和操作文件内容

首先切换到mmap分支

git checkout mmap
make clean
  1. 在Makefile中添加 $U/_mmaptest,同时添加mmap和munmap系统调用的声明定义,包括kernel/syscall.h, kernel/syscall.c, user/usys.pluser/user.h.

2.在 kernel/proc.h 中定义VMA结构体及数组

VMA存储了mmap-ed的信息,当一个进程调用mmap后,kernel会将已经mmap的信息记录到进程的一个VMA数组中(一次mmap对应一个VMA),strcut proc中有一个vma_pool字段存储所有的VMA,是一个固定大小的数组,当在mmap需要存储一个VMA时,就是从vma_pool中找一个空闲的位置并将VMA放进去

MAX_VMA_POOL定义为16

VMA结构体字段含义:

  • used:表明VMA是否已经使用,用于在vma_pool中寻空闲位置

  • addr:在内存中映射的内存地址

  • length:映射的大小

  • prot:mmap参数中的权限

  • flags:mmap参数中的flags

  • offset:mmap参数中的offset,一般恒为0

  • f:要映射的文件

3.在kernel/proc.c中的allocproc函数(分配新的进程结构体)中增加对vma_pool的初始化

4.在kernel/proc.c中实现vma_pool中分配和释放VMA的逻辑vma_alloc和vma_fre,同时将函数放到defs.h中

5. 实现sys_mmap()逻辑(有关mmap的系统调用已经在最开始设置好)

调用system call传入参数,检查权限,然后从vma_pool中分配一个空的vma位置,将其填充mmap的相关信息

6.实现sys_munmap()逻辑

解析调用system call的参数,在vma_pool中找到munmap的内存地址所对应的VMA,根据VMA的信息,将修改数据回写到文件中,然后更新VMA的信息,同时如果发现当初mmap的内存全部munmap,那就释放VMA

int
munmap_impl(uint64 addr, int length)
{
  struct proc *p = myproc();

  // 在 vma pool 中找到 addr 对应的 vma
  struct VMA *vma = 0;
  int i;
  for (i = 0; i < MAX_VMA_POOL; i++) {
    vma = p->vma_pool + i;
    if (vma->used == 1 && addr >= vma->addr && (addr + length) < (vma->addr + vma->length)) {
      break;
    }
  }
  if (i > MAX_VMA_POOL) {
    return -1;
  }
  // 根据 vma 的信息,将数据回写入文件中
  uint64 begin_addr = addr;
  uint64 end_addr = addr + length;
  if (vma->flags == MAP_SHARED && vma->f->writable) {
    uint64 cur_addr = begin_addr;
    while (cur_addr < end_addr) {
      int sz = end_addr - cur_addr >= PGSIZE? PGSIZE: end_addr - cur_addr;
      begin_op();
      ilock(vma->f->ip);
      if (writei(vma->f->ip, 1, cur_addr, cur_addr - vma->addr, sz) != sz) {
        return -1;
      }
      iunlock(vma->f->ip);
      end_op();
      uvmunmap(p->pagetable, cur_addr, 1, 1);
      cur_addr += PGSIZE;
    }
  }
  // 完成回写后,更新 vma 中的信息
  //如果头部的取消映射,那么前面length地址长度的空间都无效了,所以需要+length
  if (addr == vma->addr) {  // 说明 addr 是 mmap 内存的头部
    vma->addr += length;
    vma->length -= length;
    //如果不是头部而是尾部,那其实对vma的起始位置没有影响,直接长度减减即可
  } else if (addr + length == vma->addr + vma->length) { // 说明 addr 是 mmap 的尾部
    vma->length -= length;
  }
  // 如果 mmap 的内存全部被 munmmap,那需要释放 vma 以及对 file 的引用
  if (vma->length == 0 && vma->used == 1) {
    filedup(vma->f);
    vma->used = 0;
  }
  return 0;
}


uint64 sys_munmap(void){
  uint64 addr;
  int length;
  if(argaddr(0,&addr) < 0 || argint(1,&length) < 0){
    return -1;
  }
  return (uint64) munmap_impl(addr,length);
}

7.在kernel/trap.c中的usertrap增加对page fault的处理,因为mmap只是分配了虚拟内存,并没有分配物理内存,当用户访问mmap的内存时会产生page fault,所以需要分配实际的物理内存

同时因为实现了COW,也就是mmap的内存是lazy allocation的,那么虚拟内存不一定有对应的物理内存,就需要修改kernel/vm.c中的uvmcopyuvmunmap

8.修改exit(kernel/proc.c)和fork(kernel/proc.c)

exit应当释放当前进程全部的mmap-ed的内存区域

fork应当让子进程拥有与父进程相同的mmaped

可以发现这里exit使用了munmap_impl函数,那么需要将该函数放到kernel/defs.h当中

测试

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

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

相关文章

【机器学习】随机森林算法(看我以弱博强)

目录 算法引入&#xff1a; 算法介绍&#xff1a; 1. 集成学习&#xff1a; 2. 训练过程&#xff1a; 3. 分类和回归&#xff1a; 算法优点&#xff1a; 算法缺点&#xff1a; 算法实现&#xff1a; 1. 数据准备 2. 划分数据集 3. 创建随机森林模型 4. 训练模型 5…

Kubesphere4.1版本创建应用Mysql并实现外网访问

目前Kubesphere4.1版本可查创建应用资料较少&#xff0c;特此记录作为参考。 目标 使用Kubesphere4.1完成Mysql服务部署并实现外网访问。 具体流程如下&#xff1a; 1.创建企业空间 2.创建项目 3.创建应用仓库 4.创建应用&#xff08;mysql&#xff09; 5.配置外网访…

抖去推--短视频矩阵系统源码对外资料包

#短视频矩阵系统源码# #短视频矩阵系统源码开发# #短视频矩阵系统源码打包# 一、短视频矩阵系统源码安装 安装环境 短视频矩阵系统源码需要以下环境&#xff1a; PHP 7.0 及以上 MySQL 5.5 及以上 Nginx / Apache Redis FFMpeg 下载源码 从官网下载最新版本的短视频矩阵系统…

浅谈云原生--微服务、CICD、Serverless、服务网格

往期推荐 浅学React和JSX-CSDN博客 一文搞懂大数据流式计算引擎Flink【万字详解&#xff0c;史上最全】-CSDN博客 一文入门大数据准流式计算引擎Spark【万字详解&#xff0c;全网最新】_大数据 spark-CSDN博客 目录 1. 云原生概念和特点 2. 常见云模式 3. 云对外提供服务的…

【linux】麒麟v10安装prometheus监控(ARM架构)

Prometheus介绍 Prometheus 是一个开源的系统监控和警报工具包&#xff0c;最初由 SoundCloud 开发&#xff0c;现在是一个独立的开源项目&#xff0c;并且是云原生计算基金会&#xff08;CNCF&#xff09;的一部分。Prometheus 以其强大的数据模型和灵活的查询语言&#xff0…

线下餐厅自主点餐或外卖配送小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 线下餐厅自主点餐或外卖配送小程序源码系统是一款专为餐饮行业打造的智能化解决方案。它融合了自主点餐、外卖配送、订单管理、数据分析等多种功能&#xff0c;为餐厅提供了一站式的服务平台。通过该系统&#xff0c;餐厅可以实现线上线下一体化运营&#xff0c;提高工…

猿人学 — 第1届第3题(解题思路附源码)

猿人学 — 第1届第3题 翻页发现一共有两个请求 第一个请求&#xff1a;返回状态码为202&#xff08;服务器已经接收请求&#xff0c;但尚未处理&#xff09;&#xff0c;响应头中还有一个Set-Cookie 第二个请求&#xff1a;返回了我们想要的数据&#xff0c;携带的Payload中…

基于M芯片MAC系统的hadoop、zookeeper、hbase安装

hadoop、zookeeper、hbase安装 1. vmware配置 搜索&#xff1a;“vmware for mac”&#xff0c;购买正版并下载&#xff0c;或通过其他渠道下载均可 随机掉落的奇怪链接 2. 下载镜像并安装虚拟机 bug记录1 此处选用ubuntu的20以及24&#xff0c;分别出现无法加载安装程序、…

会话管理:深入理解SQLAlchemy会话及其事务处理

引言 SQLAlchemy是一个流行的Python SQL工具包和对象关系映射&#xff08;ORM&#xff09;系统&#xff0c;它提供了一个高层的ORM以及底层的SQL表达式语言。在SQLAlchemy中&#xff0c;会话&#xff08;Session&#xff09;是与数据库交互的核心概念&#xff0c;它不仅负责对…

外卖配送小程序源码系统 带源代码包以及搭建部署教程

系统概述 外卖配送小程序源码系统是一套完整的解决方案&#xff0c;旨在帮助用户快速搭建自己的外卖配送平台。它融合了先进的技术和创新的设计理念&#xff0c;为用户提供了一个稳定、高效、易用的系统环境。 该系统基于移动端开发&#xff0c;能够与各种操作系统兼容&#…

2.stm32 GPIO输出

GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口 可配置为8种输入输出模式 引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V 输出模式下可控制端口输出高低电平&#xff0c;用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 …

网络变压器的作用是什么

在网络通讯主板上,在PHY芯片与RJ45连接器之间,会有一个黑属的小方块,这个东西就叫网络变压器,书名"数据录”人们常把它称为网络隔真变压务,LAN变压客,局域网变压器,滤波器等。 它在一块网络设备接口上所起的作用主要有两个; 一、传输数据,它把PHY送出来的差分信号用差模合…

电子元器件是电子电路中的基本组成部分

电子元器件是电子电路中的基本组成部分&#xff0c;主要包括以下几类&#xff1a; 一、电阻器 作用 限流&#xff1a;限制电路中的电流大小。分压&#xff1a;将电压按照一定比例分配。负载&#xff1a;作为电路中的负载元件。 分类 固定电阻&#xff1a;阻值固定不变。可变电阻…

ros1编译wpr_simulation库

目录 安装项目依赖包编译将环境参数加载到终端程序中运行编译好的ros程序 首先你下载好这个库以后。 安装项目依赖包 scripts库中&#xff0c;存放的是一些依赖项安装脚本以及python脚本。 进入到这个路径的终端。 输入 ./install_for_noetic.sh编译 输入下面命令&#xf…

小猿口算自动PK脚本

大家好&#xff0c;我是小黄。 近期&#xff0c;众多大学生炸鱼小猿口算APP,把一众小学生都快虐哭了&#xff0c;小黄听闻后&#xff0c;也跃跃欲试。对此小黄也参考网上的资料写了一个自动Pk的脚步。 首先大家需要安装一个pytorch环境过程中&#xff0c;如果小伙伴对此不熟悉的…

【YOLOv11】ultralytics最新作品yolov11 AND 模型的训练、推理、验证、导出 以及 使用

​目录 一 ultralytics公司的最新作品YOLOV11 1 yolov11的创新 2 安装YOLOv11 3 PYTHON Guide 二 训练 三 验证 四 推理 五 导出模型 六 使用 文档&#xff1a;https://docs.ultralytics.com/models/yolo11/ 代码链接&#xff1a;https://github.com/ultralytics/ult…

MyBatis 用法详解

文章目录 一、普通 SQL1.1 注解实现&#xff1a;1.1.1 参数传递&#xff1a;1.1.2 增&#xff08;Insert&#xff09;&#xff1a;1.1.3 删&#xff08;Delete&#xff09;&#xff1a;1.1.4 改&#xff08;Update&#xff09;&#xff1a;1.1.5 查&#xff08;Select&#xff…

大疆M2006+C610 pid参数调优

官方给的示例代码里给的是1.5, 0.1, 0 但试了下空转时显然不太行. 自己摸索出0.8, 0.03, 0 表现如图中的蓝色线 期望速度先两秒的1000,然后一秒的2000,一秒的3000, 0 2000 表现还不错,可以看到0.5秒后与期望值的差距控制在大概10%之内,但还是感觉有些过调 对了先说一下基础知识…