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

3.1.3 看对于“肮脏”页面的处理

3.1.3 看对于“肮脏”页面的处理

文章目录

  • 3.1.3 看对于“肮脏”页面的处理
  • 再看对于“肮脏”页面的处理
  • MmPageOutVirtualMemory()


再看对于“肮脏”页面的处理

MmPageOutVirtualMemory()


NTSTATUS
NTAPI
MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace,PMEMORY_AREA MemoryArea,PVOID Address,PMM_PAGEOP PageOp)
{PFN_TYPE Page;BOOLEAN WasDirty;SWAPENTRY SwapEntry;NTSTATUS Status;DPRINT("MmPageOutVirtualMemory(Address 0x%.8X) PID %d\n",Address, AddressSpace->Process->UniqueProcessId);/** Check for paging out from a deleted virtual memory area.*/if (MemoryArea->DeleteInProgress){PageOp->Status = STATUS_UNSUCCESSFUL;KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE);MmReleasePageOp(PageOp);return(STATUS_UNSUCCESSFUL);}/** Disable the virtual mapping.*/MmDisableVirtualMapping(AddressSpace->Process, Address,&WasDirty, &Page);if (Page == 0){KEBUGCHECK(0);}/** Paging out non-dirty data is easy.*/if (!WasDirty){MmLockAddressSpace(AddressSpace);MmDeleteVirtualMapping(AddressSpace->Process, Address, FALSE, NULL, NULL);MmDeleteAllRmaps(Page, NULL, NULL);if ((SwapEntry = MmGetSavedSwapEntryPage(Page)) != 0){MmCreatePageFileMapping(AddressSpace->Process, Address, SwapEntry);MmSetSavedSwapEntryPage(Page, 0);}MmUnlockAddressSpace(AddressSpace);MmReleasePageMemoryConsumer(MC_USER, Page);PageOp->Status = STATUS_SUCCESS;KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE);MmReleasePageOp(PageOp);return(STATUS_SUCCESS);}/** If necessary, allocate an entry in the paging file for this page*/SwapEntry = MmGetSavedSwapEntryPage(Page);//获取该物理页面的倒换描述项//页面是脏的if (SwapEntry == 0)//分配失败{SwapEntry = MmAllocSwapPage();if (SwapEntry == 0){MmShowOutOfSpaceMessagePagingFile();MmEnableVirtualMapping(AddressSpace->Process, Address);//恢复原来的映射PageOp->Status = STATUS_UNSUCCESSFUL;KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE);MmReleasePageOp(PageOp);return(STATUS_PAGEFILE_QUOTA);//因倒换页面不够而失败}}/** Write the page to the pagefile*/Status = MmWriteToSwapPage(SwapEntry, Page);//将物理页面的内容写入倒换页面if (!NT_SUCCESS(Status)){//写文件失败DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n",Status);MmEnableVirtualMapping(AddressSpace->Process, Address);//恢复原来的映射PageOp->Status = STATUS_UNSUCCESSFUL;KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE);MmReleasePageOp(PageOp);return(STATUS_UNSUCCESSFUL);}/** Otherwise we have succeeded, free the page1 写倒换文件成功*/DPRINT("MM: Swapped out virtual memory page 0x%.8X!\n", Page << PAGE_SHIFT);MmLockAddressSpace(AddressSpace);MmDeleteVirtualMapping(AddressSpace->Process, Address, FALSE, NULL, NULL);//撤销通往目标物理页面的映射MmCreatePageFileMapping(AddressSpace->Process, Address, SwapEntry);//建立(虚存页面)通往倒换文件的映射MmUnlockAddressSpace(AddressSpace);MmDeleteAllRmaps(Page, NULL, NULL);MmSetSavedSwapEntryPage(Page, 0);//该物理页面不再映射到倒换文件MmReleasePageMemoryConsumer(MC_USER, Page);//释放该物理页面PageOp->Status = STATUS_SUCCESS;KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE);MmReleasePageOp(PageOp);return(STATUS_SUCCESS);
}

