3.LAB-5 COW

news/2024/5/18 14:13:26

LAB-5 COW

主要是修改fork缺页中断处理程序

以前fork时,会直接复制原进程的页表内容到新页表,具体过程是

​ 对于原页表中的每一页,malloc一个新页,然后复制数据到新页,最后把这一页映射到新页表

现在进行修改:

1. fork复制页表

  1. 对于新进程,为其创建新页表
  2. 直接复用旧页表项,不复制旧物理页
  3. 如果旧页表项没有写权限,那就无需修改权限,直接复制页表项
  4. 如果有写权限,消除掉其写权限,并为其添加COW Flag

[!IMPORTANT]

如果只有新进程没有写权限,而旧进程有权限,旧进程有可能修改页内容,此时新进程将会出错,因此双方都没有写权限

2. 中断处理程序

当需要修改时,会发生缺页中断,此时再进行数据迁移

  1. 得到发生缺页的物理地址

    查看此页的引用数,如果是1,直接修改页表项,使其有写权限

  2. malloc新页

  3. 把旧页的数据复制到新页中。

  4. 修改页表,使其映射到新页

  5. 修改新页表项,使其有写权限

3. 引用计数

XV6中,页大小为4KB,页分配的最小单位也是4KB

  1. 在kinit时,初始化每一页的引用数为0
  2. kalloc时,引用数加1
  3. kfree时,引用数减1,当引用数为0时,才真的释放此页

4. 页表项Flag说明

image-20220921014023506

相关文件:kernel/riscv.h

  • PTE_V:Valid,页表项是否有效,如果未设置,则对该页的使用会引起异常(即不允许访问)。
  • PTE_R:Read,是否允许指令读取该页。
  • PTE_W:Write,是否允许写入页。
  • PTE_X:Execute,CPU是否可以将页的内容解释为指令并执行它们。
  • PTE_U:User,是否允许用户模式下的指令访问该页,如果未设置PTE_U,则只能在监督者模式下使用。

一些坑

1. 计算页号

XV6的用户内存大小是128M,一共2^15页,但是其起始地址并不是0,而是

// riscv.h
#define KERNBASE 0x80000000L

因此计算页号时,不要直接使用pa<<12获取页号,而要(pa-KERNBASE)<<12

2.uvmcopy复制页表项

复制页表项时,只有当旧表项有写权限时,才需要将其记录为cow页,

如果是只读页,无需进行这种处理,会出错。

比如0地址,存储的是二进制代码,用户态只有读权限,如果将其记录为COW页,尝试向其写入数据时,中断处理会修改这一页,导致出错

代码地址

https://github.com/INnoVationv2/xv6-labs-2023/commits/cow/

image-20240218151645416

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

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

相关文章

南昌航空大学-23201406-第一次OOP博客作业

这个Blog,主要是为了将在面向对象的程序设计课程(Java)中的前三次pta题目集进行一个总结。 一、前言总结三次题目集的题目情况关于题目集 这三次题目集的题量都不大,主要内容都集中在最后的判题程序中。且三次的难度循序渐进,充分起到了锻炼的作用。 题目本身这三次题目集…

30 天精通 RxJS (26):简易实作 Observable(一)

因为实在太多读者在问要如何实作 Observable,所以特别调整了本系列文章最后几篇的内容,空出一天的位置来写如何简易实作 Observable。为什么是简易实作而不完整实作呢? 当然这个系列的文章是希望读者能学会如何使用 RxJS,而 实作 Observable 其实只是帮助我们理解 Observab…

Linux共享库、静态库、动态库详解

1. 介绍使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。 程序函数…

本地部署Llama3-8B/72b 并进行逻辑推理测试

美国当地时间4月18日,Meta开源了Llama3大模型,目前开源版本为8B和70B。Llama 3模型相比Llama 2具有重大飞跃,并在8B和70B参数尺度上建立了LLM模型的新技术。由于预训练和后训练的改进,Llama3模型是目前在8B和70B参数尺度上存在的最好的模型。训练后程序的改进大大降低了错误…

跳跃游戏精细化

跳跃游戏 ​ 给定一个数组,每个元素代表跳跃的距离,判断是否能从起点出发,跳到数组的末尾。 ​ 例如:给定一数组[3,7,8,1,5],从起点出发,可以跳跃3步,跳到位置3,然后跳1步,跳到位置4,跳4步到达末尾 思路分析定义一个变量,用来初始化当前能到达最远位置 遍历数组…

MFC-error C2589: “(”:“::”右边的非法标记

MFC-error C2589: “(”:“::”右边的非法标记错误信息 出错语句 问题原因 解决办法 错误信息 ① 错误 C2589 “(”:“::”右边的非法标记② 错误 C2059 语法错误:“)” 出错语句inline double getFitnessScore (double max_range = std::numeric_limits<double>::max()…

Python库、包、模块

一、什么是库、包、模块 无论是库、包、模块,其核心都在于封装了一系列的功能。 1、库library,这个概念并非Python里的概念,是从C语言过来的。库这个概念其实就是一堆代码一起完成一个或多个任务。非常类似函数,但是是以文件组织在一起。 2、模块module,这个概念就是Pytho…

题解:P10365 [PA2024] Kraniki(评分:8.4)

前言 我们一场模拟赛的题,结果原题是新鲜出炉的。 小弟不才,感觉这题是做过的题中几乎最复杂的了。 既然搞懂了,就来写一发题解吧。 (题外话:目前最优解,我的常数真是小小又大大啊) "Up and down,glowin round..." Solution 1、一个经典的 Trick 直接模拟每一…