当前位置: 首页 > ai >正文

Linux 下的COW机制(copy-on-write)

        

        Linux通过MMU进行虚拟地址到物理地址的转换,当进程执行fork()后,会把页中的权限设置为RD-ONLY(只读)。

MMU(内存管理单元)

·       MMU本质是一个集成在CPU核心的硬件电路模块,其核心任务是实现和管理虚拟内存机制,主要是进行虚拟地址到物理地址的实时、高效转换。
在Linu系统中,MMU的作用是:

  1. 提供虚拟地址空间抽象:采用虚拟的思想,让每个进程都感觉自己拥有一个连续的,独立的,巨大的内存空间(这个空间从0开始)
  2. 内存保护和隔离:防止一个进程无意或恶意地访问或修改另一个进程的内存
  3. 内存利用:只加载程序实际需要的部分到物理内存
  4. 共享内存:允许多个进程安全地共享相同的物理内存页

工作流程:

  • 页表管理:Linux内核负责创建,修改和销毁进程的页表结构。在进程创建、内存分配、缺页处理、进程切换时执行这些操作
    • CPU发出虚拟地址
    • MMU基于页表将虚拟地址转换物理地址
    • 访问页表
      • 缺页处理:当MMU在地址转换过程中无法找到有效的PTE或遇到权限错误时,它会触发一个Page Fault中断给一个CPU。CPU陷入内核模式
    • 虚拟地址解析:MMU将地址分为两部分:
      • 高阶位:用作进入页表的索引
      • 低阶位:页内偏移量

COPY-ON-WRITE

  1. 最开始,当一个新进程通过fork被创建,或者创建共享内存映射(mmap)时,父子进程(或映射共享区域)最初共享相同的物理内存页。内核将进程/映射的页表项标记为只读或设置COW标志。此时没有发生实际的物理内存复制。

    • 复制页表:Linux内核会为字进程创建一份父进程页表的副本。此时,父子进程都指向相同的物理页框。
    • 修改权限:内核不仅会将父子进程页表中指向共享物理页的页表项权限设置为 RD-ONLY,还会设置一个专门的标记位来标志这是一个COW页(并非所有RD-ONLY页都是COW页),这个标记能告诉内核缺页处理程序——如果该页发生了写保护错误,别直接报错,可能是一个COW页
  2. 进程尝试写入

    • ​​CPU 尝试执行写指令:​​ P1 执行一条向该共享虚拟地址(比如 Virtual Address 1, VA1)写入数据的指令。
      ​​ * MMU 触发 Page Fault:​​
      ​​ * 原因1:写操作检测:​​ MMU 发现当前指令要求写入一个权限为 RO 的内存页。
      ​​ * 原因2:权限冲突:​​ RO 权限不允许写入,违反了页表项中的权限设置。
    • ​​中断:​​ MMU 产生一个 ​​Page Fault 异常 (中断)​​。CPU 停止当前用户态代码的执行,切换到内核态,调用 Linux 内核的缺页中断处理程序 (Page Fault Handler)。
    • 执行COW
      • 分配新物理页面:内核从空闲物理页面中分配新的物理页面
      • 复制内容:内核将原始物理页框的内容完整复制到这个新分配的物理页框
      • 更新页表:内核修改进程的页表,及那个该页表项指向新的物理页框地址,并设置权限为可读写或其他,然后清除COW标志
    • 恢复执行
      (如果有)内核完后缺页处理,CPU恢复用户态进程的执行,重新执行那条发生缺页的指令
http://www.xdnf.cn/news/12465.html

相关文章:

  • python八股文算法:三数之和
  • 前端~三维地图(cesium)地图遮罩蒙层
  • 货运车辆在高速公路上发生故障,应如何设置警示标志?
  • 山洪径流过程及洪水淹没数值模拟
  • JDK21 虚拟线程原理剖析与性能深度解析
  • 力扣面试150题--克隆图
  • 2025年服装收银系统推荐:助力服装商家高效经营
  • SDC命令详解:使用set_min_capacitance命令进行约束
  • hbuildx运行uzapp项目初始化配置
  • gid1 gid2 profileOwner
  • 使用 XState 状态机打造英语单词学习界面(demo)
  • 深入Kubernetes源码阅读指南核心概念- /pkg/api
  • 使用qsort函数对字符串中的星期名称进行排序
  • 30.【新型数据架构】-区块链数据架构
  • Java并发编程实战 Day 13:Fork/Join框架与并行计算
  • 如何解决 远程 合并冲突
  • Docker容器运行一段时间后GPU无法使用报错Failed to initialize NVML: Unknown Error
  • AFNetworking `setSecurityPolicy:` 方法源码解析及最佳实践
  • 以太网原理图设计和PCB设计deepseek
  • 三十三、面向对象底层逻辑-SpringMVC九大组件之HandlerExceptionResolver接口设计
  • 张量的理解
  • Python如何去除图片干扰
  • pp-ocrv5的关键改进PPHGNetV2_B4
  • java 异步
  • 2025-适用于Windows11Version 24H2的05累积更新,适合基于x64的系统(KB5058411) 安装错误-0x800f0831
  • 第四章 信息系统管理-4.1 管理方法
  • 正式上线!在 Sui 主网上使用 Nautilus 构建防篡改预言机
  • MCP是什么
  • STM32实战:数字音频播放器开发指南
  • DFT测试之TAP/SIB/TDR