先通过 MmGetSavedSwapEntryPage()获取(本页面)在页面倒换文件中的页面号。如果本页面在倒换文件中尚无映像,就通过MmAllocSwapPage()加以分配。然后就由MmWriteToSwapPage()将物理页面的内容写入倒换文件。此后的操作就无须赘述了,不过需要说明一点,就是MmCreatePageFileMapping()在将SwapEntry写入相应虚存页面的PTE,时要将其左移一位,使得PTE的最低位即PA_PRESENT位为0,说明该页面不在物理内存中。在哪里呢?只要整个PTE非0,就说明在某个倒换文件的某个页面中,此时的高31位就是倒换文件号与页面号的组合。显然,这个组合不能为0,这就是为什么这个组合中的页面号实际上是(文件内)页面号加1的原因。
关于页面映射表,还要作些说明。当内核调度一个进程运行时,需要将控制寄存器CR3设置成指向这个进程的页面映射表,此时使用的是页面映射表的物理地址,这样MMU才能找到当前进程的页面映射表,并进而将具体的表项PTE装入其高速缓存TLB。但是,如果是CPU要访问当前进程的页面映射表,则需使用其虚拟地址。不管是什么进程,其页面映射表在虚存空间的位置都是固定的,都是 0xc0000000。凡是在程序中需要访问本进程的页面映射表时,总是用这个地址作为起点。当然,对于不同的当前进程,这个虚拟地址会映射到不同的物理页面中,不同进程的页面映射表所在的物理页面当然是不同的。

相关文章:

3.1.3 看对于“肮脏”页面的处理

3.1.3 看对于“肮脏”页面的处理 文章目录 3.1.3 看对于“肮脏”页面的处理再看对于“肮脏”页面的处理MmPageOutVirtualMemory() 再看对于“肮脏”页面的处理 MmPageOutVirtualMemory() NTSTATUS NTAPI MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace,PMEMORY_AREA Me…...

学 Python 还是学 Java?——来自程序员的世纪困惑!

文章目录 1. Python&#xff1a;我就是简单&#xff0c;so what&#xff1f;2. Java&#xff1a;严谨到让你头疼&#xff0c;但大佬都在用&#xff01;3. 到底谁更香&#xff1f;——关于学哪门语言的百思不得姐结论——到底该选谁&#xff1f;推荐阅读文章 每个程序员都可能面…...

Spring Web MVC 入门

1. 什么是 Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从从⼀开始就包含在Spring框架中。它的 正式名称“SpringWebMVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"Spring MVC". 什么是Servlet呢? Ser…...

吃牛羊肉的季节来了,快来看看怎么陈列与销售!

