(undone) MIT6.S081 2023 学习笔记 (Day11: LAB10 mmap)

url: https://pdos.csail.mit.edu/6.1810/2023/labs/mmap.html


mmap和munmap系统调用允许UNIX程序对其地址空间进行精细控制。它们可用于进程间共享内存、将文件映射到进程地址空间,并作为用户级页面错误处理方案的一部分,例如课程中讨论的垃圾回收算法。在本实验中,您将向xv6添加mmap和munmap功能,重点关注内存映射文件。

The manual page (run man 2 mmap) shows this declaration for mmap:

void *mmap(void *addr, size_t len, int prot, int flags,int fd, off_t offset);

mmap 可以通过多种方式调用,但本实验仅需要实现与文件内存映射相关的部分功能。您可以假设 addr 始终为零,这意味着内核应自行决定文件的映射虚拟地址。mmap 会返回该地址,如果失败则返回 0xffffffffffffffff。len 是要映射的字节数,它可能与文件长度不同。prot 表示内存是否应映射为可读、可写和/或可执行;您可以假设 prot 是 PROT_READ 或 PROT_WRITE 或两者兼具。flags 可以是 MAP_SHARED(表示对映射内存的修改应写回文件)或 MAP_PRIVATE(表示不应写回文件),无需实现其他标志位。fd 是要映射的文件的打开文件描述符。您可以假设 offset 为零(即文件中的映射起始位置)。

即使映射相同 MAP_SHARED 文件的进程不共享物理页,也是允许的。

munmap 的手册页(运行 man 2 munmap)显示其声明如下:

int munmap(void *addr, size_t len);

munmap 应移除指定地址范围内的内存映射。如果进程修改了该内存区域且映射方式为 MAP_SHARED,则需先将修改内容写回文件。munmap 可能仅解除部分 mmap 映射区域,但可以假设其操作范围仅限于:从起始位置解除、从末尾解除,或解除整个区域(而不会在区域中间“打洞”解除部分映射)。

你需要实现足够的 mmap 和 munmap 功能,以确保 mmaptest 测试程序能够正常运行。如果 mmaptest 没有用到某个 mmap 的特性,你就不需要实现该特性。

When you’re done, you should see this output:

$ mmaptest
mmap_test starting
test mmap f
test mmap f: OK
test mmap private
test mmap private: OK
test mmap read-only
test mmap read-only: OK
test mmap read/write
test mmap read/write: OK
test mmap dirty
test mmap dirty: OK
test not-mapped unmap
test not-mapped unmap: OK
test mmap two files
test mmap two files: OK
mmap_test: ALL OK
fork_test starting
fork_test OK
mmaptest: all tests succeeded
$ usertests -q
usertests starting
...
ALL TESTS PASSED
$ 

以下是一些提示:

  • 首先,将 _mmaptest 添加到 UPROGS 中,并添加 mmap 和 munmap 系统调用,以便编译 user/mmaptest.c。目前,只需从 mmap 和 munmap 返回错误。我们在 kernel/fcntl.h 中为您定义了 PROT_READ 等。运行 mmaptest,它将在第一个 mmap 调用失败。
  • 在页面错误处理时懒加载页表。也就是说,mmap 不应分配物理内存或读取文件。相反,在 usertrap 中(或由 usertrap 调用的页面错误处理代码中)执行此操作,就像写时复制实验一样。懒加载的原因是为了确保对大文件的 mmap 快速,并且对大于物理内存的文件的 mmap 成为可能。
  • 跟踪每个进程 mmap 映射的内容。定义一个与“应用程序的虚拟内存”讲座中描述的 VMA(虚拟内存区域)相对应的结构。这应该记录由 mmap 创建的虚拟内存范围的地址、长度、权限、文件等。由于 xv6 内核中没有内核内存分配器,因此可以声明一个固定大小的 VMA 数组,并根据需要从中分配。大小为 16 应该足够。
  • 实现 mmap:在进程的地址空间中找到一个未使用的区域来映射文件,并将一个 VMA 添加到进程的映射区域表中。VMA 应该包含一个指向被映射文件的 struct file 的指针;mmap 应该增加文件的引用计数,以便在文件关闭时结构不会消失(提示:参见 filedup)。运行 mmaptest:第一个 mmap 应该成功,但是对 mmap-ed 内存的第一次访问将导致页面错误并杀死 mmaptest。
  • 添加代码以使 mmap-ed 区域的页面错误分配一个物理页面的内存,将相关文件的 4096 字节读取到该页面,并将其映射到用户地址空间。使用 readi 读取文件,该文件需要一个偏移参数来读取文件(但是您将不得不锁定/解锁传递给 readi 的 inode)。不要忘记正确设置页面的权限。运行 mmaptest;它应该到达第一个 munmap。
  • 实现 munmap:找到地址范围的 VMA 并取消映射指定的页面(提示:使用 uvmunmap)。如果 munmap 删除了之前 mmap 的所有页面,则应该减少相应 struct file 的引用计数。如果取消映射的页面已被修改并且文件被映射为 MAP_SHARED,则应将页面写回文件。查看 filewrite 以获取灵感。
  • 理想情况下,您的实现只会写回程序实际修改的 MAP_SHARED 页面。RISC-V PTE 中的脏位(D)指示页面是否已被写入。但是,mmaptest 不会检查未修改的页面是否没有被写回;因此,您可以不查看 D 位就写回页面。
  • 修改 exit 以取消映射进程的映射区域,就像调用了 munmap 一样。运行 mmaptest;mmap_test 应该通过,但可能不是 fork_test。
  • 修改 fork 以确保子进程具有与父进程相同的映射区域。不要忘记增加 VMA 的 struct file 的引用计数。在子进程的页面错误处理程序中,分配一个新的物理页面而不是与父进程共享页面是可以的。后者会更酷,但需要更多的实现工作。运行 mmaptest;它应该通过 mmap_test 和 fork_test。

