缺页异常与copy-on-write fork

news2024/9/21 3:36:15

缺页异常需要什么

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

  • 出错的虚拟地址(引发缺页异常的源)
    当一个用户程序触发了缺页异常,会切换到内核空间,将出错的地址放到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标识位
    请添加图片描述

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

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

相关文章

JVM工具-1. jps:虚拟机进程状态工具

文章目录 1. jps介绍2. jps命令格式3. jps工具主要选项4. jps -q5. jps -m6. jps -l7. jps -v 1. jps介绍 jps(JVM Process Status Tool):虚拟机进程状态工具,可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class&…

3.3.2:SUM作为一般函数及聚合函数的应用

【分享成果,随喜正能量】我们很多道友没受过什么苦,或受不了一句话、一点气,总想悠悠自在成佛。或是念上几十部经就想换取什么,法宝是无价的!你拿有价来换,不但换不到,还丧失了功德。应当不退初…

springboot整合jdbctemplate教程

这篇文章介绍一下springboot项目整合jdbctemplate的步骤,以及通过jdbctemplate完成数据库的增删改查功能。 目录 第一步:准备数据库 第二步:创建springboot项目 1、创建一个springboot项目并命名为jdbctemplate 2、添加spring-jdbc和项目…

探讨uniapp的路由与页面生命周期问题

1 首先我们引入页面路由 2 页面生命周期函数 onLoad() {console.log(页面加载)},onShow() {console.log(页面显示)},onReady(){console.log(页面初次显示)},onHide() {console.log(页面隐藏)},onUnload() {console.log(页面卸载)},onBackPress(){console.log(页面返回)}3 页面…

一串神奇的字符,就能让ChatGPT在内的AI聊天机器人变得不正常

一组看似随机的字符被添加到对话提示的末尾,就会发现几乎任何聊天机器人都显露了邪恶本性。 卡内基梅隆大学计算机科学教授Zico Kolter和博士生Andy Zou的一份报告,揭示了当前主流的聊天机器人,特别是ChatGPT,以及Bard、Claude等…

python print ljust 文本对齐打印 对齐打印名册

背景 在python部分场景下,我们需要打印输出一些文本消息,但我们又无法预测可能的打印内容是什么。这种情况下,我们要对齐打印这些文本,是比较比较难以处理的。 例如下面是一列姓名,和对应的一列手机/电话号&#xff0…

自然对数底e的一些事

自然对数底e的一些事 走的人多了就成了路 中国清代数学家李善兰(1811—1882) 凡此变数中函彼变数者,则此为彼之函数 自然对数底也是使用习惯 🍉 李善兰把function翻译为函数,函就是包含,含有变量&#xff…

C# Winfrom通过COM接口访问和控制Excel应用程序,将Excel数据导入DataGridView

1.首先要创建xlsx文件 2.在Com中添加引用 3. 添加命名空间 using ApExcel Microsoft.Office.Interop.Excel; --这样起个名字方面后面写 4.样例 //点击操作excelDataTable dt new DataTable();string fileName "D:\desktop\tmp\test.xlsx";ApExcel.Application exA…

【学习FreeRTOS】第20章——FreeRTOS内存管理

1.FreeRTOS内存管理简介 在使用 FreeRTOS 创建任务、队列、信号量等对象的时,一般都提供了两种方法: 动态方法创建:自动地从FreeRTOS管理的内存堆中申请创建对象所需的内存,并且在对象删除后,可将这块内存释放回Free…

牛客练习赛 114

C.Kevin的七彩旗 思路:贪心和dp均可以解决。 贪心:我们可以发现,最终想要获得合法的序列,我们必须是通过把几段连续的序列拼凑起来,但序列之间可能有重合,因此我们就转化为了,记录每一段最大的…

IP编址数据转发(md版)

IP编址&数据转发 一、IP编址1.1、二进制、十进制和十六进制1.2、进制之间的转换1.3、IP编址1.4、子网掩码1.5、二进制和十进制转换1.6、IP地址分类1.7、IP地址类型1.8、地址规划 二、VLSM与CIDR2.1、有类IP编址的缺陷2.2、变长子网掩码 VLSM2.3、缺省情况下的掩码2.4、子网…

Redis使用

环境配置 代码实现 Java public CoursePublish getCoursePublishCache(Long courseId){//查询缓存Object jsonObj redisTemplate.opsForValue().get("course:" courseId);if(jsonObj!null){String jsonString jsonObj.toString();System.out.println("从缓…

Linux安装1Panel(官方)

项目简介安装命令 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sh quick_start.sh 访问地址 查看命令:1pctl user-info 常用命令 Usage:1pctl [COMMAND] [ARGS...]1pctl --helpCommands: status …

王道考研:特权指令、用户态与核心态、内核程序与应用程序;中断和异常;系统调用;宏内核与微内核;电脑开机全过程;虚拟机原理

一、操作系统的运行机制 kernel当中包含的是OS当中最核心的部分,像图形界面不是放在kernel当中的,离开图像界面OS仍然可以通过命令行来使用 CPU拿到一条指令就已经可以区分它是特权指令还是非特权指令了 操作系统根据PSW来判断当前正在运行的是用户程序…

html实现元素拖动替换

效果 实现 复制粘贴.html即可使用 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>拖动替换</title></head><style>.box {width: 500px;height: 500px;background: gainsboro;border-radius: 10px;}…

Java中HashMap的基本介绍和详细讲解,HashMap的遍历以及HashMap的底层源码的分析

HashMap 基本介绍 HashMap 是 Java 中的一个集合类&#xff0c;实现了 Map 接口&#xff0c;用于存储键值对&#xff08;key-value&#xff09;数据。它基于哈希表的数据结构实现&#xff0c;可以实现高效的查找、插入和删除操作。 HashMap 细节讨论 无序性&#xff1a; Has…

多语言对接电商平台api接口获取京东商品评论数据代码展示示例

商品评论接口的意义&#xff1a; 确认消费者关注与产品卖点是否一致&#xff1b; 洞察用户对价格、促销、直播的敏感度&#xff1b;发现产品质量、客服、物流等方面的问题&#xff1b;找到品牌宣称与用户预期、实际场景之间差异化&#xff1b;挖掘消费者偏好的差异性&#xff…

【设计模式--原型模式(Prototype Pattern)

一、什么是原型模式 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它的主要目的是通过复制现有对象来创建新的对象&#xff0c;而无需显式地使用构造函数或工厂方法。这种模式允许我们创建一个可定制的原型对象&#xff0c;然后通过复制…

windows下Qt、MinGW、libmodbus源码方式的移植与使用

windows下Qt、MinGW、libmodbus源码方式的移植与使用 1、前言 libmodbus官网&#xff1a;https://libmodbus.org/ github下载&#xff1a;https://github.com/stephane/libmodbus 截止2023年8月26日时&#xff0c;libmodbus最新版本为3.1.10&#xff0c;本篇博客基于此版本进…