一、肉品陈列基本原则 (一&#xff09;新鲜卫生 1、保证商品在正确的温度、正确的方式下陈列 (1&#xff09;正确的温度&#xff1a;冷藏柜-2℃&#xff0d;2℃&#xff1b;冷冻柜库-20℃&#xff0d;18℃ (2&#xff09;正确的方式&#xff1a; 商品不遮挡冷气出风口&…...

租房业务全流程管理:Spring Boot系统应用

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了租房管理系统的开发全过程。通过分析租房管理系统管理的不足&#xff0c;创建了一个计算机管理租房管理系统的方案。文章介绍了租房管理系统的系统分析部分&…...

GCC之编译(7)Linker链接脚本

GCC之(7)Linker链接脚本 Author: Once Day Date: 2024年10月25日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 本文档翻译自GNU LD链接脚本官方手册 参考文章: GNU LD …...

【设计模式系列】适配器模式(九)

目录 一、什么是适配器模式 二、适配器模式的角色 三、适配器模式的典型应用 四、适配器模式在InputStreamReader中的应用 一、什么是适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将不兼容的接口转换为一个客户端…...

C# 文档打印详解与示例

文章目录 一、概述二、PrintDocument 类的使用三、PrintDialog 类的使用四、PageSetupDialog 类的使用五、PrintPreviewDialog 类的使用六、完整示例七、总结 在软件开发过程中&#xff0c;文档打印是一个常见的功能需求。本文将详细介绍如何在C#中实现文档打印&#xff0c;并给…...

Spring Cloud --- Sentinel 熔断规则

熔断规则 慢调用比例 发送10个请求&#xff0c;每个请求理想响应时长为200毫秒。统计1秒钟&#xff0c;如果10个请求响应时间超过200毫秒的比例大于等于10%&#xff0c;则触发熔断&#xff0c;熔断5秒。 异常比例 1秒内&#xff0c;发送请求出现异常率为20%&#xff0c;则触…...

使用爬虫爬取Python中文开发者社区基础教程的数据

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

你了解kafka消息队列么?

消息队列概述 一. 消息队列组件二. 消息队列通信模式2.1 点对点模式2.2 发布/订阅模式 三. 消息队列的优缺点3.1 消息队列的优点3.2 消息队列的缺点 四. 总结 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&…...

力扣102 二叉树的层序遍历 广度优先搜索

二叉树的层序遍历 题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15…...

堆(堆排序,TOP K, 优先级队列)

1 概念解释 堆的定义&#xff1a;堆是一颗完全二叉树&#xff0c;分为大堆和小堆 大堆&#xff1a;一棵树中&#xff0c;任何父亲节点都大于等于孩子的节点&#xff0c;大堆的根结点最大 小堆&#xff1a;一棵树中&#xff0c;任何父亲节点都小于等于孩子节点&#xff0c;小堆…...

(三)行为模式:11、模板模式(Template Pattern)(C++示例)

目录 1、模板模式含义 2、模板模式的UML图学习 3、模板模式的应用场景 4、模板模式的优缺点 5、C实现的实例 1、模板模式含义 模板模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将某些步骤…...

贝叶斯中的充分统计量

内容来源 贝叶斯统计&#xff08;第二版&#xff09;中国统计出版社 前两篇笔记简述经典统计中的充分统计量和判断充分统计量的 N e y m a n Neyman Neyman 因子分解定理 而在贝叶斯统计中&#xff0c;充分统计量也有一个充要条件 定理兼定义 设 x ( x 1 , x 2 , ⋯ , x …...

012:ArcGIS Server 10.2安装与站点创建教程

摘要&#xff1a;本文详细介绍地理信息系统服务器软件ArcGIS Server 10.2的安装与站点创建流程。 一、软件介绍 ArcGIS Server 10.2是Esri公司开发的一款强大的地理信息系统&#xff08;GIS&#xff09;服务器软件。它支持发布和共享地图、地理数据处理服务及空间分析功能&…...

xlive.dll错误的详细解决办法步骤教程,xlive.dll基本状况介绍

在计算机的众多文件中&#xff0c;“xlive.dll”扮演着独特而重要的角色。所以当你的电脑丢失了xlive.dll文件时&#xff0c;会倒是电脑不能正常运行&#xff0c;那么出现这样的问题有什么办法可以将丢失的xlive.dll进行修复呢&#xff1f;今天这篇文章将和大家聊聊xlive.dll错…...

通俗易懂的餐厅例子来讲解JVM

餐厅版本 JVM&#xff08;Java虚拟机&#xff09;可以想象成一个虚拟的计算机&#xff0c;它能够运行Java程序。为了让你更容易理解&#xff0c;我们可以用一个餐厅的比喻来解释JVM&#xff1a; 菜单&#xff08;Java源代码&#xff09;&#xff1a; 想象一下&#xff0c;Java…...

Python从入门到高手7.3节-列表的常用操作方法

目录 7.3.1 列表常用操作方法 7.3.2 列表的添加 7.3.3 列表的查找 7.3.4 列表的修改 7.3.5 列表的删除 7.3.6 与列表有关的其它操作方法 7.3.7 与10月说再见 7.3.1 列表常用操作方法 列表类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法。在本…...

Prompt提示词设计:如何让你的AI对话更智能?

Prompt设计&#xff1a;如何让你的AI对话更智能&#xff1f; 在人工智能的世界里&#xff0c;Prompt&#xff08;提示词&#xff09;就像是一把钥匙&#xff0c;能够解锁AI的潜力&#xff0c;让它更好地理解和响应你的需求。今天&#xff0c;我们就来聊聊如何通过精心设计的Pr…...

中文句子相似度分析神器:StructBERT本地部署全流程详解(附代码)

中文句子相似度分析神器&#xff1a;StructBERT本地部署全流程详解&#xff08;附代码&#xff09; 1. 工具概览与核心价值 中文语义相似度分析是自然语言处理中的一项基础但关键的任务。无论是智能客服中的问题匹配&#xff0c;还是内容平台的文章查重&#xff0c;都需要准确…...

5G NR随机接入实战:手把手教你理解并排查MSG3发送失败的那些坑

5G NR随机接入实战&#xff1a;MSG3发送失败全场景排查指南 当5G终端尝试接入网络时&#xff0c;随机接入过程中的MSG3发送失败是最常见的"拦路虎"之一。作为网络优化的关键指标&#xff0c;MSG3失败直接影响用户体验和网络KPI。本文将带您深入协议栈底层&#xff0c…...

探索粗糙表面波动模型生成:打造不规则之美

粗糙表面&#xff0c;波动模型生成&#xff0c;用于在物体表面生成不规则的粗糙表面&#xff0c;或面表面的波动边界等&#xff0c;可自定义波动分布与赋值。在图形学和模拟领域&#xff0c;生成物体表面的粗糙质感或是波动边界常常是一个有趣又具有挑战性的任务。今天咱们就聊…...

ZeroOmega多代理管理功能全解析:实现智能网络访问控制的核心方案

ZeroOmega多代理管理功能全解析&#xff1a;实现智能网络访问控制的核心方案 【免费下载链接】ZeroOmega Manage and switch between multiple proxies quickly & easily. 项目地址: https://gitcode.com/gh_mirrors/ze/ZeroOmega ZeroOmega作为一款开源的多代理管理…...

2026年AI智能体大爆发:下一个十年风口,普通人的超级财富密码

比尔盖茨曾断言&#xff1a;“AI智能体&#xff08;AI Agent&#xff09;将彻底改变人们使用计算机的方式。”如果说2023年是大语言模型&#xff08;LLM&#xff09;的启蒙元年&#xff0c;那么到2026年&#xff0c;具备“感知-规划-行动”自主闭环能力的AI智能体将迎来真正的商…...

Meshery 1.0正式发布,为云原生基础设施提供新的管控层

跨多云环境管理Kubernetes基础设施长期以来产生了YAML文件泛滥、配置漂移以及依赖个人而非系统的知识问题。生成基础设施配置的AI工具速度超过了团队审查能力&#xff0c;使这个问题更加难以控制。开源Meshery技术正是为了解决这一问题而构建的。Meshery v1.0现已发布&#xff…...

嵌入式OLED UI组件库:轻量级C++组件化设计

1. 项目概述 OLED UI Components 是一个面向嵌入式平台的轻量级、组件化 OLED 用户界面开发库&#xff0c;专为基于 SSD1306 驱动芯片的单色 OLED 显示屏&#xff08;典型分辨率为 12864&#xff09;设计。该库不直接操作硬件寄存器&#xff0c;而是构建在 Adafruit_SSD1306 库…...

计算机毕业设计springboot彝族民族文化宣传网站 基于SpringBoot的彝族非物质文化遗产数字化展示平台 SpringBoot框架下彝族传统风俗文化传播系统

计算机毕业设计springboot彝族民族文化宣传网站l36tn9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联xi 可分享 在当今数字化浪潮席卷全球的背景下&#xff0c;少数民族文化的保护与传承面临着前所未有…...

Papercups开源客户聊天系统:7步快速定制部署完整指南

Papercups开源客户聊天系统&#xff1a;7步快速定制部署完整指南 【免费下载链接】papercups Open-source live customer chat 项目地址: https://gitcode.com/gh_mirrors/pa/papercups Papercups是一个功能强大的开源实时客户聊天系统&#xff0c;专为注重数据隐私和安…...

全新K4A4G165WG-BCWE000 4Gb DDR4 SDRAM 内存芯片 三星Samsung 进口芯片IC

K4A4G165WG-BCWE000 是三星半导体&#xff08;Samsung&#xff09;推出的一款4Gb DDR4 SDRAM 内存芯片&#xff0c;采用 96-ball FBGA 封装&#xff0c;组织为 256M 16 结构。它凭借 3200Mbps 的高数据速率、1.2V 低功耗设计以及 -40C 至 95C 的宽温工作能力&#xff0c;广泛应…...