首页/新闻资讯/正文详情

memory do_page_mkwrite

发布时间:2026/11/3 2:52:28 来源:云帆数科 栏目:资讯中心
memory do_page_mkwrite
do_page_mkwrite是文件映射写缺页路径中的关键回调封装函数。当用户试图写入一个通过文件映射、但当前 PTE 为只读的页面时内核需要先通知文件系统“这个页面即将变脏”以便文件系统有机会进行必要的准备如分配磁盘块、检查配额do_page_mkwrite正是这一通知机制的调用入口。核心功能与实现根据当前主线的实现已完成 folio 转换其核心逻辑如下static vm_fault_t do_page_mkwrite(struct vm_fault *vmf, struct folio *folio) { vm_fault_t ret; unsigned int old_flags vmf-flags; vmf-flags FAULT_FLAG_WRITE|FAULT_FLAG_MKWRITE; if (vmf-vma-vm_file IS_SWAPFILE(vmf-vma-vm_file-f_mapping-host)) return VM_FAULT_SIGBUS; ret vmf-vma-vm_ops-page_mkwrite(vmf); /* Restore original flags so that caller is not surprised */ vmf-flags old_flags; if (unlikely(ret (VM_FAULT_ERROR | VM_FAULT_NOPAGE))) return ret; if (unlikely(!(ret VM_FAULT_LOCKED))) { folio_lock(folio); if (!folio_mapping(folio)) { folio_unlock(folio); return 0; /* retry */ } ret | VM_FAULT_LOCKED; } else VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio); return ret; }关键设计点1. 通知文件系统函数通过vmf-vma-vm_ops-page_mkwrite(vmf)调用具体的文件系统回调。这个回调允许文件系统在页面变为可写之前执行必要的准备工作例如实现存储分配或预留以优雅地处理 ENOSPC 错误可能通过生成 SIGBUS。延迟将页面设为可写直到内容被写入后端缓存对 NFS/AFS 结合 FS-Cache/CacheFS 有用。统计和限制脏页数量这是 FUSE 共享可写映射安全工作的关键一环。2. 锁与竞态处理这个回调的一个核心设计约束是调用page_mkwrite时不能持有页表锁PTL因为文件系统实现可能需要睡眠。函数将vmf-flags临时设置为FAULT_FLAG_WRITE|FAULT_FLAG_MKWRITE以便文件系统知道这是一个 mkwrite 操作调用完成后再恢复原标志。3. 页面锁定协议文件系统回调的返回值有特定协议如果返回VM_FAULT_LOCKED表示文件系统已经锁定了页面。如果返回 0成功但未锁定do_page_mkwrite会代为锁定页面然后检查folio-mapping是否仍然有效。如果 mapping 已为 NULL说明页面在文件系统回调期间被截断或移除则解锁并返回 0让调用者重试。如果返回错误VM_FAULT_ERROR或VM_FAULT_NOPAGE直接向上传递调用者会向用户进程发送 SIGBUS。4. 交换文件保护如果 VMA 关联的文件是交换文件IS_SWAPFILE直接返回VM_FAULT_SIGBUS。这是因为交换文件不应被用户空间直接映射写入。演进从 page 到 folio该函数在 2023 年的补丁系列中完成了 folio 转换参数从隐式的vmf-page改为显式的struct folio *folio节省了一次隐式的compound_head()调用。内部的lock_page/unlock_page改为folio_lock/folio_unlock。检查page-mapping改为folio_mapping(folio)这里有一个重要的细节如果使用folio-mapping直接访问对于某些特殊类型的 folio如 Movable 类型的页面低位标记会导致误判为 NULL从而进入无限重试循环。使用folio_mapping()辅助函数可以正确过滤这些标记。调用场景do_page_mkwrite由两个上层函数调用wp_page_shared()处理共享映射的写缺页。当页面已经是可共享的但 PTE 是只读时先调用do_page_mkwrite通知文件系统然后重新验证 PTE 并复用页面。do_shared_fault()处理共享文件映射的写缺页调用do_page_mkwrite后继续执行finish_fault完成映射建立。如果文件系统未实现page_mkwrite回调vma-vm_ops-page_mkwrite为 NULL内核会直接标记页面为脏无需通知文件系统。

