我们知道,内存映射文件的物理存储器来自磁盘上已有的文件,而不是来自也交换文件。系统在加载exe和dll文件的时候使用的是内存映射文件来载入并运行exe和dll,这样大大节省了页交换文件的空间以及应用程序的启动时间。所以,实际上系统载入exe文件的时候就是利用内存映射文件技术把磁盘中的exe文件映射到内存(实际上,系统只是预定了一块足够大的地址空间来容纳exe文件,一定要注意“预定”这个词,待预定的地址空间区域的具体位置已经在exe文件中指定。默认情况下,exe的基地址为0x00400000.系统也会对这个地址空间的区域进行标注,表明该区域的后备物理存储区来自磁盘上的exe文件,而非来自系统的页交换文件。
以上就是,系统装载可执行文件的时经常被称为“映射到地址空间”的解释了,实际上就是创建了exe文件对应的页交换文件,也就是系统为这个exe文件的执行预定了足够大的地址空间,在x86下为4G的地址空间。
以上是系统加载exe文件的过程,映射到地址空间之后,系统开始执行exe文件的启动代码。完成了这个映射过程后,系统会负责所有的换页(paging),缓存(buffering)以及高速缓存(caching)的操作。例如,如果.exe文件中的代码跳到一个指令地址,但是该地址尚未载入内存,那么会引发一个页错误(page fault)。系统会检测到这个错误并自动将该页代码从文件载入到内存。然后系统会把该内存页映射到进程地址空间中的适合位置,并让线程继续执行,就好像该页代码早就在内存中一样。