mit6.s081 lab10 mmap

本文档详细介绍了在操作系统中实现mmap和munmap系统调用的步骤,包括使用VMA记录映射信息,mmap函数的逻辑,page fault处理,以及sys_munmap函数的实现。实验重点在于如何在进程地址空间中映射文件,延迟物理内存分配,以及处理共享映射时的数据同步问题。同时,exec和fork函数中针对VMA的处理也进行了说明。
摘要由CSDN通过智能技术生成

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-&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值