运行 usertests -q 以确保一切仍然正常工作。

TODO: here


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

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

相关文章

Q_OBJECT宏的作用

Qt 中,如果一个类中定义了信号(signals)或槽(slots),那么这个类必须包含 Q_OBJECT 宏。 Q_OBJECT宏是 Qt 元对象系统的核心部分,它使得信号和槽机制能够正常工作。 Q_OBJECT宏是 Qt 的元对象系统…

信息安全基石:加解密技术的原理、应用与未来

信息加解密技术是信息安全领域的核心技术之一,以下为你详细介绍: 一、加密技术 1.定义:加密是通过特定的算法和密钥,将原始的明文信息转化为看似无意义的密文信息的过程。这一过程使得信息在传输、存储等过程中,即使…

LeetCode:返回倒数第k个结点

1、题目描述 实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 注意:本题相对原题稍作改动 示例: 输入: 1->2->3->4->5 和 k 2 输出: 4 说明: 给定的 k 保证是有效的。 2、…

R004 -计算机硬件基础

目录 1.数据表示&计算机网络组成 2.计算机网络分类 3.冯诺依曼体系结构 4.指令系统基础 5.指令系统类型 6.流水线技术 流水线周期 :各流水段中,执行时间最长的那一段。就是T 流水线时间:t 1t2t 3 (n-1) * T 7.流水线指标 8.存储系…

Mybatis学习(下)

目录 1. 动态sql的应用 1.2 1.2 1.3 、 、 标签 1.4 1. 动态sql的应用 使用Mybatis框架时, 对于sql数据的操作量比较大的时候, 看着会觉得很乱, 可能写着写着就乱了, 或者说回过头来发现sql语句写错了, 很麻烦, 所以动态sql就可以让我们用Java代码, 替换部分sql语句 1.2 &l…

iview 老版本合并单元格

新版的iview中已经支持了合并单元格了,我的版本比较老,为:"iview": "^3.5.2"。暂不支持。记录一下别的大佬的方法。感觉思路比较活,正在这种思路需要在解决问题的过程中学习。 核心思路:通过rende…

FGMRES(Flexible Generalized Minimal Residual)方法

FGMRES(Flexible Generalized Minimal Residual)方法是GMRES的变种,主要用于处理变预处理子(即每次迭代的预处理子可能不同)的情况。与标准GMRES相比,FGMRES通过存储预处理后的向量而非预处理子本身&#x…

自主采集高质量三维重建数据集指南:面向3DGS与NeRF的图像与视频拍摄技巧【2025最新版!!】

一、✨ 引言 随着三维重建技术的飞速发展,NeRF(Neural Radiance Fields)与 3D Gaussian Splatting(3DGS)等方法成为重建真实场景和物体几何细节的前沿方案。这些方法在大规模场景建模、机器人感知、文物数字化、工业检…

HarmonyOS Next-DevEco Studio(5.0.2)无网络环境配置(详细教程)

