如何将文件映射到内存映射文件

PE文件到内存的映射 - qintangtao - 博客园
在执行一个PE文件的时候,windows 并不在一开始就将整个文件读入内存的,二十采用与内存映射文件类似的机制。也就是说,windows 装载器在装载的时候仅仅建立好虚拟地址和PE文件之间的映射关系。当且仅当真正执行到某个内存页中的指令或者访问某一页中的数据时,这个页面才会被从磁盘提交到物理内存,这种机制使文件装入的速度和文件大小没有太大的关系。
但是要注意的是,系统装载可执行文件的方法又不完全等同于内存映射文件。当使用内存映射文件的时候,系统对&原著&相当忠实,如果将磁盘文件和内存映像比较的话,可以发现不管是数据本身还是数据之间的相对位置它丫丫的都是完全相同的。而我们知道,在装载可执行文件的时候,有些数据在装入前会被预处理,如重定位等,正因此,装入以后,数据之间的相对位置可能发生微妙的变化。
Windows 装载器在装载DOS部分、PE文件头部分和节表(区块表)部分是不进行任何特殊处理的,而在装载节(区块)的时候则会自动按节(区块)的属性做不同的处理。一般情况下,它会处理以下几个方面的内容:
内存页的属性;
节的偏移地址;
节的尺寸;
不进行映射的节。
内存页的属性:
对于磁盘映射文件来说,所有的页都是按照磁盘映射文件函数指定的属性设置的。但是在装载可执行文件时,与节对应的内存页属性要按照节的属性来设置。所以,在同属于一个模块的内存页中,从不同节映射过来的的内存页的属性是不同的。
节的偏移地址:
节的起始地址在磁盘文件中是按照 IMAGE_OPTIONAL_HEADER32 结构的 FileAlignment 字段的值进行对齐的,而当被加载到内存中时是按照同一结构中的 SectionAlignment 字段的值对其的,两者的值可能不同,所以一个节被装入内存后相对于文件头的偏移和在磁盘文件中的偏移可能是不同的。
注意,节事实上就是相同属性数据的组合!当节被装入到内存中的时候,相同一个节所对应的内存页都将被赋予相同的页属性, 事实上,Windows 系统对内存属性的设置是以页为单位进行的,所以节在内存中的对齐单位必须至少是一个页的大小。(小甲鱼温馨提示:对于32位操作系统来说,这个值一般是4KB==1000H; 对于64位操作系统这个值一般是8KB==2000H)
在磁盘中就没有这个**,因为在磁盘中排放是以什么为主?肯定是以空间为主导,在磁盘只是存放,不是使用,所以不用设置那么详细的属性。试想想看,如果在磁盘中都是以4KB为大小对齐的话,不够就用0来填充,那么一个只占20字节的数据就要消耗4KB的空间来存放,是不是浪费?有木有??
节的尺寸:
对节的尺寸的处理主要分为两个方面:
第一个方面,正如刚刚我们所讲的,由于磁盘映像和内存映像中节对齐存储单位的不同而导致了长度扩展不同(填充的0数量不同嘛~);
第二个方面,是对于包含未初始化数据的节的处理问题。既然是未初始化,那么没有必要为其在磁盘中浪费空间资源,但在内存中不同,因为程序一运行,之前未初始化的数据便有可能要被赋值初始化,那么就必须为他们留下空间。
不进行映射的节:
有些节并不需要被映射到内存中,例如.reloc节,重定位数据对于文件的执行代码来说是透明的,无作用的,它只是提供Windows 装载器使用,执行代码根本不会去访问到它们,所以没有必要将他们映射到物理内存中。
好了,上边的一些知识相信又是对我们之前学习的一点补充和扩展。大家可能对上边的知识觉得又是眼熟,但又觉得有几分陌生。那是当然哈,小甲鱼教学遵循的思路就是今天的知识今天学好它,明天的东西明天再学!一下子你肯定不能接受那么深的东西,像上边的东西如果放在第一讲来讲解,那么恐怕很多朋友不会继续往下看(一头雾水看下去只能两头雾水,哈~),所以咱学习要遵循循环渐进,有些重点分开来重复讲解,虽然重复,但每次都会往下加深一点来让大家容易接受哈。文件映射对象
file-mapping object
这个新打开的内存映射视图隶属于一个文件映射对象(file-mapping object),这个对象用来标识可执行文件的映像。系统同时给进程对象和线程对象指定新的进程ID和线程ID。
基于18个网页-
objeto de mapeamento de arquivo
响应文件 - tradu??o - Chinês-... ... 文件完整性 Integridade de Documento 文件映射对象 objeto de mapeamento de arquivo 文字文件 documento de texto ...
基于4个网页-
obiekt mapowania pliku
类似的短语在字典Chinese Polish。 (71) ... 文件完整性 Integralno?? dokumentu 文件映射对象 obiekt mapowania pliku 无法识别的媒体池 pula no?ników nierozpoznanych ...
基于2个网页-
oggetto di mapping dei file
键盘映射方案 in Italiano, tradu... ... 文件映射 mapping del file 文件映射对象 oggetto di mapping dei file 问题的解决方案 Soluzioni per problemi riscontrati ...
基于2个网页-
file-mapping kernel object
iBATIS 3 还提供了使用 XML 配置文件进行对象映射的功能。
iBATIS 3 still offers the ability to map objects using XML configuration files.
可传一个文件映射对象的句柄来创始位图。或者让系统为位图分配内存。
You can supply a handle to a file-mapping object that the function will use to create the bitmap, or you can let the system allocate the memory for the bitmap.
文件被直接映射到对象,目录也是文件,只不过是引用目录中所含文件的文件(采用文件名和 inode-OID 对的形式)。
Files are mapped directly to objects, and directories are simply files that reference the files contained within the directory (as file name and inode-OID pairs).
$firstVoiceSent
- 来自原声例句
请问您想要如何调整此模块?
感谢您的反馈,我们会尽快进行适当修改!
请问您想要如何调整此模块?
感谢您的反馈,我们会尽快进行适当修改!PE文件到内存的映射
在执行一个PE文件的时候,windows
并不在一开始就将整个文件读入内存的,二十采用与内存映射文件类似的机制。也就是说,windows
装载器在装载的时候仅仅建立好虚拟地址和PE文件之间的映射关系。
当且仅当真正执行到某个内存页中的指令或者访问某一页中的数据时,这个页面才会被从磁盘提交到物理内存,这种机制使文件装入的速度和文件大小没有太大的关系。
但是要注意的是,系统装载可执行文件的方法又不完全等同于内存映射文件。
当使用内存映射文件的时候,系统对“原著”相当忠实,如果将磁盘文件和内存映像比较的话,可以发现不管是数据本身还是数据之间的相对位置它丫丫的都是完全相同的。
而我们知道,在装载可执行文件的时候,有些数据在装入前会被预处理,如重定位等,正因此,装入以后,数据之间的相对位置可能发生微妙的变化。
装载器在装载DOS部分、PE文件头部分和节表(区块表)部分是不进行任何特殊处理的,而在装载节(区块)的时候则会自动按节(区块)的属性做不同的处理。
一般情况下,它会处理以下几个方面的内容:
内存页的属性;
节的偏移地址;
节的尺寸;
不进行映射的节。
内存页的属性:
对于磁盘映射文件来说,所有的页都是按照磁盘映射文件函数指定的属性设置的。但是在装载可执行文件时,与节对应的内存页属性要按照节的属性来设置。所以,在同属于一个模块的内存页中,从不同节映射过来的的内存页的属性是不同的。
节的偏移地址:
节的起始地址在磁盘文件中是按照
IMAGE_OPTIONAL_HEADER32 结构的 FileAlignment
字段的值进行对齐的,而当被加载到内存中时是按照同一结构中的 SectionAlignment
字段的值对其的,两者的值可能不同,所以一个节被装入内存后相对于文件头的偏移和在磁盘文件中的偏移可能是不同的。
注意,节事实上就是相同属性数据的组合!当节被装入到内存中的时候,相同一个节所对应的内存页都将被赋予相同的页属性,事实上,Windows
系统对内存属性的设置是以页为单位进行的,所以节在内存中的对齐单位必须至少是一个页的大小。(小甲鱼温馨提示:对于32位操作系统来说,这个值一般是4KB==1000H;
对于64位操作系统这个值一般是8KB==2000H)
在磁盘中就没有这个**,因为在磁盘中排放是以什么为主?肯定是以空间为主导,在磁盘只是存放,不是使用,所以不用设置那么详细的属性。试想想看,如果在磁盘中都是以4KB为大小对齐的话,不够就用0来填充,那么一个只占20字节的数据就要消耗4KB的空间来存放,是不是浪费?有木有??
节的尺寸:
对节的尺寸的处理主要分为两个方面:
第一个方面,正如刚刚我们所讲的,由于磁盘映像和内存映像中节对齐存储单位的不同而导致了长度扩展不同(填充的0数量不同嘛~);
第二个方面,是对于包含未初始化数据的节的处理问题。既然是未初始化,那么没有必要为其在磁盘中浪费空间资源,但在内存中不同,因为程序一运行,之前未初始化的数据便有可能要被赋值初始化,那么就必须为他们留下空间。
不进行映射的节:
有些节并不需要被映射到内存中,例如.reloc节,重定位数据对于文件的执行代码来说是透明的,无作用的,它只是提供Windows
装载器使用,执行代码根本不会去访问到它们,所以没有必要将他们映射到物理内存中。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Qt进行内存映射后,如何读取映射在内存的文件内容?【qt吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:37,182贴子:
Qt进行内存映射后,如何读取映射在内存的文件内容?收藏
//11.txt文件中的内容0.0
4.45557 2.0e-004-1.93-2.59399 4.0e-
-3.6 6.0e-
-2.73 8.0e-004-4.88-3.14331 1.0e-003-0..7 1.2e-003-17.29-10.3455 1.4e-003-1.2207
4.18 1.6e-..71387 1.8e-003-0..41 /***************************************************************/ QFile file(&11.txt&);double a1,a2,a3,a4;if(!file.open(QIODevice::ReadOnly)){
cout&&&Open Error&&& return 0;}QTtime.start();uchar *fptr=file.map(0,file.size()); //接下来该如何从fptr提取提取数据??????????????????????????????
qt50ulbq6}美国邦纳BANNER原装正品新品 价格优惠.各型号产品均有特价!公司经营美国邦纳BANNER,德国西克施克SICK.
你的目的是MAP还是读文件?读文件内容不需要MAP。QFile file(&11.txt&);double a1,a2,a3,a4;if(!file.open(QIODevice::ReadOnly)){cout&&&Open Error&&&return 0;}QTextStream stream(file);stream&&a1&&a2&&a3&a4;用QTextStream就够了,你到底弄明白自己想干嘛没有?
为何不把double写入文件 这样固定8字节一个数比较简单 你这些文本的数字之间都没有标记 怎么区分两个数字?
QFile.map()返回的是一个原生指针,直接拿来当指针用,跟访问内存形式上是一样的。注意不要越界。
那你为什么不直接用ifstream或者FILE*读取数据呢?
楼主你的问题解决了没有?我最近也遇到要从一个大的文本文件中按行读取数据,用QTextStream太慢了。。。
然后你把返回的ptr当数组用就行了
登录百度帐号推荐应用

我要回帖

更多关于 内存映射文件 的文章

 

随机推荐