《Windows核心编程》---内存映射文件基础

《Windows核心编程》之“内存映射文件” 一般来说,应用程序对文件的操作分为两类:第一类是操作文件本身,包括new、delete、cut、copy、paste以及获取或修改文件属性等操作;第二类就是操作文件的内容,包括:read、write以及文件指针,事实上,cut、copy和paste从实现上来说,也是文件内容操作。对于第二类操作,通行的做法是设计一个buffer(它对应进程地址空间的一个区域),先把待操作的内容读入到buffer,然 阅读详情

与虚拟内存相似,内存映射文件保留了一个地址空间区域,在需要时将它提交到物理存储器。它们的不同点是内存映射文件提交到物理存储器的数据来自磁盘上相应的文件,而不是系统页文件。

 

使用内存映射文件的目的有3个:

1)系统使用内存映射文件来加载和执行.EXE和.DLL文件。这极大地节省了系统页文件空间,也缩短了启动应用程序所需的时间;

2)使用内存映射文件访问磁盘上的数据。这既避免了对文件执行文件IO操作,也避免了为文件的内容申请缓冲区;

3)使用内存映射文件在多个进程间共享数据。Windows也提供了其他进程间通信的方法,但是这些方法都是使用内存映射文件实现的,所以内存映射文件时最高效的方式。

 

内存映射文件相关函数:CreateFileMapping、OpenFileMapping、MapViewOfFile、UnmapViewOfFile和FlushViewOfFile。

使用内存映射文件可以分为两步:第一步是使用CreateFileMapping创建一个内存映射文件内核对象,告诉操作系统内存映射文件需要的物理内存大小。这个步骤决定了内存映射文件的用途—即是为了磁盘上的文件建立内存映射还是为了多个进程共享数据建立共享内存。

CreateFileMapping函数可以创建或者打开一个命名的或未命名的映射文件对象:

HANDLE CreateFileMapping(

       HANDLE hFile,                               //一个文件的句柄

       LPSECURITY_ATTRIBUTES lpAttributes,     //定义内存映射文件对象是否可以继承

       DWORD flProtect,            //该内存映射文件的保护类型

       DWORD dwMaximumSizeHigh,          //内存映射文件的长度

       DWORD dwMinimumSizeLow,    

       LPCTSTR lpName                           //内存映射文件的名字

       );

参数hFile指定要映射的文件的句柄,如果这是一个已经打开的文件的句柄(即CreateFile的返回值),那么将建立这个文件的内存映射文件;如果这个参数是-1,那么将建立共享内存;

参数flProtect指定内存映射文件的保护类型,取值是PAGE_REAFONLY或PAGE_READWRITE;

参数dwMaximumSizeHigh和dwMinimumSizeLow组合指定了一个64位的内存映射文件的长度。一种简单的方法是将这两个参数都设为0,那么内存映射文件的大小将与磁盘上的文件一致;

 

如果创建的是共享内存,其他进程不能再使用CreateFileMapping函数去创建同名的内存映射文件对象了,此时可以使用OpenFileMapping函数来打开创建好的对象:

HANDLE OpenFileMapping(

       DWORD deDesiredAccess,             //指定保护类型

       BOOL bInheritHandle,            //返回的句柄是否可被继承

       LPCTSTR lpName                    //创建对象时使用的名字

       );

参数dwDesiredAccess指定的保护类型有FILE_MAP_WRITE和FILE_MAP_READ;

 

使用内存映射文件的第二步是映射文件映射对象的全部或一部分到进程的地址空间中。可以认为该操作是为文件中的内容分配线性地址空间,并将线性地址和文件内容对应起来。所用的函数是MapViewOfFile:

LPVOID MapViewOfFile(

       HANDLE hFileMappingObject,      //前两个函数返回的内存映射文件对象的句柄

       DWORD dwDesiredAccess,            //指定保护类型:FILE_MAP_WRITE、FILE_MAP_READ

       DWORD dwFileOffsetHigh,          //从文件的哪个地址开始映射

       DWORD dwFileOffsetLow,

       SIZE_T dwNumberOfBytesToMap       //要映射的字节数,如果指定为0,则映射整个文件

       );

 

当不使用内存映射文件时,通过UnmapViewOfFile函数撤销映射并使用 CloseHandle函数关闭内存映射文件的句柄:

BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);

 

如果修改了映射视图中的内存,系统会在试图撤销映射或文件映射对象被删除时自动将数据写到磁盘上,但程序也可以根据需要将视图中的数据立即写到磁盘上,使用函数FlushViewOfFile:

BOOL FlushViewOfFile(

       LPCVOID lpBaseAddress,        //开始的地址

       SIZE_T dwNumberOfBytesToFlush       //数据块的大小

       );

《Windows核心编程》读书笔记十七章 内存映射文件 第十七章 内存映射文件 本章内容 17.1 映射到内存的可执行文件和DLL 17.2 映射到内存的数据文件 17.3 使用内存映射文件 17.4 用内存映射文件来处理大文件 17.5 内存映射文件和一致性 17.6 给内存映射文件制定基地址 17.7 内存映射文件的实现细节 17.8 用内存映射文件在进程间共享数据 17.9 以页交换文件为后备存储器的内存映射文件 17.10 阅读详情

相关推荐

windows核心编程--7、内存映射文件

一、前言     该系列前几篇文章:         windows核心编程–1、使用vs2019编写第一个win32项目         windows核心编程–2、windows的画笔画刷以及一些简单的应用         windows核心编程–3、有关进程的三个函数         windows核心编程–4、线程和线程同步         windwos核心编程–5、虚拟内存相关函数及其应用         windows核心编程–6、使用共享栈端实现进程数据共享 二、相关工具     IDE:

windy_ll的博客 268

Windows核心编程 - 内存映射文件(3)

1. 用内存映射文件来处理大文件 方法就是只映射文件的一个视图,这个视图只包含文件的一小部分数据。比如一开始时,把文件开关的部分映射到视图中,完成对视图的访问后,撤销这一部分的映射,再把文件的另一部分映射到视图,重复此过程,直至完成对整个文件的访问。 2.内存映射文件和一致性 系统允许把同一个文件中的数据映射到多个视图中。例如把一个文件的前10KB映射到一个视图A,把同一...

yjianlu的专栏 325

66、Windows系统网络与编程接口全解析

本文深入解析了Windows系统的网络功能与编程接口,涵盖NTFS文件系统特性、核心网络协议(如SMB、TCP/IP、HTTP等)的应用场景、网络接口NDIS与TDI的工作机制、域与活动目录的管理架构,以及Win32 API在进程线程管理、内存管理、线程本地存储等方面的详细实现。文章还探讨了线程池、纤程、用户模式调度(UMS)和Concurrency Runtime等高级编程模型,并提供了进程间通信、同步机制与内存优化的最佳实践,全面展现Windows系统在企业级应用与分布式环境下的强大支持能力。

opencv7vision的博客 76

使用内存映射文件(windows核心编程指南)

使用内存映射文件,必须执行下列步骤: 1)创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件。 2)创建一个文件映射内核对象,告诉系统该文件的大小和你打算如何访问该文件。 3)让系统将文件映射对象的全部或一部分映射到你的进程地址空间中。 4)告诉系统从你的进程的地址空间中撤销文件映射内核对象的映像。 5)关闭文件映射内核对象。 6)关闭文件内核对象。 ...

177

PVE 9.0 保姆级安装及优化教程(换源、网络配置、远程唤醒等)【基础篇】

最近,Proxmox VE 推出了基于 Debian 13 的 9.0 版本。正巧我手头有一台闲置的老电脑,与其闲置,不如装上 PVE,让它化身 All in One,继续发挥它的余热。G4560 算是一颗 NAS 神 U,十几元的售价就能有双核四线程,比起什么 J1900 不知道强到哪里去了,尽管定位上是奔腾处理器,但性能甚至能和同代的酷睿 i3-7100 掰掰手腕,并且它还自带 HD 610 的核显,对于解码的支持也还不错。

zc_mk的博客 7512

[CARLA系列--01]CARLA 0.9.15 在Windows下的安装教程(一)

Carla是一款开源的自动驾驶仿真器,它基本可以用来帮助训练自动驾驶的所有模块,包括感知系统,Localization, 规划系统等等.Carla这个产品目前已经更新到了最新的0.9.15版本,目前遇到好多人在windows系统上如何安装可编辑版的Carla遇到了好多问题,所以针对在windows上的安装,推出此列教程.

