缺页异常与copy-on-write fork

缺页异常需要什么

当发生缺页异常时,内核需要以下信息才能响应这个异常:

  • 出错的虚拟地址(引发缺页异常的源)
    当一个用户程序触发了缺页异常,会切换到内核空间,将出错的地址放到STVAL寄存器中,这是第一个信息
  • 出错的原因
    因为对于不同场景的缺页异常有不同的响应。例如由于load指令触发的缺页、由于store指令触发的缺页、由于jump指令触发的缺页等等。不同的原因都会有一个代码表示,这个代码就会作为第二个信息,存储在SCAUSE寄存器中。
  • 触发缺页时的程序计数器值
    其表明了缺页这一事件在用户空间发生的位置,因为在操作系统处理完缺页后,CPU需要重新执行发生缺页的那一条指令,也就是PC必须回到原先的那一个值继续往后执行。这个地址作为第三个信息存放在SEPC寄存器中

copy-on-write(COW) fork

Xv6对异常的响应较为简单:若用户空间中某个进程发生了异常,则内核直接终止该进程。若内核空间发生了异常,则the kernel panics。

而实际的操作系统则会利用页缺失异常完成许多功能。例如许多内核会用页缺失来完成copy-on-write(COW) fork。
fork使得子进程共享父进程的内容,即先调用uvmcopy来为子进程分配物理内存,然后将父进程的内容拷贝进去。
由此可见比这种方法更简单的一种方式是,让子进程和父进程直接共享同一片物理内存,就省去了分配新的内存再拷贝内容的麻烦。但是这种方法有种缺点,就是子进程和父进程同时写共享的堆栈的话,会导致彼此干扰。

Copy-on-write fork就可以保证父子共享同一片物理内存而不出现上述干扰。
主要思想是,一开始让父子只读地共享所有物理内存。只有当发生写操作时(即执行到存储指令时)才会复制地址空间,且复制的只是写操作所在的那一页。这时子进程和父进程分别独立拥有这一页的地址空间,且是读写权限。

Page fault在这个过程中的作用就是当发生写操作时,CPU会发起一个页缺失异常(页就是要写的地址所在的那一页),然后内核才会复制这一页的读写版本给父子进程。

一些比较有意思的问题

  1. 对于一些没有父进程的进程,比如系统启动的第一个进程,它会把自己的PTE设置成只读的吗,还是先设置成可读写的,然后在fork的时候再修改为只读的?
    这取决于开发者。操作系统的开发者可以自己选择实现方式。当然最简单的方式就是将PTE设置成只读的,当你要写这些page时,会得到一个page fault,然后再按照上面的流程处理
  2. 当发生page fault时,我们其实是在向一个只读的地址执行写操作。内核如何能够分辨现在是一个copy-on-write fork的场景,而不是应用程序在向一个正常的只读地址写数据?
    内核有能够识别copy-on-write场景的机制。几乎所有的页表页表硬件都支持了这一点。内核可以通过页表项的某一个标识位来分辨当前是否是一个copy-on-write,或者内核也可以通过维护一些进程信息来实现copy-on-write的标识。具体实现是非常自由的。
    关于页表项中的标识位,如下图,在MIT的Xv6实验中,学生可以使用RSW在PTE中设置一个copy-on-write标识位
    请添加图片描述

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

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

相关文章

AndroidAGP8.1.0和JDK 17迁移之旅

AndroidAGP8.1.0和JDK 17迁移之旅 前言: 由于我最近写demo的直接把之前的项目从AGP4.2.2升级到8.1.0引发了一些列问题,这里记录一下,前面讲解过迁移DSL方式遇到的问题,这次升级8.1.0也比之前顺利多了,想看DSL迁移的可…

LeetCode——有效的括号