开发者如果电脑处于完全无网环境,可以参考下面文档进行相关配置 DevEco Studio(5.0.2)开发环境一览: 工具版本DevEco Studio5.0.2openHarmonySDK14ohpm5.0.11node.js18.20.1hypium1.0.21 一、下载DevEco Studio(5.0.2 Release)…

MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎样练成的?

接上文MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 探究sleep.c是如何’炼成’的? 老实讲,我不熟悉Makefile,最多写过简单的编译和辅助脚本,拿到Xv6的Makefile是一脸懵的,至今还是一脸懵,那么我们上篇中新加的…

顺序结构双链表的实现

双链表是用最快的时间实现链表的一种方式&#xff0c;具体的实现代码如下&#xff1a; #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* next;/…

GoFrame 奉孝学习笔记

第一章节 GoFrame 是一款基础设施建设比较完善的模块化框架 GoFrame 是一款基础设施建设比较完善的模块化框架, Web Server 模块是其中比较核心的模块,我们这里将 Web 服务开发作为框架入门的选择,便于大家更容易学习和理解。 用GOland编写代码 go.mod module goframePro…

pinia实现数据持久化插件pinia-plugin-persist-uni

在学习uniapp过程中&#xff0c;看到了pinia-plugin-persist-uni插件&#xff0c;以前面试过程中也有面试过说vuex数据刷新之前的数据就丢失了&#xff0c;之前回答的是把数据存储到数据库或者本地存储。pinia-plugin-persist-uni本质上数据也是本地存储。 1、安装 npm instal…

Git 多账号切换及全局用户名设置不生效问,GIT进行上传无权限问题

解决 Git 多账号切换及全局用户名设置不生效问题 在软件开发过程中&#xff0c;我们经常会使用 Git 进行版本控制。有时&#xff0c;我们需要在同一台机器上管理多个 Git 账号&#xff0c;最近我在进行使用git的时候因为项目要进行上传的不同的git账号&#xff0c;但是通过本地…

基于STM32定时器中断讲解(HAL库)

基于STM32定时器中断讲解&#xff08;HAL库&#xff09; 1、定时器简单介绍 以STM32F103C8T6中几个定时器为例&#xff1a; TIM1&#xff1a;这是一个高级定时器&#xff0c;不仅具备基本的定时中断功能&#xff0c;还拥有内外时钟源选择、输入捕获、输出比较、编码器接口以…

UE5 项目迁移 注意事项记录

做项目的时候项目越做越大 132g的体量一旦移动复制就耗时间 这个时候迁移派上了用场 前置知识&#xff1a;会使用基本ue迁移流程 以下是迁移注意事项 迁移步骤 首先把项目插件plugins复制粘贴到新项目中其次把.project文本形式 全部复制粘贴新项目中开始迁移项目 选中要迁移的…

套接字+Socket连接

制作加载中动画&#xff1a; 创建Panel&#xff0c;制作预制体&#xff0c;在Image游戏物体中添加DOTween插件&#xff0c;相关设置如下&#xff1a; (此为DOTween Pro,需付费&#xff0c;也可按下面的数值编写代码解决) Socket套接字 套接字就是将IP地址与主机端口号合并在一…

第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题答和案解析

一、选择题 第 1 题 单选题 题目:表达式 ‘6’ - ‘1’ 的值是 ( ) A. 整数 5 B. 字符 5 C. 表达式不合法 D. 字符 6 答案:A 解析:在 C++ 中,字符常量以 ASCII 码形式存储。6 的 ASCII 码为 54,1 的 ASCII 码为 49,二者相减结果为 5,是整数类型,因此选 A。 第 2 题 …

使用Rust + WebAssembly提升前端渲染性能:从原理到落地

一、问题背景&#xff1a;为什么选择WebAssembly&#xff1f; 最近在开发数据可视化大屏项目时&#xff0c;我们遇到了一个棘手的问题&#xff1a;前端需要实时渲染10万数据点的动态散点图&#xff0c;使用纯JavaScript Canvas方案在低端设备上帧率不足15FPS。经过性能分析&a…

【沐风老师】3DMAX按元素UV修改器插件教程

3DMAX按元素UV修改器UV By Element是一个脚本化的修改器插件。对于需要创建随机化纹理效果的用户而言&#xff0c;3DMAX的UV By Element修改器无疑是一款高效工具&#xff0c;它将以伪随机量偏移、旋转和/或缩放每个元素的UV坐标。 【版本要求】 3dMax 2016及以上 【安装方法】…