汽车ECU自动化测试 4651

Windows核心编程<读书笔记十七> 内存映射文件

【文起】从蟹儿家回来了,期待跟蟹儿一起的生活,这周五一起回家,幸福。谢谢宝贝儿一如既往的对我的鼓励和支持。 内存映射文件 一、 内存映射文件可以用来保留一个地址空间的区域,并将物理存储器提交给该区域。 内存映射文件可以用于3个不同的目的: 1、  系统使用内存映射文件,以便加载和执行.exe和DLL文件。这样可以大大节省页文件空间和应用程序启动运行所需的时间。 2、  可以使用内存映射

豆浆爱蟹蟹 1008

一文详解心电图(ECG)监测原理

介绍心电图的监测原理,从心电信号产生、获取到心电图的基本组成

m0_50146396的博客 3291

【Windows】windows核心编程整理(下)

windows核心编程整理(上) windows核心编程整理(下) 线程的堆栈      每当创建一个线程时,系统就会为线程的堆栈(每个线程有他自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个以保留的区域    当创建一个线程的堆栈时,系统将会保留一个链接程序的/STACK开关指明的地址空间区域    堆栈区域的最后一个页面始终被保留这,这样做的目地是为了防止不小心改...

weixin_33984032的博客 172

基于GEC6818开发板的C/C++贪吃蛇小游戏

f.开始游戏(进入游戏,并没有马上开游戏,需要点击播放才能开始)2.相关宏,全局变量(可以根据自己需要进行修改)k.显示文字前的相关初始化。k.自定义font.h文件。1.需要的主要头文件。l.在开发板上显示字1。m.在开发板上显示字2。a.显示固定大小图片。h.线程1:获得坐标。

2301_77273301的博客 2133

高性能网站设计之缓存更新的套路

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。 我不知道为什么这么多人用的都是这

代码技巧 1万+

【IT基础】windows核心编程整理(下)

windows核心编程整理(上)windows核心编程整理(下)线程的堆栈    每当创建一个线程时,系统就会为线程的堆栈(每个线程有他自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个以保留的区域    当创建一个线程的堆栈时,系统将会保留一个链接程序的/STACK开关指明的地址空间区域    堆栈区域的最后一个页面始终被保留这,这样做的目地是为了防止不小心改写进程使用的其他数据内存

成鹏致远的专栏 624

Matlab实战:用DQN算法让机器人学会自主避障(附完整代码)

本文详细介绍了如何使用Matlab实现DQN(深度Q网络)算法,使机器人在复杂环境中学会自主避障。通过环境建模、网络架构设计、奖励函数优化及实战调试,提供了完整的代码实现和训练策略,帮助开发者快速应用于机器人路径规划项目。

t8u9v0w1x的博客 234

Windows核心编程

Windows核心编程学习01.Winwods核心编程:字符和字符串处理02.Windows核心编程:内核对象03.Windows核心编程:进程04.Windows核心编程:线程基础05.Windows核心编程:作业06.Windows核心编程:线程调度07.

shenzi的天空 2567

YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构

本文记录的是基于RepVit的YOLOv11轻量化改进方法研究。RepVit的网络结构借鉴ViT的设计理念,通过分离的token mixe和减少推理时的计算和内存成本,同时减少扩展比率并增加宽度,降低延迟,并通过来弥补参数大幅减少的问题,提高了准确性。本文在替换骨干网络中配置了原论文中的和五种模型,以满足不同的需求。

Limiiiing的博客 2977

生存曲线绘制及图例标签添加(使用R语言)

数据应该包含两列:一个是表示个体生存时间的时间变量(通常称为"时间(time)“)和一个是表示个体是否发生事件(如死亡)的事件变量(通常称为"事件(event)”)。通过修改上述代码中的数据和参数,您可以根据自己的需求绘制生存曲线,并添加相应的图例信息和标签。生存曲线是在生存分析中常用的工具,用于描述一组个体随时间的存活概率。函数的第一个参数指定图例的位置,这里我们选择了右上角(“topright”)。包来进行生存曲线的绘制,并通过添加图例信息和标签来增强可视化效果。的数据框,包含这两列数据。

CyberXZ的博客 557

[笔记]Windows核心编程《二十二》注入DLL和拦截API

文章目录前言一、插入DLL:一个例子二、使用注册表来插入DLL三、使用Windows挂钩来插入DLL四、使用远程线程来插入DLL4.1 Inject Library示例应用程序4.2 Image Walk DLL五、使用特洛伊DLL来插入DLL六、将DLL作为调试程序来插入七、用Windows 98上的内存映射文件插入代码八、用CreateProcess插入代码九、挂接A P I的一个示例9.1 通过改写代码来挂接API、9.2 通过操作模块的输入节来挂接API9.3 LastMsgBoxInfo示例应用程

二次元怪兽的博客 2042

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

[笔记]Windows核心编程《十七》内存映射文件

参考 文章目录前言一、映射到内存的可执行文件和DLLCreateProcess调用过程二、映射到内存的数据文件三、使用内存映射文件四、用内存映射文件来处理大文件五、内存映射文件和一致性六、给内存映射文件的指定基地址七、内存映射文件的实现细节八、用内存映射文件再进程间共享数据九、以页交换文件为后背存储器的内存映射文件十、 稀疏调拨的内存映射文件 前言 内存映射文件 与虚拟内存相似,内存映射文件允许开发人员预定一块地址空间区域并给区域调拨物理存储器。不同之处在于内存映射文件的物理存储器来自磁盘上已有的文件,而不

二次元怪兽的博客 2434

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Windows核心编程:内存映射文件

作者:shenzi链接:http://blog.youkuaiyun.com/shenziWindows核心编程:内存映射文件    与虚拟内存相似,内存映射文件允许开发人员预定一块地址空间区域并给区域调拨物理存储器。不同之处在于内存映射文件的物理存储器来自磁盘上已有的文件,而不是来自系统的页交换文件。一旦把文件映射到地址空间,我们就

shenzi的天空 5168

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Windows核心编程—第17章—内存映射文件

当exe文件被映射到进程的地址空间中之后,系统将访问exe文件的一个部分,该部分列出了包含exe文件中的代码要调用的函数的dll文件。方法1:一个文件,一个缓存,从文件一次性读到缓存,逆序后写回去,缺点1:无法处理大文件,缺点2:如果写回时过程异常,文件被破坏。方法4:一个文件,零缓存,使用内存映射,无需分配/释放内存和加载/写回文件数据到内存:缺点:过程异常,文件被破坏。方法3:一个文件,一个缓存,读一定大小文件内容到缓存,逆序后写回去 ,缺点:如果写回时过程异常,文件被破坏。目的:逆序一个文件的内容。

weixin_42210846的博客 1038

windows核心编程--内存映射文件

与虚拟内存一样,内存映射文件可以用来保留一个地址空间的区域,并将物理存储器提交给该区域。它们之间的差别是,物理存储器来自一个已经位于磁盘上的文件,而不是系统的页文件。一旦该文件被映射,就可以访问它,就像整个文件已经加载内存一样。 内存映射文件可以用于3个不同的目的: • 系统使用内存映射文件,以便加载和执行. e x e和D L L文件。这可以大大节省页文件空间和应用程序启动运行所需的

Mobidogs Blog 2557

windows 核心编程下的内存映射文件

虚拟内存实现的硬件基础是分页机制,关于分页机制本文再此不做介绍。虚拟内存实现的另外一个重要基础是局部性原理。局部性是指程序总是趋向于使用最近使用过的数据和指令,也就是说程序执行时所访问的存储器地址分布是相对集中的。局部性原理是应用虚拟内存提升性能的主要原因,也是虚拟内存却别与内存映射文件的本质。 内存映射文件虚拟性并不是由于局部性,而是使进程虚拟地址空间的某个区域建立映射磁盘文件的全部或部分内容.........

baidu_16370559的博客 1668

Windows核心编程(十六)内存映射文件

内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件。将文件映射到内存中后,我们就可以在内存中操作他们了,就像他们被载入内存中一样。 内存映射文件主要有三方面的用途: 1:系统使用内存映射文件来将exe或是dll文件本身作为后备存储器,而非系统页交换文件,这大大节省了系统页交换空间,由于不需

woshibendangao的专栏 1118
上一篇: 《Windows核心编程》---检测PE文件有效性
下一篇: 《Windows核心编程》---ADO基础
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值