这里,我提供一种用栈来解决的方法: 思路:栈的结构是先进后出,这样我们就可以模拟栈结构了,如果是‘(’、‘{’、‘[’任何一种,直接push进栈就可以了,如果是‘}’、‘)’…

常见前端面试之VUE面试题汇总七

20. 对 vue 设计原则的理解 1.渐进式 JavaScript 框架:与其它大型框架不同的是,Vue 被设计 为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上 手,还便于与第三方库或既有项目整合。另一方面,当与现代化的…

2023有哪些更好用的网页制作工具

过去,专业人员使用HTMLL、CSS、Javascript等代码手动编写和构建网站。现在有越来越多的智能网页制作工具来帮助任何人实现零代码基础,随意建立和设计网站。在本文中,我们将向您介绍2023年流行的网页制作工具。我相信一旦选择了正确的网页制作…

OpenGL —— 2.5、绘制第一个三角形(附源码,glfw+glad)(更新:纹理贴图)

源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库,该库只有一个头文件。 具体代码: vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec3 aColor; layout(location 2) in vec2 aUV;out ve…

如何搭建智能家居系统并通过内网穿透实现远程控制家中设备

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 前言 Home Assistant&…

(三)Linux中卸载docker(非常详细)

docker 卸载 使用yum安装docker 如需卸载docker可以按下面步骤操作: 1、停止docker服务 systemctl stop docker 2、查看yum安装的docker文件包 yum list installed |grep docker 3、查看docker相关的rpm源文件 rpm -qa |grep docker 4、删除所有安装的docke…

【JVM 内存结构丨栈】

栈 -- 虚拟机栈 简介定义压栈出栈局部变量表操作数栈方法调用特点作用 本地方法栈(C栈)定义栈帧变化作用对比 主页传送门:📀 传送 简介 栈是用于执行线程的内存区域,它包括局部变量和操作数栈。 Java 虚拟机栈会为每…

MySql学习4:多表查询

教程来源 黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括 多表关系 各个表结构之间存在各种关联关系,基本上分为三种:一对多(多对一)、多对多、一对一 一对多(多对一&…

学习设计模式之观察者模式,但是宝可梦

前言 作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。 观察者模式 观察者模式定义了一种一对多的依赖关系,一个对象的状态改变,其他所有依赖者都会接收相应的通知。 所…

常见前端面试之VUE面试题汇总八

22. Vue 子组件和父组件执行顺序 加载渲染过程: 1.父组件 beforeCreate 2.父组件 created 3.父组件 beforeMount 4.子组件 beforeCreate 5.子组件 created 6.子组件 beforeMount 7.子组件 mounted 8.父组件 mounted 更新过程: 1. 父组件 befor…

安全防护产品对接流程讲解

服务器被攻击了,怎么对接高防产品呢,需要提供什么? 1、配置转发规则:提供域名、IP、端口,由专业技术人员为您配置转发协议/转发端口/源站IP等转发规则,平台会分配该线路独享高防IP。 2、修改DNS解析&…

大数据:AI大模型对数据分析领域的颠覆(文末送书)

随着数字化时代的到来,大数据已经成为了各行各业中不可或缺的资源。然而,有效地分析和利用大数据仍然是一个挑战。在这个背景下,OpenAI推出的Code Interpreter正在对数据分析领域进行颠覆性的影响。 如何颠覆数据分析领域?带着这…

java八股文面试[JVM]——双亲委派模型

1.当AppClassLoader去加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委托给父加载器ExtClassLoader去完成。 2.当ExtClassLoader去加载一个class时,它首先也不会去尝试加载这个类,而是把类加载请求委托给父加载…

Module not found: Error: Can‘t resolve ‘less-loader‘解决办法

前言: 主要是在自我提升方面,感觉自己做后端还是需要继续努力,争取炮筒前后端,作为一个全栈软阿金开发人员,所以还是需要努力下,找个方面,目前是计划学会Vue,这样后端有java和pytho…

0101prox-shardingsphere-中间件

1 启动ShardingSphere-Proxy 1.1 获取 目前 ShardingSphere-Proxy 提供了 3 种获取方式: 二进制发布包DockerHelm 这里我们使用Docker安装。 1.2 使用Docker安装 step1:启动Docker容器 docker run -d \ -v /Users/gaogzhen/data/docker/shardings…

Kaniko在containerd中无特权快速构建并推送容器镜像

目录 一、kaniko是什么 二、kaniko工作原理 三、kanijo工作在Containerd上 基于serverless的考虑,我们选择了kaniko作为镜像打包工具,它是google提供了一种不需要特权就可以构建的docker镜像构建工具。 一、kaniko是什么 kaniko 是一种在容器或 Kube…

【React基础全篇】

文章目录 一、关于 React二、脚手架2.1 create-react-app 脚手架的使用2.2 项目目录解析2.3 抽离配置文件2.4 webpack 二次封装2.4.1 集成 css 预处理器2.4.2 配置解析别名 2.5 setupProxy 代理 三、JSX3.1 jsx 语法详解3.2 React.createElement 四、组件定义4.1 类组件4.2 函数…

前端需要理解的跨平台知识

混合开发是指使用多种开发模开发App的一种开发模式,涉及到两大类技术:原生 Native、Web H5。原生 Native 主要指 iOS(Objective C)、Android(Java),原生开发效率较低,开发完成需要重…

leetcode739. 每日温度 单调栈

自己思路: 想到用两个栈,一个维护元素、另一个维护下标。但是还是无法处理有重复元素的问题(用哈希表来存储的时候)。所以就看了答案的思路。 答案思路: 从前往后遍历,维护一个单调栈。栈存放数组的下标。…