概念
内存映像,指的是内核在内存中如何存放可执行程序文件。像使用虚拟内存一样,使用内存映像文件同样需要经过保留和提交两个过程,首先在进程内存空间保留一块区域,然后提交物理存储给这段区域(映像)。不同的是物理存储来自于磁盘上的文件,而不是系统的分页文件。也即将磁盘上指定的数据文件作为虚拟内存,这个实现过程被称为文件映像,可以将文件全部或部分映像到进程的地址空间中。文件映像过以后,可以把文件映像的部分当作已全部被载入内存一样的去访问它,这时又称它为内存映像文件。
内存文件映射也是Windows的一种内存管理方法,提供了一个统一的内存管理特征,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问。通过文件映射这种使磁盘文件的全部或部分内容与进程虚拟地址空间的某个区域建立映射关联的能力,可以直接对被映射的文件进行访问,而不必执行文件I/O操作也无需对文件内容进行缓冲处理,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。
应用1. 系统使用内存映像文件载入和执行.EXE和.DLL文件。一方面节省了系统分页文件空间,另一方面缩短了加载应用程序开始执行所需的时间。
2. 使用内存映像文件访问磁盘上的数据文件。绕开对文件实行I/O操作和对文件内容的缓冲,交由操作系统内核去完成。
3. 使用内存映像文件可以实现在多个进程间彼此共享数据。Windows提供了在进程间进行数据通信的其它多种方法。但这些方法也是通过内存映像文件来实现的,所以内存映像文件是实现进程间通信最有效率的方法。
可执行程序文件和内存映像的区别1、可执行程序是位于硬盘上的,而内存映像位于内存上;
2、 可执行程序没有堆栈,因为只有当程序被加载到内存上的时候才会分配相应的堆栈;
3、 执行程序是静态的,因为它还没运行,但是内存映像是动态的,数据是随着运行过程改变的;
内存映像布局Linux下的内存映像布局一般有如下几个段(从低地址到高地址)1:
1) 代码段: 即二进制机器代码,代码段是只读的,可以被多个进程共享;
2) 数据段: 存储已初始化的变量,包括全局变量和初始化了的静态变量;
3) 未初始化数据段: 存储未被初始化的静态变量,也就是BSS段;
4)堆: 用于存放动态分配的变量;
5) 栈: 用于函数调用,保存函数返回值,参数等等;