mit6.s081 lab10 mmap

2024-03-11 06:32
文章标签 s081 mit6 mmap lab10

本文主要是介绍mit6.s081 lab10 mmap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.添加mmap和munmap的syscall
2…为了追踪每个process使用mmap产生的映射区域,使用VMA去记录mmap时的address, length, permission, file等信息。可以创建一个固定大小的VMA数组来进行实现,16个VMA元素已经足够。在proc.h中定义VMA结构体,在proc中添加VMA数组,数组的大小为16。需要注意的是VMA结构体中有offset成员,用于记录addr对应在文件中的偏移量。

struct VMA {uint addr;int offset;int length;int prot;int flags;struct file *f;
};#define NVMA 16// Per-process state
struct proc {
....struct VMA vma_array[NVMA];
};

3.实现mmap函数,在process的地址空间中找到一块空闲的区域去映射文件,添加这片区域的VMA,并在VMA中记录这篇区域对应的file指针,增加file的引用计数,所以即便对该文件使用close函数该文件也仍然有效。在mmap不应该分配物理内存获取读取文件,分配物理内存和读取文件应当在发生page fault时发生,这种设计是为了保证mmap在对大文件进行映射时足够快,以及节省使用mmap的内存。在sys_mmap函数中的主要工作是在proc的VMA数组中找出一个空闲的VMA,使用该VMA记录相关信息,在这个实验的实现中addr和offset默认为0,vma的addr为当前proc的sz,proc->sz在添加完这段映射区域后增加length,最后增加文件的引用。

// mmap的addr和offset始终为0,不需要处理
uint64 sys_mmap(void) {int length, prot, flags;struct file *f;struct VMA *free_vma = 0;struct proc *cur_proc = myproc();if(argint(1, &length) < 0 || argint(2, &prot) < 0 || argint(3, &flags) < 0 || argfd(4, 0, &f) < 0)return 0xffffffffffffffff;if ((flags & MAP_SHARED) && (prot & PROT_WRITE) && !f->writable)return 0xffffffffffffffff;for (int i = 0; i < NVMA; i++) {if (cur_proc->vma_array[i].f == 0) {free_vma = cur_proc->vma_array + i;break;}}if (free_vma == 0) {return 0xffffffffffffffff;}free_vma->addr = cur_proc->sz;free_vma->offset = 0;free_vma->length = length;free_vma->prot = prot;free

这篇关于mit6.s081 lab10 mmap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/796948

相关文章

mmap实现原理

转载处    http://blog.csdn.net/joejames/article/details/37958017 觉得写得非常不错,转载一下以作学习 一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内存映射就很明朗了。

MIT6.S081最详解析与归纳——lab10:mmap

Lab10主题:mmap (一)前置知识:mmap(1)VMA(2)mmap (二)Lab:mmap(1)前置工作(2)实现sys_mmap()(3)实现pagefault(4)实现sys_munmap(5)脏页位设置(六)其它函数的小修改 (三)感言 (一)前置知识:mmap (1)VMA VMA(Virtual Memory Area) 代表虚拟内存区域,它描述了一个进程

6.S081的Lab学习——Lab8: locks

文章目录 前言一、Memory allocator(moderate)提示:解析 二、Buffer cache(hard)解析: 三、Barrier (moderate)解析: 总结 前言 一个本硕双非的小菜鸡,备战24年秋招。打算尝试6.S081,将它的Lab逐一实现,并记录期间心酸历程。 代码下载 官方网站:6.S081官方网站 安装方式: 通过 APT 安装 (De

6.S081的Lab学习——Lab7: Multithreading

文章目录 前言一、Uthread: switching between threads (moderate)提示:解析 二、Using threads (moderate)解析: 三、Barrier (moderate)解析: 总结 前言 一个本硕双非的小菜鸡,备战24年秋招。打算尝试6.S081,将它的Lab逐一实现,并记录期间心酸历程。 代码下载 官方网站:6.S081

文件IO内存零拷贝之mmap

目录 mmap基础概念 mmap内存映射原理 mmap和常规文件操作的区别 mmap优点总结 mmap相关函数 mmap使用细节 性能总结 mmap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自

内存管理源码分析-mmap函数在内核的运行机制以及源码分析

mmap函数的介绍 mmap函数的主要作用是可以将一个文件或者设备的内容映射到内存当中,用户就可以通过一些内存操作方式(如memcpy、memset)对文件或者设备进行直接的操作。这种操作可以减少一些IO的开销,如通过传统的读写文件的方式,可能会频繁的触发系统调用导致IO效率的降低。需要注意的是mmap函数的内存分配方式是页对齐的,即使用户只需要2字节的数据,mmap函数也会分配一个页的内存空间

【MIT6.S081】准备工作

官方网站: 6.S081 / Fall 2020 相关资源: GitHub - PKUFlyingPig/MIT6.S081-2020fall: MIT undergraduate operating system course 版本控制 · 6.S081 All-In-One MIT6.S081 | Miigon's blog

在linux系统下,麻烦使用mmap技术,实现两个进程访问同一个内存区域的操作,并增加锁保护

写入进程 首先,编写一个创建共享内存文件并写入数据的进程代码,添加信号量来保护共享内存区域;当两个进程需要同时写入共享内存区域时,使用锁机制来避免竞争条件和数据不一致是非常重要的。在Linux系统中,可以使用POSIX信号量(semaphore)来实现进程间的同步; POSIX命名信号量在Linux系统中通过内核管理,位于内存中的 /dev/shm/ 虚拟文件系统内,对系统的开销非常小,务必在程

malloc brk mmap

malloc 是一个库函数,通常在 C 标准库中实现,用于动态内存分配。malloc 的具体实现可能因库、操作系统和平台而异,但通常它会与底层操作系统提供的内存管理功能进行交互。 对于大多数现代操作系统(如 Unix、Linux、Windows 等),malloc 在需要时会触发系统调用来获取额外的内存。当进程的堆(heap)空间不足以满足 malloc 的请求时,malloc 会使用系统调用来

Python进阶之-mmap详解

✨前言: Python中的mmap模块允许你创建一个内存映射的文件,这意味着文件数据直接映射到虚拟内存。这样做的好处包括:提高文件访问速度、可通过修改内存来修改文件、可以像操作普通内存一样操作这块特殊的内存区域。 ✨mmap基础 要使用mmap,需要先导入该模块 import mmap 你需要一个文件描述符(可以是一个打开的文件对象的.fileno()方法返回的,也可以是一个现有的文件