内存映射问题
0x01、内存映射:
• 在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模式。
• 每个进程都有独立的4GB逻辑地址空间,32位的Windows系统允许每一个进程独立访问自己的内存,即独立于其它进程,也即它自己的32位逻辑地址空间。操作系统将把每一个进程的逻辑地址转换成实际的物理地址,独立的地址空间可以使其他已经出错的进程之间相互隔离,入阁一个进程通过他自己的内存空间处理数据,其他的进程就比在DOS中安全,在DOS中的所有应用程序共享相同的物理内存空间,虽然这带来了许多好处,但在不同进程之间转的指针,就会出现一些麻烦。在一个进程中,一个给定的逻辑地址将与另一进程的指针不会有相同的逻辑地址。
• 那么怎么样才能在32位的Windows系统中达到共享内存的目的呢?
• 随着进程的分离内存空间的出现,进程不能简单地使用GlobalAlloc()函数来分配内存,并把它转递给另一个进程来共享,一个进程检查有另一个进程分配的指针,他只是指向随机地址。然而,在32位的Windows系统支持在进程间共享内存映象文件,可以通过内存映象文件来达到内存共享的目的。
• 32位的Windows系统的虚拟内存系统具有把实际内存映象到页面文件或交换文件的能力.通过把内存映象到任何想映象的文件,包括系统页面本身,应用程序就可以拓展这种能力。文件影响能用来提供更快更简捷的文件访问方式,并提供内存共享。
• 把文件映像到内存,首先必须调用CreateFileMapping()函数,然后再调用MapViewOfFile函数,把文件视映像到进程地址空间上。
0x02、内存映射目的:
• 系统使用内存映射文件,以便加载和执行. e x e和D L L文件。这可以大大节省页文件空间和应用程序启动运行所需的时间。
• 可以使用内存映射文件来访问磁盘上的数据文件。这使你可以不必对文件执行I / O操作,并且可以不必对文件内容进行缓存。
• 可以使用内存映射文件,使同一台计算机上运行的多个进程能够相互之间共享数据。Wi n d o w s确实提供了其他一些方法,以便在进程之间进行数据通信,但是这些方法都是使用内存映射文件来实现的,这使得内存映射文件成为单个计算机上的多个进程互相进行通信的最有效的方法。
这里给出一个抽象图:
0x03、内存映射函数
内存映射文件的函数包括
CreateFileMapping , OpenFileMapping, MapViewOfFile, UnmapViewOfFile和 FlushViewOfFile。
0x01.CreateFileMapping函数
HANDLE CreateFileMapping(
HANDLE hFile, // 一个文件句柄
LPSECURITY_ATTRIBUTE lpAttributes, // 定义内存映射文件对象是否可以被承
DWORD flProtect, // 该内存映射文件的保护类型
DWORD dwMaximumSizeHigh, // 内存映射文件的长度
DWORD dwMaximumSizeLow, //最小长度
LPCTSTR lpName // 内存映射文件的名字
)

本文详细介绍了Windows系统中的内存映射问题,探讨了内存映射的目的,以及如何通过CreateFileMapping、MapViewOfFile等函数实现内存映射,用于文件访问优化和进程间的数据共享。此外,还阐述了内存映射在文件加载、执行效率提升等方面的应用。

2557

被折叠的 条评论
为什么被折叠?