相关推荐

windows11镜像下载 官方原版ISO(64位)安装教程 2026最新
windows11镜像下载 官方原版ISO(64位)安装教程 2026最新

windows11镜像下载 官方原版ISO(64位)安装教程 2026最新# windows11镜像下载 官方原版ISO(64位)安装教程 2026最新 Windows 11 是微软现在主推的桌面操作系统,新买的电脑基本都预装了它,但很多老电脑重装、… · 2026/11/3 2:52:28

【双指针】基础知识
【双指针】基础知识

为何学习双指针算法效率高:把嵌套循环变成单层循环,时间复杂度从 O (n) 降到 O (n),数据量越大,优势越明显空间省:不需要额外开辟数组、哈希表等空间,空间复杂度 O (1)逻辑简单:不用复杂的递归或… · 2026/11/3 2:52:28

一个 4B 小模型被玩出了三条路:一句话生成 3D 世界,还能去给自动驾驶当“眼睛”
一个 4B 小模型被玩出了三条路:一句话生成 3D 世界,还能去给自动驾驶当“眼睛”

一个 4B 小模型被玩出了三条路:一句话生成 3D 世界,还能去给自动驾驶当“眼睛” 最近科技圈有个挺有意思的现象:同一款“4B”体量的小模型,被不同团队拉去干了完全不相干的三件事。 一支人马拉它去做 3D 场景,你打一句… · 2026/11/3 2:51:28

深入理解内存对齐:原理、优化与实践
深入理解内存对齐:原理、优化与实践

1. 内存对齐的概念与必要性内存对齐是计算机系统中一个基础但极其重要的概念。简单来说,它指的是数据在内存中的存储位置必须满足特定边界要求。比如一个4字节的int型变量,在32位系统上通常需要从4的倍数地址开始存放。为什么需要内存对齐?这… · 2026/11/3 3:30:34

Delphi Web前端开发入门:用Pascal与TMS WEB Core做网页
Delphi Web前端开发入门:用Pascal与TMS WEB Core做网页

简介:Delphi Web前端开发教程以TMS WEB Core框架为主线,面向希望用Delphi或Lazarus快速进入Web应用开发的初学者与进阶开发者,也适合传统Delphi程序员补齐前端与跨平台发布知识。教程从Delphi/Object Pascal的历史与现状讲起,梳理… · 2026/11/3 3:30:34

程序员转型大模型开发的系统化学习路径
程序员转型大模型开发的系统化学习路径

1. 为什么程序员转型大模型需要系统化学习路径去年我在团队内部推动AI大模型落地时,发现一个有趣现象:有五年经验的Java工程师花两周速成Transformer原理后,在微调任务上的表现反而不如按部就班学习的新人。这个观察印证了标题强调的观点——… · 2026/11/3 3:30:34

基于Spark与深度学习的智能地铁客流预测系统
基于Spark与深度学习的智能地铁客流预测系统

1. 项目背景与核心价值地铁客流量预测是智慧城市建设中的关键环节。作为一线城市交通管理的痛点,早晚高峰期的客流压力常常导致站台拥挤、列车延误等问题。传统基于人工经验或简单统计模型的预测方法,在面对突发天气、节假日、大型活动等复杂场景时往往表… · 2026/11/3 3:30:34

SpringBoot农产品管理APP开发实战与架构设计
SpringBoot农产品管理APP开发实战与架构设计

1. 项目概述:农产品管理与销售APP的设计初衷去年帮农科院做数字化改造时,发现许多合作社还在用纸质台账管理进出货,农户的优质产品经常因信息不对称滞销。这个基于SpringBoot的农产品管理APP正是为解决这类痛点而生——通过移动端实现农产品从… · 2026/11/3 3:30:34

StatusServer:分布式系统健康监控的核心架构与实践
StatusServer:分布式系统健康监控的核心架构与实践

1. StatusServer:现代分布式系统的健康监控中枢在分布式架构成为主流的今天,服务健康监控已从"可有可无"变成了"生死攸关"的基础设施。三年前我们某个核心服务的一次雪崩事故让我深刻认识到:当30个微服务节点中有3个出现… · 2026/11/3 3:29:34

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码